Jump to content

    
Sign in to follow this  
Метценгерштейн

ошибка при компиляции С++

Recommended Posts

Уже не первая тема от меня с текущим проектом, но надо продолжать.

Модуль ESP32, надо сделать обработку эвентов при коннектах и подключениях.

Вот что дает в качестве примера производитель нам.

/*
 *  This sketch shows the WiFi event usage
 *
*/

/* 
* WiFi Events

SYSTEM_EVENT_WIFI_READY               < ESP32 WiFi ready
SYSTEM_EVENT_SCAN_DONE                < ESP32 finish scanning AP
SYSTEM_EVENT_STA_START                < ESP32 station start
SYSTEM_EVENT_STA_STOP                 < ESP32 station stop
SYSTEM_EVENT_STA_CONNECTED            < ESP32 station connected to AP
SYSTEM_EVENT_STA_DISCONNECTED         < ESP32 station disconnected from AP
SYSTEM_EVENT_STA_AUTHMODE_CHANGE      < the auth mode of AP connected by ESP32 station changed
SYSTEM_EVENT_STA_GOT_IP               < ESP32 station got IP from connected AP
SYSTEM_EVENT_STA_LOST_IP              < ESP32 station lost IP and the IP is reset to 0
SYSTEM_EVENT_STA_WPS_ER_SUCCESS       < ESP32 station wps succeeds in enrollee mode
SYSTEM_EVENT_STA_WPS_ER_FAILED        < ESP32 station wps fails in enrollee mode
SYSTEM_EVENT_STA_WPS_ER_TIMEOUT       < ESP32 station wps timeout in enrollee mode
SYSTEM_EVENT_STA_WPS_ER_PIN           < ESP32 station wps pin code in enrollee mode
SYSTEM_EVENT_AP_START                 < ESP32 soft-AP start
SYSTEM_EVENT_AP_STOP                  < ESP32 soft-AP stop
SYSTEM_EVENT_AP_STACONNECTED          < a station connected to ESP32 soft-AP
SYSTEM_EVENT_AP_STADISCONNECTED       < a station disconnected from ESP32 soft-AP
SYSTEM_EVENT_AP_PROBEREQRECVED        < Receive probe request packet in soft-AP interface
SYSTEM_EVENT_GOT_IP6                  < ESP32 station or ap or ethernet interface v6IP addr is preferred
SYSTEM_EVENT_ETH_START                < ESP32 ethernet start
SYSTEM_EVENT_ETH_STOP                 < ESP32 ethernet stop
SYSTEM_EVENT_ETH_CONNECTED            < ESP32 ethernet phy link up
SYSTEM_EVENT_ETH_DISCONNECTED         < ESP32 ethernet phy link down
SYSTEM_EVENT_ETH_GOT_IP               < ESP32 ethernet got IP from connected AP
SYSTEM_EVENT_MAX
*/

#include <WiFi.h>

const char* ssid     = "your-ssid";
const char* password = "your-password";


void WiFiEvent(WiFiEvent_t event)
{
    Serial.printf("[WiFi-event] event: %d\n", event);

    switch (event)
    {
    case SYSTEM_EVENT_STA_GOT_IP:
        Serial.println("WiFi connected");
        Serial.println("IP address: ");
        Serial.println(WiFi.localIP());
        break;
    case SYSTEM_EVENT_STA_DISCONNECTED:
        Serial.println("WiFi lost connection");
        break;
    }
}

void WiFiGotIP(WiFiEvent_t event, WiFiEventInfo_t info)
{
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(IPAddress(info.got_ip.ip_info.ip.addr));
}

void setup()
{
    Serial.begin(115200);

    // delete old config
    WiFi.disconnect(true);

    delay(1000);

    // Examples of diffrent ways to register wifi events
    WiFi.onEvent(WiFiEvent);
    WiFi.onEvent(WiFiGotIP, WiFiEvent_t::SYSTEM_EVENT_STA_GOT_IP);
    WiFiEventId_t eventID = WiFi.onEvent([](WiFiEvent_t event, WiFiEventInfo_t info){
        Serial.print("WiFi lost connection. Reason: ");
        Serial.println(info.disconnected.reason);
    }, WiFiEvent_t::SYSTEM_EVENT_STA_DISCONNECTED);

    // Remove WiFi event
    Serial.print("WiFi Event ID: ");
    Serial.println(eventID);
    // WiFi.removeEvent(eventID);

    WiFi.begin(ssid, password);

    Serial.println();
    Serial.println();
    Serial.println("Wait for WiFi... ");
}

void loop()
{
    delay(1000);
}

 

Есть ф-я 

void WiFiEvent(WiFiEvent_t event)

и передаем ее при инициализации:

WiFi.onEvent(WiFiEvent);

WiFi- это класс, что в хидере.

 

Я в своем проекте делаю почти тоже самое, только класс wifi- отнаследован от WiFi.

