Ошибка компиляции ESP32 scanNetworks: вызов перегруженного 'BSSID(int)' неоднозначен

Я пытаюсь запустить следующий код:

#include <WiFi.h>

void setup() {
 
  //int16_t scanNetworks(bool async = false, bool show_hidden = false, bool passive = false, uint32_t max_ms_per_chan = 300, uint8_t channel = 0, const char * ssid=nullptr, const uint8_t * bssid=nullptr);
  int n = WiFi.scanNetworks(true, false, false, 5, 7, "HTM");
    
  Serial.begin(115200);
    
  delay(10);  // Minimum 10 milliseonds delay required to reliably receive message from Gateway.
     
      
      
      for (int i = 0; i < 4; i++) 
     {
      uint8_t values[4];
      values[i] = WiFi.BSSID(0)[i];
      
     }
}  
void loop() { }     

но я получаю ошибку компиляции Arduino (вызов перегруженного 'BSSID(int)' неоднозначен):

C:\Users\ebhynes\AppData\Local\Temp\arduino_modified_sketch_647803\sketch_apr04a.ino: In function 'void setup()':
sketch_apr04a:17:29: error: call of overloaded 'BSSID(int)' is ambiguous
   17 |       values[i] = WiFi.BSSID(0)[i];
      |                   ~~~~~~~~~~^~~
In file included from C:\Users\ebhynes\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.2.0\libraries\WiFi\src/WiFi.h:34,
                 from C:\Users\ebhynes\AppData\Local\Temp\arduino_modified_sketch_647803\sketch_apr04a.ino:1:
C:\Users\ebhynes\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.2.0\libraries\WiFi\src/WiFiSTA.h:171:12: note: candidate: 'uint8_t* WiFiSTAClass::BSSID(uint8_t*)'
  171 |   uint8_t *BSSID(uint8_t *bssid = NULL);
      |            ^~~~~
In file included from C:\Users\ebhynes\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.2.0\libraries\WiFi\src/WiFi.h:36:
C:\Users\ebhynes\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.2.0\libraries\WiFi\src/WiFiScan.h:52:12: note: candidate: 'uint8_t* WiFiScanClass::BSSID(uint8_t, uint8_t*)'
   52 |   uint8_t *BSSID(uint8_t networkItem, uint8_t *bssid = NULL);
      | 

Какое решение?

, 👍1

Обсуждение

values[i] = WiFi.BSSID( ((uint8_t) 0)[i]; чтобы устранить неоднозначность. Это не ваша ошибка. У них неправильный дизайн API., @Juraj

@Juraj Допустим, в C++ есть ошибка проектирования, из-за которой 0 становится целым числом **и** указателем. :-D Проблема возникает только из-за литерального значения 0. Однако хороший API постарается обойти это., @the busybee


1 ответ


2

Вот немного сокращённая версия сообщения об ошибке. Если вы возьмёте время прочитать его внимательно, он должен намекнуть вам на происхождение проблема:

error: call of overloaded 'BSSID(int)' is ambiguous

candidate: uint8_t *BSSID(uint8_t *bssid = NULL);
candidate: uint8_t *BSSID(uint8_t networkItem, uint8_t *bssid = NULL);

Это означает, что метод ожидает в качестве параметров:

  • либо необязательный указатель (по умолчанию NULL), который является подпись первого кандидата

  • или число uint8_t, за которым может следовать указатель (по умолчанию на NULL), что является вторым кандидатом.

Поскольку вы вызвали его с единственным параметром 0, который является int, компилятор не знает, имелось ли в виду, что этот параметр должен быть указатель (первый кандидат) или uint8_t (второй кандидат).

Решение — явно указать тип. Предположительно:

values[i] = WiFi.BSSID(uint8_t(0))[i];
,