[RISOLTO] ESP8266, char* e char*[] - Numero di elementi

Ciao a tutti

Risolvendo un piccolo difetto nell'orologio NTP a matrici di LED che ho realizzato tempo fa, ho anche provato a sostituire le variabili contenenti SSID e pwd con due matrici dello stesso tipo e un for.
Non capisco perché così non si connette più alla rete WiFi... Forse il problema è con strcmp?...
Le parti tra /* e */ sono quelle della versione funzionante, escluse per provare con le matrici e il for.
Mi potete aiutare?

Grazie
Gianluca

const char* ssid[] = {"ReteMiaTP", "Retemia A5", "Guest"};
const char*  pwd[] = {"pippo",     "pippo",      ""     };

/*
char *ssid1 = "ReteMiaTP";  char  *pwd1 = "pippo";
char *ssid2 = "Retemia A5"; char  *pwd2 = "pippo";
char *ssid3 = "Guest";      char  *pwd3 = "";
char *ssid4 = " ";          char  *pwd4 = " ";
char *ssid5 = " ";          char  *pwd5 = " ";
char *ssid6 = " ";          char  *pwd6 = " ";
char *ssid7 = " ";          char  *pwd7 = " ";
char *ssid8 = " ";          char  *pwd8 = " ";
char *ssid9 = " ";          char  *pwd9 = " ";
*/

void WiFiScan()
{
byte n_ssid=0;
byte n=WiFi.scanNetworks();
if(prima_conn_ok) scrive_orario();
memset(id,'\0',sizeof(id));

for (byte i=0; i<n; ++i) // WiFi.SSID(i) è un oggetto String, che deve essere convertito per poter essere confrontato con un char*.
  {     
  strcpy(id, WiFi.SSID(i).c_str()); // WiFi.SSID(i) è un oggetto String, che deve essere convertito per poter essere conrontato con un char*.
for (byte z=0; z<sizeof(ssid)/sizeof(char); z++) // Non funziona nemmeno provando con solo z<4!
    {
    if(!strcmp(id, ssid[z])) {WiFi.begin(ssid[z], pwd[z]); n_ssid=z+1; break;}
    }
  
 /*    if (!strcmp(id,ssid1)) {WiFi.begin(ssid1,pwd1); n_ssid=1; break;}
  else if (!strcmp(id,ssid2)) {WiFi.begin(ssid2,pwd2); n_ssid=2; break;}
  else if (!strcmp(id,ssid3)) {WiFi.begin(ssid3,pwd3); n_ssid=3; break;}
  else if (!strcmp(id,ssid4)) {WiFi.begin(ssid4,pwd4); n_ssid=4; break;}
  else if (!strcmp(id,ssid5)) {WiFi.begin(ssid5,pwd5); n_ssid=5; break;}
  else if (!strcmp(id,ssid6)) {WiFi.begin(ssid6,pwd6); n_ssid=6; break;}
  else if (!strcmp(id,ssid7)) {WiFi.begin(ssid7,pwd7); n_ssid=7; break;}
  else if (!strcmp(id,ssid8)) {WiFi.begin(ssid8,pwd8); n_ssid=8; break;}
  else if (!strcmp(id,ssid9)) {WiFi.begin(ssid9,pwd9); n_ssid=9; break;}
*/
... ... ...
}

Così si connette:
if(!strcmp(id, ssid[0])) {WiFi.begin(ssid[0], pwd[0]); n_ssid=0+1; break;}
quindi la matrice funziona...

Non è un errore di forma... Funziona fino a z<3!

for (byte z=0; z<2; z++) // FUNZIONA!
// Non funziona con z<4 o numeri superiori, ma funziona con z<1, z<2 e z<3!
    {
    if(!strcmp(id, ssid[z])) {WiFi.begin(ssid[z], pwd[z]); n_ssid=z+1; break;}
    }

Neanche un delay(1000) nel for risolve il problema.

Inoltre, riconoscendo strcmp la SSID[0], il break dovrebbe interrompere il for, quindi non dovrebbe arrivare a 1 o 2 o 3 o 4!...
Ooops... già con z=3 sto fuori dall'array!

E' sbagliato

sizeof(ssid)/sizeof(char);

Io devo contare il numero di stringhe presenti nell'array!

Ecco la soluzione! (ma non è stato affatto facile trovarla!...)
for (byte z=0; z<sizeof(ssid)/sizeof(char*); z++)

Thanks, econjack! :slight_smile: