Passage d'un pointeur de tableau de charactères en paramètres

Bonjour
J'ai une fonction de connexion au wifi avec le code suivant :

#include <ESP8266WiFi.h>

char *ssid[] = {"Livebox-1", "Livebox-2", "Livebox-3", "Livebox-4", "Livebox-5", "Livebox-6"}; //Array
containing any wifi networks the device can use
char *pass[] = {"xxxxxx", "xxxxxx", "xxxxxx", "xxxxxx", "xxxxxx", "xxxxxx"}; //Array containing associated wifi passwords

void WIFI_Connect()
{
...
WiFi.disconnect();
WiFi.begin(ssid[w], pass[w]);
...
}

J'ai déporté cette fonction dans une librairie pour pouvoir la réutiliser dans différents projets.
Seulement j'aimerais que l'affectation du char *ssid et du char *pass se fasse dans le programme principal qui fera appel à la librairie.

J'ai donc mis les lignes suivantes dans mon main.cpp :
char *ssid[] = {"Livebox-1", "Livebox-2", "Livebox-3", "Livebox-4", "Livebox-5", "Livebox-6"};
char *pass[] = {"xxxxxx", "xxxxxx", "xxxxxx", "xxxxxx", "xxxxxx", "xxxxxx"};

Seulement je ne sais pas comment passer ces 2 variables en paramètres de ma fonction connect(?, ?) que j'appelle dans le void setup() de mon main.cpp. Idem je ne sais pas quoi mettre comme définition de paramètres dans ma librairie pour ma fonction void connect(?, ?)

Merci de votre aide

Bonjour,

Tout simplement comme ceci:

void WIFI_Connect(int w, char *pssid[], char *ppass[])
{
  WiFi.disconnect();
  WiFi.begin(pssid[w], ppass[w]);
  // ...
}

Merci Kamill pour ta réponse
OK pour la déclaration de la fonction void WIFI_Connect(int w, char *pssid[], char *ppass[]) dans ma librairie, mais comment tu ferais appel à cette fonction dans le setup() du main.cpp

main.cpp :
...
#include<malibrairiewifi.h>

char *ssid[] = {"Livebox-1", "Livebox-2", "Livebox-3", "Livebox-4", "Livebox-5", "Livebox-6"};
char *pass[] = {"xxxxxx", "xxxxxx", "xxxxxx", "xxxxxx", "xxxxxx", "xxxxxx"};

void setup()
{
WIFI_Connect(??, ??);
}

Merci

appel:

WIFI_Connect(w, ssid, pass);

Autre méthode

définition

void WIFI_Connect(char *ss, char *pwd)
{
 WiFi.disconnect();
 WiFi.begin(ss,pwd);
 // ...
}

appel:

WIFI_Connect(ssid[w],pass[w]);

J'avais essayé de mon côté ta première proposition et ça fonctionne.
Dans mon cas le w est interne à la fonction WIFI_Connect car elle teste les ssid les uns après les autres tant qu'elle n'arrive pas à se connecter.

Pour ton autre méthode dans mon cas ça serait ça ?

void WIFI_Connect(char *ss, char *pwd)
{
WiFi.disconnect();
WiFi.begin(ss,pwd);
// ...
}

WIFI_Connect(ssid[],pass[]);

Je ne comprends pas trop la différence entre :
void WIFI_Connect(char *ss[], char *pwd[])
et
void WIFI_Connect(char *ss, char *pwd)

Merci

Hello.
Perso je mettrai un const char dans le prototype pour éviter de changer toute variable dans le tableau ?
C'est pas plus propre ? :-/

effectivement ça serait plus propre
Merci

bigorne:
Je ne comprends pas trop la différence entre :
void WIFI_Connect(char *ss[], char *pwd[])
et
void WIFI_Connect(char *ss, char *pwd)

Dans le premier cas tu passes les tableaux -> tu détermines le ssid et password dans la fonction WIFI_Connect
Dans le deuxième cas tu passes directement le ssid et le password -> tu dois les avoir déterminés avant l'appel

Merci pour le retour
J'ai un autre pb sur une opération de comptage d'éléments de mon tableau ssid
Voici le code :

main.cpp :
...
#include<malibrairiewifi.h>

char *ssid[] = {"Livebox-1", "Livebox-2", "Livebox-3", "Livebox-4", "Livebox-5", "Livebox-6"};
char *pass[] = {"xxxxxx", "xxxxxx", "xxxxxx", "xxxxxx", "xxxxxx", "xxxxxx"};

void setup()
{
WIFI_Connect(ssid, pass);
}

malibrairiewifi.cpp :

#include <ESP8266WiFi.h>

void WIFI_Connect(char *ssid[], char *pass[])
{
...
#define SSID_COUNT (sizeof(ssid) / sizeof(ssid[0]))
...
WiFi.disconnect();
WiFi.begin(ssid[w], pass[w]);
...
}

Avant le #define SSID_COUNT (sizeof(ssid) / sizeof(ssid[0])) était dans le main.cpp juste apres la déclaration du tableau char *ssid[] et ça fonctionne bien avec SSID_COUNT = 6

Je souhaite effectuer cette action dans la fonction WIFI_Connect de ma librairie comme dans le code ci-dessus. Si je fais cela, j'obtiens SSID_COUNT = 1 car sizeof(ssid) = 4 et sizeof(ssid[0]) = 4

Merci de vos retours

Mets ton code entre balises Code STP.

Dans ta définition de ta fonction WIFI_Connect, tu utilises des noms pour les paramètres formels qui sont les mêmes que ceux de tes tableaux globaux. Ce n'est pas une bonne pratique, car tu te fais des noeuds plus facilement !
Je te propose

char *ssid[] = {"Livebox-1", "Livebox-2", "Livebox-3", "Livebox-4", "Livebox-5", "Livebox-6"};
char *pass[] = {"xxxxxx", "xxxxxx", "xxxxxx", "xxxxxx", "xxxxxx", "xxxxxx"};
.../...
void WIFI_Connect(char *tabS[], char *tabP[])
{
...
#define SSID_COUNT (sizeof(ssid) / sizeof(ssid[0]))
...
WiFi.disconnect();
WiFi.begin(tabS[w], tabP[w]);
...
}

Tu peux mettre d'autres noms si tu veux.

Ce qui se passe avec ton code actuel, c'est qu'à l'intérieur de la fonction, le compilateur considère que ssid est le paramètre passé en argument, et non pas le tableau global (priorité aux arguments en cas de doute). Pareil pour pass. Et rien ne lui dit quelle est la taille de ces tableaux. D'où l'erreur.
De toutes façons tu peux placer ton #define SSID_COUNT en début de listing, ça n'amène rien de fonctionnel le cacher dans la fonction.

C'est normal car WIFI_Connect() ne connait pas la taille du tableau

Tu peux

  • soit déclarer la taille dans les paramètres de WIFI_Connect()
    void WIFI_Connect(char *ssid[6], char *pass[6])
    mais ce n'est pas très indiqué car WIFI_Connect ne pourra traiter que des tableaux de 6 éléments

  • soit passer la taille des tableaux à WIFI_Connect()

Bien que ce ne soit pas interdit il est déconseillé d'utiliser le mêmes noms dans les paramètres d'une fonction que le nom des variables globales. Ca prête à confusion.

Mes ton code entre balises de code

Merci beaucoup pour vos réponses
Je vais corriger tout ça en passant la taille du tableau en paramètres et en changeant le noms de mes paramètres.
Merci