Mot clé externe entre un .cpp source et un .ino

Bonjour,
Si j'ai deux fichier.

fichier1.h fichier1.cpp
fichier2.h et fichier2.cpp

si dans fichier2.cpp je veux utiliser une variable de fichier.cpp
je fait

extern int ma_variable.

jusque la pas de problème ca fonctionne.

Mais si la variable que je veux récupérer avec le mot clé extern dans fichier2.cpp, se situe dans le fichier principal .ino

ca ne fonctionne pas.

C'est pas considérer comme un fichier source .cpp ?
Merci.

vous définissez (allouez la mémoire) ma_variable dans fichier1.cpp

int ma_variable;

vous déclarez (dites au compilateur ce que c'est) ma_variable dans fichier1.h

extern int ma_variable;

puis dans fichier2.h vous importez fichier1.h

#include "fichier1.h"

et bien sûr dans fichier2.cpp vous importez fichier2.h

#include "fichier2.h"

comment la déclarez vous exactement ?

avant le setup du .ino, je fais

int number; par exemple, comme une variable globale du fichier .ino.

mais cette variable, j'aimerais l'utiliser dans un fichier2.cpp par exemple.

si je fais extern number; dans fichier2.cpp, ca ne fonctionne pas, le compilateur ne la trouve pas.

si vous avez des .h utilisez les

le plus simple c'est un exemple

Je vais regarder le lien, mais je suis obligé sur arduino d'avoir au moins un fichier .ino avec le setup et le loop.
Il y a surement un moyen de contourner cela, et cette variable je n'ia pas le choix, elle ne peut être sur sur le .ino.

ah oui je vois l'erreur, c'est parce que le mot clé extern je l'ai mis dans le fichier.cpp alors que dans ton exemple tu le met dans le fichier.h.
Je vais regarder ca.

oui si vous compilez avec l'IDE

vous avez toujours le choix. elle doit être définie quelque part dans votre code (le .ino ou les .cpp) et il suffit de la déclarer extern pour qu'elle soit visible ailleurs.

voici un autre exemple, avec juste un .ino et un .cpp, même pas de .h

le .ino

// on déclare une variable et une fonction qui seront définies ailleurs
extern int maVariable;
extern void f1();

void setup() {
  Serial.begin(115200);
  Serial.print("dans le .ino ma variable vaut ");
  Serial.println(maVariable);
  f1();
}

void loop() {}

le .cpp

#include <Arduino.h> // pour Serial

int maVariable = 42;

void f1() {
  Serial.print("dans fichier1 ma variable vaut ");
  Serial.println(maVariable);
}

oui je vois.
je pensais que le mot clé extern voulais dire.
utilise une variable qui se trouve dans un autre fichier source.

dans ton exemple le mot clé extern signifie.
attention cette variable est défini ailleurs.

mais maVariable je peut l'utiliser dans plusieurs fichiers source sources ?
fichier2.cpp, fichier3.cpp, fichier4.cpp ?

après dans mon cas , en fait ce n'etait pas une variable, c'est un enum.
On peut déclarer extern un enum ? comme maVariable ?

oui ce qui compte c'est qu'elle ne soit définie (mémoire allouée) qu'une seule fois, dans le .ino ou un .cpp ce n'est pas important.

et ensuite dans chaque fichier de code où vous voulez l'utiliser il faut (directement ou par le biais d'un include) qu'elle soit référencée comme étant extern. Comme ça quand le compilateur compile ce fichier, il sait ce que c'est et c'est plus tard, dans la phase d'édition de liens, que le compilateur retrouve ses petits

c'est une variable de type énuméré ou c'est un type que vous voulez partager ?

oui je l'utilise pour chaque commande qui se trouve dans un fichier.h et fichier.cpp:

enum class State { Prompt,
                   PromptInput,
                   UnknownCommand,
                   InvalidSyntax,
                   OptionNotValid,
                   Help,
                   Wifi,
                   Dcnx,
                   TelnetInit,
                   Telnet,
                   Scan,
                   Color,
                   Reset,
                   Boot,
                   Cls,
                   Touch,
                   Dir,
                   Ren,
                   Copy,
                   Info,
                   Sread,
                   Send,
                   Hex,                   
                   More,
                   Del,
                   Md,
                   Rm,
                   Wget,
                   Keyb,
                   Ascii,
                   Hexdump,
                   Editor,
                   Mem,
                   Mcpr,
                   Test,
                   Ping,
                   Keybinfo,
                   Curson,
                   Cursoff,
                   Echo,
                   Date,
                   Df,
                   History,
                   Ver,
                   Ser,
                   Cat,
                   Term,
                   Unixdos
                 };

actuellement je l'ai défini dans un fichier global.h, mais j'aimerais la mettre dans le .ino , car c'est lui qui dispatch les commandes.

si je la déclare dans .ino, et que dans les autres fichiers.h je met le mot clé extern , le compilateur va peut être me dire, que cette variable existe plusieurs fois, comme c'est dans un fichier.h et que je fais des #include de ces fichiers

voici un exemple avec un enum

un type se définit dans un .h et quand vous importez ce .h, le fichier (.ino ou .cpp) connait donc le type. il n'y a pas d'allocation mémoire, c'est juste un truc qu'il doit savoir pour compiler.

Une variable ne doit être définie qu'une seule fois, dans un .cpp et si vous voulez la partager, vous la notez par exemple comme extern dans le .h qui contient aussi la définition du type. comme cela en incluant ce .h votre fichier connait à la fois le type et l'existence de la variable

Merci pour ces explications, je vais arranger mes sources, comme j'essaye des les séparer au maximum.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.