Дать ссылку на объект в другом файле, результат не захвачен (узел MCU)

У меня проблемы с предоставлением ссылок в С++ для узла mcu. Я компилирую с помощью Platform IO (я также пробовал Arduino, но у меня были похожие проблемы). Я структурировал свой класс так, как в .h.

class mess_server{
  private:
  public:
  int brerechnung_proz(Kalibrierung& kalibrierung, kali_dat& dat);
  void server_init(Kalibrierung& kalibrierung, kali_dat& dat);
};

в .cpp я объявляю функцию

void mess_server::server_init( Kalibrierung& kalibrierung, kali_dat& dat){
 ...
}

и из main.cpp я вызываю Funktion следующим образом:

...
Mess_server.server_init();
...

когда я пытаюсь скомпилировать это, компилятор выдает мне что-то вроде этого:

src/mess_server.cpp: In lambda function:
  src/mess_server.cpp:63:32: error: 'kalibrierung' is not captured
       dat = kalibrierung.laden();

Я получаю эту ошибку при каждом вызове kalibrierung и/или dat

Что я делаю не так? У меня нет идей.

полный код можно найти здесь: https://github.com/RubiRubsn/Bewaesserungs_Anlage/tree/main/Bewaesserungs%20Anlage%20v2/src


person Ruben Saitz    schedule 08.02.2021    source источник
comment
Не могли бы вы показать немного больше кода? Например, где инициализирован kalibrierung. А также где вы вызываете dat = kalibrierung.laden()?   -  person Darem    schedule 08.02.2021
comment
@Darem Я загрузил код на Github. я вызываю dat=kalibriergung.laden в mess_server.cpp, а kalibrierung инициализируется в Kalibrierung.h github.com/RubiRubsn/Bewaesserungs_Anlage/tree/main/   -  person Ruben Saitz    schedule 08.02.2021
comment
может быть, я что-то упускаю. Но ваш класс Kalibrierung не определяет загруженный метод (Kalibrierung, kali_dat), вы можете вызывать только определенные методы.   -  person Darem    schedule 08.02.2021
comment
@Дарем, да, ты прав, мой плохой. но ошибка все равно есть   -  person Ruben Saitz    schedule 08.02.2021


Ответы (1)


Извините, я сам немного пропустил ошибку.

Проблема в том, что здесь вы используете лямбда-функцию, и ваша переменная неизвестна в лямбда-функции, если вы не ссылаетесь на нее.

server.on("/Kali_nass", HTTP_GET, [](AsyncWebServerRequest *request){
      dat = kalibrierung.laden(); // not captured inside the lambda
      ...
    });

См. раздел Захват переменной внутри лямбды

Итак, вы могли бы сделать что-то вроде этого

server.on("/Kali_nass", HTTP_GET, [&kalibrierung](AsyncWebServerRequest *request){
      dat = kalibrierung.laden(); // captured inside the lambda
    });

Или вы можете захватить все переменные внутри лямбды. Но я не уверен, можно ли переопределить вашу переменную dat her.

server.on("/Kali_nass", HTTP_GET, [&](AsyncWebServerRequest *request){
      dat = kalibrierung.laden(); // captured inside the lambda
    });

Дополнительную информацию о лямбда-выражениях можно найти в документации.

P.S.

Для будущих вопросов о Stackoverflow любой код, необходимый для воспроизведения ошибки, должен быть виден непосредственно в вопросе, а не через GitHub;)

Как создать минимальный воспроизводимый пример

person Darem    schedule 08.02.2021
comment
Спасибо, это сработало для меня :D - person Ruben Saitz; 08.02.2021
comment
и в следующий раз я сделаю свои примеры видимыми в Stackoverflow ^^ - person Ruben Saitz; 08.02.2021