[résolu] Déclaration variable

Bonjour,
J’ai un petit soucis de déclaration de variable via des fichier .h
La compilation fonctionne dans le cas ci-dessous (La variable touche est déclarée dans ipsDeclaration.h) :
Fichier test.ino :

/* dépendances */
#include <Wire.h>                       //communication I2C
#include "ipsDeclaration.h"             //déclarations
/* ************************************************************************** */
void setup(){
/* ************************************************************************** */
  Serial.begin(115200);                 //init port série pour debug
  initIHM1();
}
/* ************************************************************************** */
void loop(){
/* ************************************************************************** */
  if(touche){                           //valeur différente de 0
  }
}

Fichier ipsDeclaration.h :

#ifndef IPSDECLARATION_H
#define IPSDECLARATION_H
/* dépendances */
#include "ipsIHM1.h"
/* variables */
uint8_t touche = 0;
#endif

Fichier ipsIHM1.h :

#ifndef IPSIHM1_H
#define IPSIHM1_H
/* dépendances */
#include <Arduino.h>
#include "PCF8574.h"
/* variables */
//uint8_t touche = 0;
/* prototypes */
void initIHM1();
#endif

Fichier ipsIHM1.cpp :

/* dépendances */
#include "ipsIHM1.h"
void initIHM1(){
  /* instances PCF8574 */
//  PCF8574 io0x21;
//  PCF8574 io0x22;
}

Si je souhaite déclarer la variable touche dans ipsIHM.h, j’ai le message d’erreur “multiple déclaration touche”.
J’avoue que je ne vois pas d’où vient cette erreur.
Le code qui ne fonctionne pas.
Fichier test.ino :

/* dépendances */
#include <Wire.h>                       //communication I2C
#include "ipsDeclaration.h"             //déclarations
/* ************************************************************************** */
void setup(){
/* ************************************************************************** */
  Serial.begin(115200);                 //init port série pour debug
  initIHM1();
}
/* ************************************************************************** */
void loop(){
/* ************************************************************************** */
  if(touche){                           //valeur différente de 0
  }
}

Fichier ipsDeclaration.h :

#ifndef IPSDECLARATION_H
#define IPSDECLARATION_H
/* dépendances */
#include "ipsIHM1.h"
/* variables */
//uint8_t touche = 0;
#endif

Fichier ipsIHM1.h :

#ifndef IPSIHM1_H
#define IPSIHM1_H
/* dépendances */
#include <Arduino.h>
#include "PCF8574.h"
/* variables */
uint8_t touche = 0;
/* prototypes */
void initIHM1();
#endif

Fichier ipsIHM1.cpp :

/* dépendances */
#include "ipsIHM1.h"
void initIHM1(){
  /* instances PCF8574 */
//  PCF8574 io0x21;
//  PCF8574 io0x22;
}

Si un membre de la communauté à une piste, je suis prenneur.
Merci

Une variable gobale ne peut pas être allouée dans un fichier .h

Tu peux la déclarer en extern dans le fichier header, et l'allouer dans le cpp associé.

.h : extern uint8_t touche;

.cpp : uint8_t touche = 0;

Bonjour bricoleau, Merci pour ces précisions. J'avais essayé tant de solutions mais pas celle là. C'est tombé en marche. J'avais testé le principe de base des Shadoks : "Ce n'est qu'en essayant continuellement que l'on fini par réussir... En d'autres termes... Plus ça rate et plus on a de chances que ça marche..." Merci

ouais, sauf qu'ici c'est la recommandation de la norme ;)

+1 Tomber en marche c'est quand on constate que ça marche mais qu'on ne sait pas pourquoi ;)

Bonjour 68tjs,

68tjs: +1 Tomber en marche c'est quand on constate que ça marche mais qu'on ne sait pas pourquoi ;)

Ta remarque tout à fait judicieuse. A nos ages le temps de réaction est parfois long et le raisonnement prend, quelque fois, des chemins sinueux. Dans l'explication de bricoleau, j'ai compris ceci : [u]extern[/u] est pour les variables le pendant des [u]prototypes[/u] pour les fonctions. @+

yep. Extern déclare la variable. Sans "extern", tu définis une variable = tu réserves la place et un nom, et ce nom doit être unique. D'où l'erreur de double définition ;)

icare: [u]extern[/u] est pour les variables le pendant des [u]prototypes[/u] pour les fonctions.

Bonsoir, Oui, sauf que dans un cas c'est pour prévenir le compilateur que la définition de la fonction sera faite plus loin dans le fichier et que dans l'autre cas c'est pour dire au contraire que la déclaration a déjà été faite dans un autre fichier.

Il n'est pas obligatoire de déclarer les variables globales en extern dans un fichier *.h. On le fait parce que c'est plus clair pour nos petits cerveaux (et tu as raison à nos ages ...) mais tu peux tout aussi bien déclarer des variables globales en extern directement dans le fichier C.