Ответы пользователя по тегу Arduino
  • Как правильно передать в метод массив и получить обратно массив другого размера?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Тебе не нужны new и сырые указатели. Тебе нужен линейный контейнер с хранением элементов в непрерывном блоке памяти. Это будет или std::vector, или std::array.

    Для начала можно остановиться на векторе. Еще одним важным типом будет std::span[?] или gsl::span[?][S] если ты не можешь пользоваться C++20.

    При реализации твоей функции нужно понять, зачем в твою функцию добавлять управление памятью. В общих случаях, если разработчик начинает управлять памятью в вычислительной функции, это говорит о плохо продуманном алгоритме функции. В редких случаях управление памятью может быть технически обосновано. Твой случай не из таких. В нем незачем управлять памятью, это пользы не сделает, а приведет лишь к переусложнению реализации.

    Вот объвление твоей функции: gsl::span<float> Метод( gsl::span<float> values ).
    span - это не владеющий памятью тип, обозначающий участок непрерывной памяти с данными определенного типа. span очень легок и является value type - т.е. создан чтобы его передача по значению не приводила к ощутимым нагрузкам. span конструируется из std::vector, std::array, плоских массивов, std::unique_ptr<[]> и сырых блоков памяти.

    В своей функции тебе стоит работать с памятью values, считая попутно, сколько элементов ты обработал. А для возврата обработанного участка данных тебе будет достаточно вызвать subspan.

    Псевдокод
    std::span<float> Метод( std::span<float> values )
    {
    	size_t processed_count = 0;
    	for( float& element : values )
    	{
    		// ... обработка значений
    		// ... изменение processed_count
    		// ... условия обрыва цикла
    	}
    	
    	return values.subspan( 0, processed_count );
    }
    
    int main()
    {
    	std::vector<float> values{ 7.83f, 14.1f, 20.3f };
    	std::span<float> processed_values = Метод( values );
    	
    	for( const float& value : processed_values )
    	{
    		std::cout << value << ' ';
    	}
    	
    	return 0;
    }
    Ответ написан
    2 комментария
  • Будет ли этот код использоваться при компиляции?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Препроцессор работает на 4-й стадии трансляции кода.
    Препроцессор оперирует напрямую строками модуля трансляции в виде блоков памяти.

    Описание твоего макроса показывает что хоть debug и принимает аргумент, но вне отладочной конфигурации он этим аргументом не оперирует. В любом месте обращения к твоему макросу произойдет подстановка NULL вместо всего обращения.

    На самом деле тебе и этот NULL в качестве подстановки не нужен. Зачем тебе в коде программы обилие висящих NULL? Если описать макрос так:
    #ifdef DEBUG
    #define debug(n) Serial.println("***"+String(n)+"***")
    #else
    #define debug(n)
    #endif

    то препроцессор будет просто затирать строку обращения к макросу.
    Ответ написан
    1 комментарий
  • Что делает оператор ":" в этом случае в c++?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Это называется секцией инициализации. В этой секции можно самостоятельно инициализировать поля создаваемого объекта еще до передачи управления в тело конструктора.

    Еще начиная с C++11 в секции инициализации можно указывать делегирование конструкторов. Выбранный конструктор будет так же выполнен до входа в тело текущего конструктора.
    Ответ написан
    1 комментарий