ребята , создаю функцию для вывода данных на lcd дисплей. void scrindisplay (int k, int l, ... m){ lcd.setCursor( k, l ); lcd.print(m); } вопрос в следующем, какой тип данных должен быть у переменной (m), чтоб я мог на её место передавать, как строчные значения, числовые переменные, так и функции типа time? или может есть еще какой способ написать такую функцию. в итоге хочу вместо lcd.setCursor( ); lcd.print(); писать функцию в которую буду передавать координаты начала строки на дисплее, и то что я хочу передать на это место. по типу: void scrindisplay (0,2 ,time); или void scrindisplay (0,2 ,"введите значение"); или void scrindisplay (0,2 ,button);
ну это надо смотреть по типу в функции lcd.print(m); - это же не ваша функция, а откуда-то (из какой-то библиотеки), вот там и надо смотреть, каким типом данных можно эту ф-ю нагрузить. Или lcd.print() - ваша функция? Непонятно из контекста, если ф-я ваша, то что хотите, то и сделаете.
я хочу заменить 2 строки на одну, вместо двух строчек lcd.setCursor( 0, 2 ); lcd.print(time); в скетче создать функцию в которую я бы передавал координаты 0 и 2 и то что я хочу написать, в данном случае time. но в функции мне нужно определить эти переменные например void scrindisplay (int k, int l, ... m){ lcd.setCursor( k, l ); lcd.print(m); } так вот мне не понятно какой тип переменной должен быть у m чтоб она хавала и строки и переменные или я не правильно делаю функцию?
указатель на string cкорее всего, но все же непонятно - lcd.print () - это уже готовая ф-я или это написанная вами функция? Если первое, то только тот тип, что задан в дефайне этой ф-ии, если второе- то я бы сделал указатель на string
в библиотеке которую я использую в файле h есть следующие строки в которых упоминается uint8_t это такой тип? это и есть тот тип который мне нужно указать для моей переменной m? class LiquidCrystal : public Print { public: LiquidCrystal(uint8_t rs, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7); LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7); LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3); LiquidCrystal(uint8_t rs, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3);
покопавшись нашел что в RTC тип данных time это char* таким образом если в обычной практике вывод времени на дисплей осуществляется путем lcd.setCursor(7,0 ); lcd.print(time); то создав функцию scrindisplay можем заменить две строки в коде на одну по типу: void loop { scrindisplay ( 7, 0, time); } void scrindisplay ( int k, int l,char* m){ lcd.setCursor(k,l ); lcd.print(m); } но как сделать так чтоб переменной m можно было передавать не только тип данных char*, но и int и String?
ну да, почти как я полагал - указатель на массив char, в принципе это то же, что указатель на строку char* это и есть string, почти. int конвертнуть функцией sprint(), вроде есть такая в ардуине.
В языке C -- ни как. В языке C++ можно воспользоваться шаблонами. Но Вы должны понимать, что для каждого типа переменной 'm' на основе шаблона будет создана отдельная функция (со всеми вытекающими затратами flash памяти). Иными словами работу по copy/paste кода функции с заменой типа переменной 'm' берёт на себя компилятор C++.
1) Написать несколько функций под каждый тип переменной. 2) Наколхозить вариантный тип на struct и union. 3) То же самое на шаблонах.