Fichier de fonction avec array en argument

Bonjour,

Je coince depuis plusieurs jours alors je fais un topic.
Je fais un drone et sa télécommande avec mes élèves. Pour leur simplifier la tâche (ils sont en 3e), je tente de faire un fichier externe avec quelques fonctions. Voici donc mes fichier .h, .c, et .ino :
Le fichier .h :

#include <Arduino.h>

byte recevoir_message(byte numero);     //le prototype fonction

Le fichier .c :

#include <Arduino.h>
#include <VirtualWire.h>

byte recevoir_message(byte numero){     //ma fonction
   byte valeurs[9];
   byte message[8];
   byte taille_message = sizeof(valeurs);
   vw_wait_rx();                        // On attend de recevoir un message
   if (vw_get_message((byte *) &valeurs, &taille_message)) {
      for(int i=0;i<9;i++){
         if (valeurs[i]==numero){
            message[i]=valeurs[i+1];
            }
         }
      return message[8];
   }
}

Alors pour faire court, la même fonction dans le fichier.ino ne pose pas de probleme mais le compilatuer ne veut rien savoir si la fonction est dans mon fichier .c avec le prototype en .h.

Pour info, j’ai mis ce joli message en orange :
undefined reference to `recevoir_message(unsigned char)’
collect2: error: ld returned 1 exit status

Alors si quelqu’un à une réponse…merci d’avance

Bonjour,

La signature des fonctions C et C++ est différente. Comme les fichiers ino sont des fichier C++, le compilateur s'attend à des fonctions C++. Si tu veux utiliser des fonctions C, il faut les déclarer explicitement avec extern "C".

Attention cependant si tu fais du C, tu ne pourras pas utiliser des classes ou fonctions arduino qui sont en C++.

La solution la plus simple est de renommer ton fichier .c en .cpp (C++)

Merci pour les réponses rapides.

Bon, j'ai mis mon fichier en .cpp mais rien ne change. et comme j'y inclus VirtualWire, je pensais que cela irait mieux

J'ai déjà fait des fonctions dans des fichiers externes en .c et ça fonctionnait sans rien spécifier mais sans bibliotheque autre qu'arduino.

ÇA Y EST !

Il faut (et je ne l'avait pas fait avant pour d'autre fonction) mettre "exerne devant la fonction dans le fichier .h :

extern byte recevoir_message(byte numero);

Donc merci pour cette aide précieuse. Je vais pouvoir finir mes fonctions externe pour nos chers enfants :

extern byte assembleMessage(byte numeroDrone, byte parametreVol[6], byte parametreCamera[2])
extern byte envoyerMessage(byte message[9]);
extern byte recevoirMessage(byte numeroDuDrone);
extern byte isolerParametreVol(byte message[8]);
extern byte isolerParametreCamera(byte message[8]);

Et merci encore.

Zelione: Il faut (et je ne l'avait pas fait avant pour d'autre fonction) mettre "exerne devant la fonction dans le fichier .h :

Le 'extern' est facultatif dans la déclaration d'une fonction. Donc qu'on le mette ou pas ça ne change rien.

oui, mais avec le fichier en .cpp, ça ne fonctionnait pas pour ma première fonction (sauf avec le extern). Mais c'est peut-être nécessaire si on ajoute une bibliothèque pour décrire sa fonction. Je crois aussi que les array en argument ne passent pas bien. je tatonne encore pour la suite car ça plante à nouveau.

message[8] n’existe pas !
puisque tu déclares byte message[8]

      for(int i=0;i<9;i++){
         if (valeurs[i]==numero){
            message[i]=valeurs[i+1];
            }
         }

Ta boucle écrit dans message[8] → problèmes en vue !