Go Down

Topic: Problème de multi-fichier (Read 574 times) previous topic - next topic

Xian4

Jan 26, 2013, 04:41 pm Last Edit: Jan 26, 2013, 04:45 pm by Xian4 Reason: 1
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
  - Un post parlant de renommer les fichiers sources afin que l'IDE s'y compile dans le bon ordre . J'ai donc essayé de tester cette solution, j'ai renommer constantes_et_VG.c et *.h en xconstantes_et_VG.c et *.h, néanmoins, ça n'a pas eu d'effet.
  - Un post parlant de déclarer toutes les variables globales dans le .ino et ensuite de les redéfinir dans les .h en plaçant extern devant. Néanmoins, le programme refuse toujours de compiler, mais cette fois à cause d'une double définition des variables globales.

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

Code: [Select]
//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();
}



Code: [Select]
//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...*/
//
}



Code: [Select]
//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



Quote from: 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()'

skywodd

Bonjour,

Code: [Select]
int Accx = 0;
int Accy = 0;
long int t_micro = 0;
long int t_milli = 0;

-> à mettre dans le .c

Code: [Select]
extern int Accx;
extern int Accy;
extern long int t_micro;
extern long int t_milli;

-> à mettre dans le .h
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Xian4

#2
Jan 26, 2013, 06:51 pm Last Edit: Jan 26, 2013, 06:54 pm by Xian4 Reason: 1
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 :

Code: [Select]
#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 :
Quote
sources.cpp.o: In function `loop':
/Applications/sources.ino:30: undefined reference to `input_analog()'
/Applications/sources.ino:32: undefined reference to `input_analog()'

skywodd

Essaye de renommer le fichier .c en .cpp je ne me rappelle plus qu'elles extensions l'ide inclut lors de la compilation.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Xian4

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...

skywodd


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 ...
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Go Up