wifi.onEvent(WiFiEvent);

и компилятор выдает ошибку:

...t.cpp:48:27: error: invalid use of non-static member function
     wifi.onEvent(WiFiEvent);
  

Share this post


Link to post
Share on other sites
7 минут назад, Метценгерштейн сказал:

WiFi.onEvent(WiFiEvent);

WiFi- это класс, что в хидере.

 

Если WiFi - класс, то к нему нельзя использовать оператор '.'

Оператор '.' используется для экземпляров класса.

RTFM

Share this post


Link to post
Share on other sites

Да, это уже не первая ваша тема, и во всех темах вы приводите кучу мусора, не относящегося к делу, и не приводите ничего, что бы к делу относилось.

Share this post


Link to post
Share on other sites
2 hours ago, Метценгерштейн said:

класс wifi - отнаследован от WiFi.

wifi.onEvent(WiFiEvent);

Так все же что такое у вас wifi :

- имя класса

- имя объекта некоторого (какого-то вашего самописного, унаследованного от WiFi) класса ?

Если имя класса - то такой синтаксис неправильный, и на него, скорее всего, ругается компилятор.

Метод класса должен вызываться от имени объекта, а не от имени класса.

То же самое и с WiFi - определитесь окончательно, класс это или объект класса. А то всех запутали. То у вас WiFi - это класс, то объект.

Просто будьте точны в терминологии.

Edited by Darth Vader

Share this post


Link to post
Share on other sites
38 minutes ago, Darth Vader said:

Метод класса должен вызываться от имени объекта, а не от имени класса.

Статический метод может так вызываться.

имя_класса.статический_метод(...)

Книги - великая вешь, если умеешь читать (это для ТС)

Share this post


Link to post
Share on other sites
19 minutes ago, x893 said:

Статический метод может так вызываться.

имя_класса.статический_метод(...)

Книги книгами, а ссылку на Language Reference Manual можете дать?

Вроде как для вызова статических методов нужен scope resolution operator, т.е.:
 

ClassName::static_method()

А вашу книгу, похоже, нужно выбросить.
 

Share this post


Link to post
Share on other sites
59 minutes ago, Darth Vader said:

определитесь окончательно

Ну вроде б очевидно, что вместе с чтением постов надо смотреть в хрустальный шар и гуглить по ключевым словам.

Код из первого сообщения похож на официальный пример: https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/examples/WiFiClientEvents/WiFiClientEvents.ino
Можно предположить, что он работает.

Какой магией при подключении wifi.h подтягивается соотв. кусок BSP - я не знаю. Изучение ESP в планах есть, но всё никак руки не дойдут...

Share this post


Link to post
Share on other sites

Добрый день. Вопрос немного не в тему, но везде в описаниях написано, что ESP32 содержит на борту CAN. Но не в одном мануале я не обнаружил даже следов. Что это, массовый русскоязычный копи-паст? Или я не внимательно смотрю?

Share this post


Link to post
Share on other sites
6 hours ago, x893 said:

Пора пересилить себя и прочитать

Пожалуйста, из этой книги, приведите мне абзац, где есть ответ на мой вопрос- почему ошибка. Иначе- это просто с понтом дела пост был. Что по факту и есть.

5 hours ago, one_eight_seven said:

Да, это уже не первая ваша тема, и во всех темах вы приводите кучу мусора, не относящегося к делу, и не приводите ничего, что бы к делу относилось.

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

 

5 hours ago, Darth Vader said:

То же самое и с WiFi - определитесь окончательно, класс это или объект класса. А то всех запутали. То у вас WiFi - это класс, то объект.

Просто будьте точны в терминологии.

Согласен. Путаницу внес.

Имеем вот что- пример от производителя:

WiFi.onEvent(WiFiEvent);

WiFi.begin(ssid, password);

где WiFi - это ....

в файле WiFi.h

описан класс WiFiClass

и в .cpp сразу сделан его объект

WiFiClass WiFi;

в файле WiFi.h 

extern WiFiClass WiFi;

поэтому в примере данном, обращение WiFi.onEvent(WiFiEvent); к объекту класса вполне валидное.

Но так у меня тоже не работает. Если я делаю такое же обращение - передаю адрес ф-ии как параметр.

У меня же определен свой объект этого класса.

WiFiClass wifi;

(всё маленькими wifi)

И работает wifi и подключение и прочее. Вызываются методы класса

Например, wifi.begin(i_ssid, i_password);

Всё компилится, все работает. С объектом класса нет проблем.

Начал развивать проект, и не могу передать wifi.onEvent(WiFiEvent);

ошибка

Share this post


Link to post
Share on other sites
41 минуту назад, SSerge сказал:

Да вроде бы есть у неё CAN, впрочем я не проверял.

https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/can.html

Да, это уже тоже нашел.... Спасибо.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this