Как передать текстовый аргумент в функцию ?

Тема в разделе "Arduino & Shields", создана пользователем Ariadna-on-Line, 25 сен 2023.

  1. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Нужен вывод строки символов - LCD_print("Ariadna"). Аппаратно существует только функция вывода ОДНОГО символа - LCD_Write(byte). Очевидно требуется циклически в нее передавать в виде аргумента символы строки. Не получается это сделать.
    Код (C++):
    void setup() {
    LCD_print("Ariadna");  //Здесь может быть любой текст.
    }
    //======
    void loop() {
    }
    //======
    void LCD_print(string) {               //Функция исполнения должна этот текст принять и обработать
    Serial.print(string);                      //Заодно и "поделиться" текстом с "родственной" функцией.
    ......
    for (i =0; i<stringLength; i++) {    //Повторяем процедуру над каждым символом строки.
    LCD_Write(byte(i));                    //Выводим очередной символ строки
    }
    }
     
    Уважаемые гуру. Как синтаксически правильно все оформить чтоб работало ? А если не затруднит - приведите требуемый код. С уважением.
     
    Последнее редактирование: 25 сен 2023
  2. ИгорьК

    ИгорьК Гуру

    Выскажу предположение, что перебирать в функции и закидывать на печать надо не "byte(i)" а "charAt()"

    Про код не скажу, это я не умею.
     
  3. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Транспортной функции ( LCD_Write(byte()) абсолютно побоку как обозвать байты данных. Надо чтобы байты из строки шли по очереди. А я не знаю как синтаксически корректно выбирать эти байты по очереди.
    ПС. Я схемотехник, но ни разу не программист.
     
    Последнее редактирование: 26 сен 2023
  4. DetSimen

    DetSimen Гуру

    Ну можешь так передать
    void LCD_print(const String &str);
     
    Asper Daffy и User248 нравится это.
  5. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Блин, убил пол-дня. Оказалось просто -
    LCD_print("Ariadna"); // Использовать всегда только двойные апострофы
    //==============
    void LCD_print(char* str) { //Только так

    char *ptrB = (char*)str;
    for (int i = 0; i < strlen(str); i++) {
    char z = *(ptrB + i);
    LCD_Write(z);
    }
    }
    //------------------------
    Всё. Осталось нарисовать последнюю функцию из стандартных - создание символов.
    Вопрос: Какие еще функции желательно бы добавить в библиотеку ?
     
    Последнее редактирование: 26 сен 2023
  6. b707

    b707 Гуру

    можно проще
    Код (C++):
    void LCD_print(char* str) { //Только так

    char *ptrB = (char*)str;
    while (*ptrB) {
       LCD_Write((char) *ptrB);
       ptrB++;
    }
    }
     
    Ariadna-on-Line нравится это.
  7. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Верно. Короче на 36 байт. Где вы раньше были))).
    ПС. Участник OKF прислал еще проще.

    void LCD_print(char* str) {
    while (*str)
    LCD_Write(*str++);
    }
    Тоже работает. Тоже на 36 байт короче моего.
     
    Последнее редактирование: 27 сен 2023
  8. Un_ka

    Un_ka Гуру

    А в такую функцию можно передать такой указатель, чтобы не было выхода из цикла while?
    Код (C++):
    void LCD_print(char* str) {
    while (*str)
    LCD_Write(*str++);
    }
     
  9. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Этот вопрос - к Филину
     
    Последнее редактирование: 27 сен 2023
  10. parovoZZ

    parovoZZ Гуру

    если строка заканчивается терминальным нулём, то можно. Если строка просто массив байтов, то нет.
     
    Asper Daffy нравится это.
  11. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Я думаю что можно. Но с непредсказуемыми результатами.