Message d'erreur avec reférance etrange.

Boujour,
Je fais appelle aujourd'hui car pour la première fois j’inclue une bibliothèque dans une autre.
J'ai un écran tft Adafruit qui m'a ete donné avec une bibliothèque de fonctions qui permettent un affichage simple.
(fonction du style : tft.drawLine(x,y,x2,y2,couleur) )

J'ai écrit une bibliothèque permettant de dessiner un graphiques facilement en temps réel, avec un capteur on prélevé un valeur et cette valeur est ajoutée au graphique.

Pour cela j' ai inclue la bibliothèque de l'écran dans la bibliothèque nommée "Graphique" pour gérer l'affichage du graphique.

Voici le message d'erreur du compilateur lorsque je compile le code qui utilise ma bibliotheque:

Arduino : 1.5.5-r2 (Windows 8), Carte : "Arduino Uno"

Graphique\Graphique.cpp.o:(.bss.tft+0x0): multiple definition of `tft'
exemple_internet_pour_bitmap_et_SD.cpp.o:(.bss.tft+0x0): first defined here

Ici tft est apparemment déjà défini, le problème est qu il est défini dans la bibliothèque de l’écran et je n aimerais pas aller bidouiller dedans.
et puis ce message d’indique pas la ligne de l'erreur, il indique :(.bss.tft+0x0) que signifie ce code?

voici le code de ma bibliothèque (.cpp) :

#if ARDUINO<100
#include <WProgram.h>
#else
#include <Arduino.h>
#endif

#include "Graphique.h"

Graphique ::Graphique(){
resetVarGraph();
}

void Graphique::setTitleX(String x){
  titrex=x;
}
void Graphique::setTitleY(String y){
  titrey=y;
}
void Graphique::setTitle(String t){
  titre=t;
}
void Graphique::setValueX(double xmax,double xmin){
  xMax=xmax;
  xMin=xmin;
  }
void Graphique::setValueY(double ymax,double ymin){
  yMax=ymax;
  yMin=ymin;
  }
void Graphique::resetVarGraph(){
  titrex="Titre X";
  titrey="Titre Y";
  titre="Titre";
  xMax=100.0;
  xMin=0.0;
  yMax=100.0;
  yMin=0.0;
  ori=1;
  exDotX=7;
  exDotY=35;
  counter=0;
  }
  void Graphique::setOrientation(int r){
    ori=r;
    }
 void Graphique::traceBase(){
 int a;
 int b;
 int i;
 double sousInter;
 i=0;
 a=titre.length();
 b=titrex.length();
 a=(320-a*6)/2;
 b=315-b;
// tft.setRotation(1);
 tft.fillScreen(ILI9340_BLACK);
 tft.setTextColor(ILI9340_RED);
 tft.setTextSize(1);
 tft.drawLine(6, 0, 6, 240, ILI9340_WHITE);
 tft.drawLine(5, 0, 5, 240, ILI9340_WHITE);
 tft.drawLine(0, 236, 320, 236, ILI9340_WHITE);
 tft.drawLine(0, 235, 320, 235, ILI9340_WHITE);
 
 tft.drawLine(84, 240, 84, 35, ILI9340_WHITE);
 tft.drawLine(163, 240, 163, 35, ILI9340_WHITE);
 tft.drawLine(242, 240, 242, 35, ILI9340_WHITE);
 tft.drawLine(318, 240, 318, 35, ILI9340_WHITE);
 
 tft.drawLine(0, 35, 320, 35, ILI9340_WHITE);
 tft.drawLine(0, 85, 320, 85, ILI9340_WHITE);
 tft.drawLine(0, 135, 320, 135, ILI9340_WHITE);
 tft.drawLine(0, 185, 320, 185, ILI9340_WHITE);
 
 tft.fillTriangle(5, 0, 0, 5, 10, 5,ILI9340_WHITE);
 tft.fillTriangle(315, 230, 315, 240, 320, 235,ILI9340_WHITE);
 tft.setCursor(15, 3);
 tft.println(titrey);
 tft.setCursor(b,210);
 tft.println(titrex);
 tft.setTextColor(tft.Color565(0, 255, 255));
 tft.setCursor(a,18);
 tft.println(titre);
 tft.setTextColor(ILI9340_YELLOW);
 
 sousInter=(yMax-yMin)/4;
 while (i<5){
   tft.setCursor(15,225-i*50);
   tft.println(sousInter*i+yMin);
   i++;
   }
   i=0;
 
  sousInter=(xMax-xMin)/4;
 while (i<3){
   tft.setCursor(280-i*78,225);
   tft.println((xMax)-sousInter*i);
   i++;
   }
   i=0;
 
}   
void Graphique::traceNextDot(double x,double y,int red,int green,int blue){
  dotY=35+(((yMax-y)*200)/(yMax-yMin));//convertion entre unitees et pixels ( equivalance dimentionnelle)
  dotX=7+((311*(x-xMin))/(xMax-xMin));
  if(counter>0){
    tft.drawLine(exDotX, exDotY, dotX,dotY,tft.Color565(red,green,blue));
    }
    exDotY=dotY;
    exDotX=dotX;
  counter++;
  }

(.h)

#ifndef Graphique_h
#define Graphique_h

#if ARDUINO<100
#include <WProgram.h>
#else
#include <Arduino.h>
#endif
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9340.h"
#if defined(__SAM3X8E__)
    #undef __FlashStringHelper::F(string_literal)
    #define F(string_literal) string_literal
#endif
#define TFT_RST 8
#define TFT_DC 9
#define TFT_CS 10
#define SD_CS 4


Adafruit_ILI9340 tft = Adafruit_ILI9340(TFT_CS, TFT_DC, TFT_RST);


class Graphique{
  public:
  Graphique();// constructeur
  void setTitleX(String x);
  void setTitleY(String y);
  void setTitle(String t);
  void setValueX(double xmax,double xmin);
  void setValueY(double ymax,double ymin);
  void setOrientation(int ori);
  void resetVarGraph();
  void traceBase();
  void traceNextDot(double x,double y,int red,int green,int blue);
  
  private:
  double xMax,xMin,yMax,yMin,dotX,dotY,exDotX,exDotY;
  String titrex,titrey,titre;
  int ori,counter;
  
 };
   #endif

Merci de votre aide.
stefano zampieri

Hello,

Le souci est dans ton .h : tu définis tft (= créer un espace en RAM) à chaque appel du .h.

Il faut juste mettre "Adafruit_ILI9340 tft;" dans le .h

et dans un .cpp / .ino le " Adafruit_ILI9340 tft = blah blah"

dois-je inclure la bibliothèque de adafruit aussi dans le .cpp?

J'ai elevé le "= bla bla bla" dans mon .h (il reste plus que Adafruit_ILI9340 tft :wink: et j'ai mis dans mon ino et dans mon .cpp le reste ( cest a dire : Adafruit_ILI9340 tft = Adafruit_ILI9340(TFT_CS, TFT_DC, TFT_RST):wink:

Mais ca ne marche pas apparemment, ca affiche ca:

Arduino : 1.5.5-r2 (Windows 8), Carte : "Arduino Uno"

In file included from exemple_internet_pour_bitmap_et_SD.ino:22:
C:\Program Files (x86)\Arduino\libraries\Graphique/Graphique.h:21: error: no matching function for call to 'Adafruit_ILI9340::Adafruit_ILI9340()'
C:\Program Files (x86)\Arduino\libraries\Adafruit_ILI9340/Adafruit_ILI9340.h:127: note: candidates are: Adafruit_ILI9340::Adafruit_ILI9340(uint8_t, uint8_t, uint8_t)
C:\Program Files (x86)\Arduino\libraries\Adafruit_ILI9340/Adafruit_ILI9340.h:126: note: Adafruit_ILI9340::Adafruit_ILI9340(uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t)
C:\Program Files (x86)\Arduino\libraries\Adafruit_ILI9340/Adafruit_ILI9340.h:121: note: Adafruit_ILI9340::Adafruit_ILI9340(const Adafruit_ILI9340&)

voici les nouveaux codes (dans l'ordre .cpp et .h):

#if ARDUINO<100
#include <WProgram.h>
#else
#include <Arduino.h>
#endif

#include "Graphique.h"
Adafruit_ILI9340 tft = Adafruit_ILI9340(TFT_CS, TFT_DC, TFT_RST);

Graphique ::Graphique(){
resetVarGraph();
}

void Graphique::setTitleX(String x){
  titrex=x;
}
void Graphique::setTitleY(String y){
  titrey=y;
}
void Graphique::setTitle(String t){
  titre=t;
}
void Graphique::setValueX(double xmax,double xmin){
  xMax=xmax;
  xMin=xmin;
  }
void Graphique::setValueY(double ymax,double ymin){
  yMax=ymax;
  yMin=ymin;
  }
void Graphique::resetVarGraph(){
  titrex="Titre X";
  titrey="Titre Y";
  titre="Titre";
  xMax=100.0;
  xMin=0.0;
  yMax=100.0;
  yMin=0.0;
  ori=1;
  exDotX=7;
  exDotY=35;
  counter=0;
  }
  void Graphique::setOrientation(int r){
    ori=r;
    }
 void Graphique::traceBase(){
 int a;
 int b;
 int i;
 double sousInter;
 i=0;
 a=titre.length();
 b=titrex.length();
 a=(320-a*6)/2;
 b=315-b;
// tft.setRotation(1);
 tft.fillScreen(ILI9340_BLACK);
 tft.setTextColor(ILI9340_RED);
 tft.setTextSize(1);
 tft.drawLine(6, 0, 6, 240, ILI9340_WHITE);
 tft.drawLine(5, 0, 5, 240, ILI9340_WHITE);
 tft.drawLine(0, 236, 320, 236, ILI9340_WHITE);
 tft.drawLine(0, 235, 320, 235, ILI9340_WHITE);
 
 tft.drawLine(84, 240, 84, 35, ILI9340_WHITE);
 tft.drawLine(163, 240, 163, 35, ILI9340_WHITE);
 tft.drawLine(242, 240, 242, 35, ILI9340_WHITE);
 tft.drawLine(318, 240, 318, 35, ILI9340_WHITE);
 
 tft.drawLine(0, 35, 320, 35, ILI9340_WHITE);
 tft.drawLine(0, 85, 320, 85, ILI9340_WHITE);
 tft.drawLine(0, 135, 320, 135, ILI9340_WHITE);
 tft.drawLine(0, 185, 320, 185, ILI9340_WHITE);
 
 tft.fillTriangle(5, 0, 0, 5, 10, 5,ILI9340_WHITE);
 tft.fillTriangle(315, 230, 315, 240, 320, 235,ILI9340_WHITE);
 tft.setCursor(15, 3);
 tft.println(titrey);
 tft.setCursor(b,210);
 tft.println(titrex);
 tft.setTextColor(tft.Color565(0, 255, 255));
 tft.setCursor(a,18);
 tft.println(titre);
 tft.setTextColor(ILI9340_YELLOW);
 
 sousInter=(yMax-yMin)/4;
 while (i<5){
   tft.setCursor(15,225-i*50);
   tft.println(sousInter*i+yMin);
   i++;
   }
   i=0;
 
  sousInter=(xMax-xMin)/4;
 while (i<3){
   tft.setCursor(280-i*78,225);
   tft.println((xMax)-sousInter*i);
   i++;
   }
   i=0;
 
}   
void Graphique::traceNextDot(double x,double y,int red,int green,int blue){
  dotY=35+(((yMax-y)*200)/(yMax-yMin));//convertion entre unitees et pixels ( equivalance dimentionnelle)
  dotX=7+((311*(x-xMin))/(xMax-xMin));
  if(counter>0){
    tft.drawLine(exDotX, exDotY, dotX,dotY,tft.Color565(red,green,blue));
    }
    exDotY=dotY;
    exDotX=dotX;
  counter++;
  }
#ifndef Graphique_h
#define Graphique_h

#if ARDUINO<100
#include <WProgram.h>
#else
#include <Arduino.h>
#endif
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9340.h"
#if defined(__SAM3X8E__)
    #undef __FlashStringHelper::F(string_literal)
    #define F(string_literal) string_literal
#endif
#define TFT_RST 8
#define TFT_DC 9
#define TFT_CS 10
#define SD_CS 4


Adafruit_ILI9340 tft ;


class Graphique{
  public:
  Graphique();// constructeur
  void setTitleX(String x);
  void setTitleY(String y);
  void setTitle(String t);
  void setValueX(double xmax,double xmin);
  void setValueY(double ymax,double ymin);
  void setOrientation(int ori);
  void resetVarGraph();
  void traceBase();
  void traceNextDot(double x,double y,int red,int green,int blue);
  
  private:
  double xMax,xMin,yMax,yMin;
  String titrex,titrey,titre;
  int ori,counter,dotX,dotY,exDotX,exDotY;
  
 };
   #endif

Merci pour ta reponse rapide,
stefano zampieri

quand je ne met pas dans .h et .cpp mais je met dans .ino :
Adafruit_ILI9340 tft = Adafruit_ILI9340(TFT_CS, TFT_DC, TFT_RST);

ca me dit que dans "graphique" :'tft' was not declared in this scope

ce qui est normal car je ne l'ai pas declaré dans ma bibliothèque.

Mais quand je le met dans ma bibliothèque ca me dit que je le declare plusieur fois.
ce n'est pas logique

fino39:
quand je ne met pas dans .h et .cpp mais je met dans .ino :
Adafruit_ILI9340 tft = Adafruit_ILI9340(TFT_CS, TFT_DC, TFT_RST);

ca me dit que dans "graphique" :'tft' was not declared in this scope

Normal puisque tft est déclaré ailleurs. Dans ce cas il faut déclarer tft comme étant extern dans ta librairie

Merci beaucoup,
cependant que veut tu dire par declarer en externe?

Dans ta librairie il faut que tu déclares:
extern Adafruit_ILI9340 tft;

Ce qui indique au compilateur que la déclaration de la variable est faite dans un autre morceau du code.

Super ca marche!!
Je ne sais pas comment vous remercier!! Je trouve ce forum vraiment utile et efficace et c est grace a vous qui répondez rapidement!!
Ca soulage vraiment d'avoir un support comme ca quand on est sur le point d'abandonner.
merci.
stefano Zampieri

<3 <3

Ah oui, désolé d'avoir oublié de mentionner le "extern".