Help sur les .CPP et .h

Hello,
Mon projet sur ESP32 commence à devenir un peu complexe et je me suis donc décidé à le réécrire en créant des "bibliothéques". j'ai regardé plusieurs tuto, je me suis bien renseigné mais ça ne compile toujours pas, je ne comprends pas pourquoi....
j'ai essayé juste de creer un fichier pour le wifi. Mon code fonctionne bien si tout est dans le fichier ino principal.
Si quelqu'un a une idée....
Merci!

Mon fichier principal :

#include "wificonnect.h"

void setup() {
  Serial.begin(115200);
  wificonnect();
}
void loop() {
  // put your main code here, to run repeatedly:
}

Mon header wificonnect.h

#ifndef WIFICONNECT_H
#define WIFICONNECT_H

extern const char* ssid       = "XXXX";
extern const char* password   = "XXXXX";

wificonnect()

#endif

Mon fichier wificonnect.cpp

#include <Arduino.h>
#include "wificonnect.h"
#include <WiFi.h> 

void wificonnect() (
      //connect to WiFi
  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
  }
  Serial.println(" CONNECTED");
  Serial.print("Adresse IP: ");
  Serial.println(WiFi.localIP()); 

)

Ne postez pas des questions techniques dans le bar. Je déplace votre post.

————-

Le .h doit déclarer les variables et fonctions donc écrire


void wificonnect();

Et juste


extern const char* ssid;

Pour ces déclarations (idem bien sûr pour toutes les fonctions et variables partagées)

Dans le .cpp il manque la définition des constantes

Merci pour la reponse , j'ai fait ces modifications mais ca ne marche toujours pas...
Voici ce que me dit mon compilateur:

/Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/Test_CPP_wifi.ino:4:1: error: expected initializer before 'void'
    4 | void setup() {
      | ^~~~
/Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/Test_CPP_wifi.ino: In function 'void setup()':
/Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/Test_CPP_wifi.ino:6:3: error: 'wificonnect' was not declared in this scope
    6 |   wificonnect();
      |   ^~~~~~~~~~~
In file included from /Users/julienlegrand/Library/Arduino15/packages/esp32/tools/esp32-arduino-libs/idf-release_v5.1-33fbade6/esp32/include/esp_wifi/include/esp_private/esp_wifi_types_private.h:22,
                 from /Users/julienlegrand/Library/Arduino15/packages/esp32/tools/esp32-arduino-libs/idf-release_v5.1-33fbade6/esp32/include/esp_wifi/include/esp_wifi_types.h:11,
                 from /Users/julienlegrand/Library/Arduino15/packages/esp32/hardware/esp32/3.0.5/libraries/WiFi/src/WiFiType.h:27,
                 from /Users/julienlegrand/Library/Arduino15/packages/esp32/hardware/esp32/3.0.5/libraries/WiFi/src/WiFi.h:32,
                 from /Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/wificonnect.cpp:3:
/Users/julienlegrand/Library/Arduino15/packages/esp32/tools/esp32-arduino-libs/idf-release_v5.1-33fbade6/esp32/include/esp_hw_support/include/esp_interface.h:14:1: error: expected initializer before 'extern'
   14 | extern "C" {
      | ^~~~~~
/Users/julienlegrand/Library/Arduino15/packages/esp32/tools/esp32-arduino-libs/idf-release_v5.1-33fbade6/esp32/include/esp_wifi/include/esp_wifi_types.h:30:19: error: 'ESP_IF_WIFI_STA' was not declared in this scope
   30 |     WIFI_IF_STA = ESP_IF_WIFI_STA,
      |                   ^~~~~~~~~~~~~~~
/Users/julienlegrand/Library/Arduino15/packages/esp32/tools/esp32-arduino-libs/idf-release_v5.1-33fbade6/esp32/include/esp_wifi/include/esp_wifi_types.h:31:19: error: 'ESP_IF_WIFI_AP' was not declared in this scope; did you mean 'ESP_ERR_WIFI_BASE'?
   31 |     WIFI_IF_AP  = ESP_IF_WIFI_AP,
      |                   ^~~~~~~~~~~~~~
      |                   ESP_ERR_WIFI_BASE
/Users/julienlegrand/Library/Arduino15/packages/esp32/tools/esp32-arduino-libs/idf-release_v5.1-33fbade6/esp32/include/esp_wifi/include/esp_wifi_types.h:33:19: error: 'ESP_IF_WIFI_NAN' was not declared in this scope; did you mean 'ESP_ERR_WIFI_BASE'?
   33 |     WIFI_IF_NAN = ESP_IF_WIFI_NAN,
      |                   ^~~~~~~~~~~~~~~
      |                   ESP_ERR_WIFI_BASE
/Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/wificonnect.cpp:5:1: error: 'ssid' does not name a type
    5 | ssid       = "XXXXX";
      | ^~~~
/Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/wificonnect.cpp:6:1: error: 'password' does not name a type
    6 | password   = "XXXX";
      | ^~~~~~~~
/Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/wificonnect.cpp:9:20: error: initializer provided for function
    9 | void wificonnect() (
      |                    ^
/Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/wificonnect.cpp:12:3: error: 'WiFi' does not name a type
   12 |   WiFi.begin(ssid, password);
      |   ^~~~
/Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/wificonnect.cpp:13:3: error: expected unqualified-id before 'while'
   13 |   while (WiFi.status() != WL_CONNECTED) {
      |   ^~~~~
In file included from /Users/julienlegrand/Library/Arduino15/packages/esp32/hardware/esp32/3.0.5/cores/esp32/Arduino.h:200,
                 from /Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/wificonnect.cpp:1:
/Users/julienlegrand/Library/Arduino15/packages/esp32/hardware/esp32/3.0.5/cores/esp32/HardwareSerial.h:356:16: error: 'Serial0' does not name a type; did you mean 'Serial'?
  356 | #define Serial Serial0
      |                ^~~~~~~
/Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/wificonnect.cpp:17:3: note: in expansion of macro 'Serial'
   17 |   Serial.println(" CONNECTED");
      |   ^~~~~~
/Users/julienlegrand/Library/Arduino15/packages/esp32/hardware/esp32/3.0.5/cores/esp32/HardwareSerial.h:356:16: error: 'Serial0' does not name a type; did you mean 'Serial'?
  356 | #define Serial Serial0
      |                ^~~~~~~
/Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/wificonnect.cpp:18:3: note: in expansion of macro 'Serial'
   18 |   Serial.print("Adresse IP: ");
      |   ^~~~~~
/Users/julienlegrand/Library/Arduino15/packages/esp32/hardware/esp32/3.0.5/cores/esp32/HardwareSerial.h:356:16: error: 'Serial0' does not name a type; did you mean 'Serial'?
  356 | #define Serial Serial0
      |                ^~~~~~~
/Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/wificonnect.cpp:19:3: note: in expansion of macro 'Serial'
   19 |   Serial.println(WiFi.localIP());
      |   ^~~~~~
/Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/wificonnect.cpp:21:1: error: expected unqualified-id before ')' token
   21 | )
      | ^

exit status 1

Compilation error: expected initializer before 'void'

Éditez votre post et rajoutez les balises de code autour de la sortie du compilateur

Sans vos 3 fichiers c’est difficile de dire où est le problème. Postez les avec aussi les balises de code. Il y a sans doute une erreur de syntaxe dans le .h

Merci de votre aide, voici mes 3 fichiers:

Main

#include "wificonnect.h"

void setup() {
  Serial.begin(115200);
  wificonnect();
}
void loop() {
  // put your main code here, to run repeatedly:
}

wificonnect.h

#ifndef WIFICONNECT_H
#define WIFICONNECT_H

extern const char* ssid ;
extern const char* password ;

void wificonnect();
#endif

wificonnect.cpp

#include <Arduino.h>
#include "wificonnect.h"
#include <WiFi.h> 

ssid="XXXXX";
password= "XXXXX";

void wificonnect() (
      //connect to WiFi
  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
  }
  Serial.println(" CONNECTED");
  Serial.print("Adresse IP: ");
  Serial.println(WiFi.localIP()); 

)

Merci

Bonjour,

Il manque le ; après void wificonnect dans le .h

Dans la définition de wfificonnect "void wificonnect() (" tu as mis des parenthèses à la place de crochets.

De plus ssid et password sont déclarés mais non définis.
Dans le cpp ce devrait être

const char* ssid="XXXXX";
const char* password= "XXXXX";

Bonjour, Merci de votre aide,
Il manquait en effet le ; après la déclaration de fonction dans le header. (j'ai corrigé directement mon code ci dessus)
Pour les variables de connexion, elles sont renseignées dans le .CPP avant la connexion.
Au début, je les avais mis directement dans le .h, je ne pense pas que ça change grand chose.
j'ai moins d'erreur en rajoutant le ; mais il en reste en compilant le .cpp :

 error: 'Serial' does not name a type
   Serial.printf("Connecting to %s ", ssid);
   ^~~~~~

idem pour les fonction wifi. pourtant, je declare bien Arduino.h dans le CPP ainsi que wifi.h

il faut une accolade, pas une parenthèse pour marquer le début du code de la fonction...

il faut rajouter le type dans la définition de vos 2 constantes.

const char* ssid="XXXXX";
const char* password= "XXXXX";

elles sont déclarées dans le .h, en les notant extern, vous n'allouez pas de mémoire vous dites juste au compilateur "il va exister quelque part deux variables qui s'appellent ssid et password et qui seront de type const char *.

Donc ensuite, quelque part, pour que l'édition de lien fonctionne et que le compilateur s'y retrouve, il faut tenir votre promesse et définir (allouer la mémoire) les 2 constantes. Cela se fait avec l'écriture standard où l'on donne le type puis le nom de la variable et sa valeur.

Merci beaucoup de votre aide, tout a l'air de fonctionner (ca compile mais je n'ai pas d'ESP sous la main )
Je n'ai pas encore tout compris pour le déclaration de variable mais pour le reste c'etait des choses bêtes.... le C++ est rigoureux!!

Pour la programmation en général il faut être rigoureux oui.

La déclaration d'une variable informe le compilateur de son type et de son nom sans allouer de mémoire. Par exemple, avec extern int nombre;, on déclare que la variable nombre est de type entier, sans réserver d'espace mémoire. Cela signifie simplement qu'à la phase de "liens" du processus de compilation, le compilateur devra trouver un endroit où stocker cette variable (son adresse) lorsque tous les fichiers seront assemblés.

C'est ce que permet la définition d'une variable. On réserve de la mémoire pour celle-ci. Par exemple, écrire int nombre; définit la variable nombre, ce qui signifie que de la mémoire est allouée pour elle. On peut également initialiser la variable en même temps en écrivant int nombre = 42;, ce qui réserve de la mémoire et lui attribue une valeur initiale.

En C++, une variable (globale) ne doit être définie qu'une seule fois dans l'ensemble du programme pour éviter des conflits. Cependant, elle peut être déclarée plusieurs fois, ce qui est particulièrement utile lors de l'utilisation de fichiers d'en-tête (.h)

Lorsqu'une variable est déclarée dans un fichier d'en-tête avec extern, par exemple, extern int nombre;, cela permet à plusieurs fichiers source d'inclure ce fichier d'en-tête sans redéfinir la variable. Ainsi, chaque fichier source peut voir la déclaration de la variable, mais seule la définition réelle, comme int nombre;, doit se trouver dans un seul fichier source pour allouer de la mémoire.

➜ Cela garantit que le compilateur sait où trouver la variable lors de l'édition de liens, évitant ainsi les erreurs de redéfinition.