Problème de multi-fichier

Bonjour,

Je débute sur l'Arduino, ayant déjà quelques mois de programmation en C, je me suis dit que c'en était assez proche pour que je l'utilise afin de programmer un micro-contrôleur. Bon, partant sur mes bases, j'ai débuté mon code, en faisant académiquement une segmentation de mon programme dans différents fichiers.

Je suis donc parti sur 3 fichiers :

  • sources.ino qui servirait de code principal,
  • constantes_et_VG.h et son .c associé :
    .h) le .h servirait à définir les constantes et variables globales, ainsi que le prototype des fonctions du .c
    .c) le .c contient pour l'instant une seule fonction qui met à jour les variables globales à partir des entrées du µC.

Pourtant, le codage à la mode programmation en C ne semble pas fonctionner.

J'ai déjà regardé les posts suivant

Merci pour le coup de main, je vous joins ci dessous les codes sources et les messages d'erreurs du compilateur

//Fichier sources.c
#include "constantes_et_VG.h"



//////////////////////////////////////////////////////////
//////////////////      DEBUT DU CODE     ////////////////
//////////////////////////////////////////////////////////

void setup() {
  // initialise le port série à 9600 bauds
  Serial.begin(9600);
}

void loop() {

input_analog();// Fonction qui met a jour les variables globales
  
input_analog();
}
//Fichier constantes_et_VG.c

#include "Arduino.h"
#include "constantes_et_VG.h"

void input_analog()
{
  Accx = GAIN_ACCELEROMETRE * (analogRead(BROCHE_ACCX) - TENSION_ACCELEROMETRE_ACCX0);
  Accy = GAIN_ACCELEROMETRE * (analogRead(BROCHE_ACCY) - TENSION_ACCELEROMETRE_ACCY0);

  t_micro = micros();
  t_milli = millis();/* A priori, on n'aura pas besoin de cette valeur,
                     mais sait-on jamais, ça dépend pendant combien 
                     de temps durera l'experience...*/
//
}
//Fichier constantes_et_VG.h

#ifndef CONSTANTES_ET_VG__H
#define CONSTANTES_ET_VG__H

///////////////////// Constantes////////////////////////
#define GAIN_ACCELEROMETRE 1
#define TENSION_ACCELEROMETRE_ACCX0 2.5
#define TENSION_ACCELEROMETRE_ACCY0 2.5
#define BROCHE_ACCX 0
#define BROCHE_ACCY 1


///////////////////////Variables globales/////////////////////
int Accx = 0;
int Accy = 0;
long int t_micro = 0;
long int t_milli = 0;


///////////////////////      Fonctions     /////////////////////
void input_analog();





#endif

log du compilateur:
sources.cpp.o: In function loop': /Applications/sources.ino:27: multiple definition of Accx'
constantes_et_VG.c.o:constantes_et_VG.c:6: first defined here
sources.cpp.o: In function loop': /Applications/sources.ino:27: multiple definition of Accy'
constantes_et_VG.c.o:constantes_et_VG.c:6: first defined here
sources.cpp.o: In function loop': /Applications/sources.ino:27: multiple definition of t_micro'
constantes_et_VG.c.o:constantes_et_VG.c:6: first defined here
sources.cpp.o: In function loop': /Applications/sources.ino:27: multiple definition of t_milli'
constantes_et_VG.c.o:constantes_et_VG.c:6: first defined here
sources.cpp.o: In function loop': sources.cpp:(.text.loop+0x0): undefined reference to input_analog()'
sources.cpp:(.text.loop+0x4): undefined reference to `input_analog()'

Bonjour,

int Accx = 0;
int Accy = 0;
long int t_micro = 0;
long int t_milli = 0;

-> à mettre dans le .c

extern int Accx;
extern int Accy;
extern long int t_micro;
extern long int t_milli;

-> à mettre dans le .h

J'ai fais cela, et du coup, il me reste un message d'erreur. Visiblement, quelque chose cloche avec le prototype de la fonction déclaré dans le .h :

#ifndef CONSTANTES_ET_VG__H
#define CONSTANTES_ET_VG__H


/////////////////////    Constantes    ////////////////////////
#define GAIN_ACCELEROMETRE 1
#define TENSION_ACCELEROMETRE_ACCX0 2.5
#define TENSION_ACCELEROMETRE_ACCY0 2.5
#define BROCHE_ACCX 0
#define BROCHE_ACCY 1

///////////////////////Variables globales/////////////////////
extern int Accx;
extern int Accy;
extern long int t_micro;
extern long int t_milli;

///////////////////////      Fonctions     /////////////////////
void input_analog();





#endif

Ce que me ressort le compilateur, c'est :

sources.cpp.o: In function loop': /Applications/sources.ino:30: undefined reference to input_analog()'
/Applications/sources.ino:32: undefined reference to `input_analog()'

Essaye de renommer le fichier .c en .cpp je ne me rappelle plus qu'elles extensions l'ide inclut lors de la compilation.

exact, c'était ça...

Mais pourquoi le compilateur refuse de compiler du .c ?

Je croyais qu'il faisait le c et le c++...

J'suis désolé, j'aimerais comprendre...

Xian4:
Mais pourquoi le compilateur refuse de compiler du .c ?
Je croyais qu'il faisait le c et le c++...

J'suis désolé, j'aimerais comprendre...

Le compilateur compile du C, du C++ et même de l'assembleur.
Le problème c'est que l'ide arduino est codé bizarrement ... il ne reconnait pas certaines extensions comme .hpp alors qu'il reconnait .cpp ...