Отправить строку в функцию внутри класса

Я создал небольшой класс для работы с меню. При создании нового экземпляра я передаю ссылку на объект oled, созданный в main.cpp. Тем не менее, когда я хочу отобразить строку с использованием переменной, она выдает ошибку. Но я могу без проблем передать строку непосредственно в функцию рендеринга. Смотрите комментарии в коде, что работает, а что нет.

#include "Arduino.h"
#include "U8glib.h"
#pragma once

class Menu {
  U8GLIB_SSD1306_128X64& oled;

  public:
    Menu(U8GLIB_SSD1306_128X64& oled): oled(oled) {
      this->oled = oled;
    };
    void render() {
      this->oled.firstPage();
      do {
        String text = "test2";
        this->oled.setFont(u8g_font_unifont);
        this->oled.setPrintPos(0, 20);
        this->oled.drawStr(text); // не работает
        this->oled.drawStr(text.c_str()); // не работает
        this->oled.drawStr("works"); // работает
      } while (this->oled.nextPage());
    }
  };

В случае this->oled.drawStr(text); ошибка:

error: no matching function for call to 'U8GLIB_SSD1306_128X64::drawStr(String&)

В случае this->oled.drawStr(text.c_str()) ошибка:

error: no matching function for call to 'U8GLIB_SSD1306_128X64::drawStr(const char*)

Как создать экземпляр в main.cpp:

U8GLIB_SSD1306_128X64 oled(U8G_I2C_OPT_NONE);
Menu menu(oled);
menu.render();

, 👍2

Обсуждение

Я не могу найти упоминания о функции drawStr в текущей библиотеке U8glib, которая принимает только один параметр. Какую версию вы используете и где вы ее взяли?, @Majenko

Я перешел на u8g2 lib, передал 3 параметра (int int c_str) и все еще получаю ту же ошибку, @Martin Velinský

@MartinVelinský, если вы обновили его, то отредактируйте вопрос и ДОБАВЬТЕ новый код, иначе невозможно правильно ответить, @frarugi87


2 ответа


2

Попробуйте новую версию U8g2lib.

В этой версии вы можете написать такой код:

String t1 = "Grow";
String t2 = "Room";
u8g2.firstPage();
do {
  u8g2.setFont(u8g2_font_logisoso24_tf);
  u8g2.drawStr(32, 24, t1.c_str());
  u8g2.drawStr(32, 60, t2.c_str());
} while(u8g2.nextPage());
,

даже с библиотекой u8g2 я все равно получаю ту же ошибку компиляции, @Martin Velinský


0

Забудьте о классе String. Он тратит память в системе, которая уже ограничена памятью. Определите свои строки как const char *, и у вас не будет никаких проблем.

const char* t1 = "Grow";
const char* t2 = "Room";
u8g2.firstPage();
do {
  u8g2.setFont(u8g2_font_logisoso24_tf);
  u8g2.drawStr(32, 24, t1);
  u8g2.drawStr(32, 60, t2);
} while(u8g2.nextPage());
,