Go Down

Topic: Problème de transfert d'une classe dans une bibliothèque (Read 1 time) previous topic - next topic

ChPr

Bonjour à toutes et à tous,

Dans un sketch, je crée une classe CarteSD pour y inclure des fonctions d'écriture de variables diverses. Cela se présente sous la forme :

Code: [Select]
#include <tinyFAT.h>

class CarteSD {
private:
  boolean carteOK;
  char str[16];
public:
  void init();
  boolean ouvreFichier(String, char);
  void ecritLigne(String);
  void ecritLigne(int);
  void ecritLigne(long);
  void ecritLigne(double);
  void fermeFichier();
};

void CarteSD::init() {
  if (file.initFAT() == 0)
    carteOK = true;
  else
    carteOK = false;
}

boolean CarteSD::ouvreFichier(String nomFch, char mode) {
  boolean res;
  if (carteOK) {
    nomFch.toCharArray(str, 16);
    switch(mode) {
    case 'E':
      if ( ! file.exists(str))
        file.create(str);
      res = file.openFile(str, FILEMODE_TEXT_WRITE);
      break;
    case 'L':
      if (file.exists(str))
        res =file.openFile(str, FILEMODE_TEXT_READ);
      break;
    }
    return true;
  }
  else
    res = false;
  return res;
}

void CarteSD::ecritLigne(String st) {
  if (carteOK) {
    int lg = st.length();
    char buf[lg+1];
    st.toCharArray(buf, lg);
    file.writeLn(buf);
  }
}

void CarteSD::ecritLigne(int i) {
  if (carteOK) {
    sprintf(str,"%d", i); 
    file.writeLn(str);
  }
}

void CarteSD::ecritLigne(long l) {
  if (carteOK) {
    sprintf(str,"%ld", l);
    file.writeLn(str);
  }
}

void CarteSD::ecritLigne(double d) {
  if (carteOK) {
    dtostre(d, str, 8, 0);
    file.writeLn(str);
  }
}

void CarteSD::fermeFichier() {
  file.closeFile();

CarteSD maSD;

...
}


Tout cela fonctionne très bien.

Maintenant, je transfère tout cela dans une bibliothèque en créant un fichier CarteSD.h et un fichier CarteSD.cpp tels que ce qui suit :

Code: [Select]
#ifndef CarteSD_h
#define CarteSD_h

#include <arduino.h>
#include <tinyFAT.h>

class CarteSD {
private:
  boolean carteOK;
  char str[16];
public:
  void init();
  boolean ouvreFichier(String, char);
  void ecritLigne(String);
  void ecritLigne(int);
  void ecritLigne(long);
  void ecritLigne(double);
  void fermeFichier();
};

#endif


Code: [Select]
#include <Arduino.h>
#include <CarteSD.h>
#include <tinyFAT.h>

void CarteSD::init() {
  if (file.initFAT() == 0)
    carteOK = true;
  else
    carteOK = false;
}

boolean CarteSD::ouvreFichier(String nomFch, char mode) {
  boolean res;
  if (carteOK) {
    nomFch.toCharArray(str, 16);
    switch(mode) {
    case 'E': // Ecriture
      if ( ! file.exists(str))
        file.create(str);
      res = file.openFile(str, FILEMODE_TEXT_WRITE);
      break;
    case 'L': // Lecture
      if (file.exists(str))
        res =file.openFile(str, FILEMODE_TEXT_READ);
      break;
    }
    return true;
  }
  else
    res = false;
  return res;
}

void CarteSD::ecritLigne(String st) {
  if (carteOK) {
    int lg = st.length();
    char buf[lg+1];
    st.toCharArray(buf, lg);
    file.writeLn(buf);
  }
}

void CarteSD::ecritLigne(int i) {
  if (carteOK) {
    sprintf(str,"%d", i); 
    file.writeLn(str);
  }
}

void CarteSD::ecritLigne(long l) {
  if (carteOK) {
    sprintf(str,"%ld", l);
    file.writeLn(str);
  }
}

void CarteSD::ecritLigne(double d) {
  if (carteOK) {
    dtostre(d, str, 8, 0);
    file.writeLn(str);
  }
}

void CarteSD::fermeFichier() {
  file.closeFile();
}


Puis mon sketch devient :

Code: [Select]
#include <CarteSD.h>

mCarteSD maSD;
...


La compilation de ce code me donne les erreurs suivantes :

C:\Documents and Settings\Pierre\Mes documents\Arduino\libraries\ChP_Base\CarteSD.cpp: In member function 'void CarteSD::init()':
C:\Documents and Settings\Pierre\Mes documents\Arduino\libraries\ChP_Base\CarteSD.cpp:10: error: 'file' was not declared in this scope
C:\Documents and Settings\Pierre\Mes documents\Arduino\libraries\ChP_Base\CarteSD.cpp: In member function 'boolean CarteSD::ouvreFichier(String, char)':
C:\Documents and Settings\Pierre\Mes documents\Arduino\libraries\ChP_Base\CarteSD.cpp:22: error: 'file' was not declared in this scope
C:\Documents and Settings\Pierre\Mes documents\Arduino\libraries\ChP_Base\CarteSD.cpp:24: error: 'file' was not declared in this scope
C:\Documents and Settings\Pierre\Mes documents\Arduino\libraries\ChP_Base\CarteSD.cpp:24: error: 'FILEMODE_TEXT_WRITE' was not declared in this scope
C:\Documents and Settings\Pierre\Mes documents\Arduino\libraries\ChP_Base\CarteSD.cpp:28: error: 'FILEMODE_TEXT_READ' was not declared in this scope
C:\Documents and Settings\Pierre\Mes documents\Arduino\libraries\ChP_Base\CarteSD.cpp: In member function 'void CarteSD::ecritLigne(String)':
C:\Documents and Settings\Pierre\Mes documents\Arduino\libraries\ChP_Base\CarteSD.cpp:49: error: 'file' was not declared in this scope
C:\Documents and Settings\Pierre\Mes documents\Arduino\libraries\ChP_Base\CarteSD.cpp: In member function 'void CarteSD::ecritLigne(int)':
C:\Documents and Settings\Pierre\Mes documents\Arduino\libraries\ChP_Base\CarteSD.cpp:62: error: 'file' was not declared in this scope
C:\Documents and Settings\Pierre\Mes documents\Arduino\libraries\ChP_Base\CarteSD.cpp: In member function 'void CarteSD::ecritLigne(long int)':
C:\Documents and Settings\Pierre\Mes documents\Arduino\libraries\ChP_Base\CarteSD.cpp:69: error: 'file' was not declared in this scope
C:\Documents and Settings\Pierre\Mes documents\Arduino\libraries\ChP_Base\CarteSD.cpp: In member function 'void CarteSD::ecritLigne(double)':
C:\Documents and Settings\Pierre\Mes documents\Arduino\libraries\ChP_Base\CarteSD.cpp:76: error: 'file' was not declared in this scope
C:\Documents and Settings\Pierre\Mes documents\Arduino\libraries\ChP_Base\CarteSD.cpp: In member function 'void CarteSD::fermeFichier()':
C:\Documents and Settings\Pierre\Mes documents\Arduino\libraries\ChP_Base\CarteSD.cpp:93: error: 'file' was not declared in this scope


Toute cette présentation est bien longue et vous prie de m'en excuser.

"file" ainsi que les constantes qui provoquent des erreurs sont déclarées dans tinyFAT.h et j'inclus ce fichier dans ma bibliothèque (ça fonctionne dans le sketch ??).

Ma question : qu'est-ce que j'ai oublié ? Pourquoi cela ne fonctionne-il pas ?

Merci de votre aide.

Pierre
Pourquoi faire simple alors qu'il est si facile de faire compliqué !

skywodd

Bonjour,

Dans le .h tu n'as pas déclaré la variable "file" ;)
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

ChPr

#2
Oct 17, 2013, 09:17 am Last Edit: Oct 17, 2013, 09:20 am by ChPr Reason: 1

Bonjour,

Dans le .h tu n'as pas déclaré la variable "file" ;)

C'est vrai, mais, a priori, je n'ai pas à le faire car je ne me sers de cette variable qu"en local dans le fichier .cpp. Par ailleurs, j'avais essayé de la faire, mais cela n'avait pas amélioré la situation. Le problème n'est pas là. Voir le fil "sketch et bibliothèque".

Cordialement.

Pïerre
Pourquoi faire simple alors qu'il est si facile de faire compliqué !

skywodd


C'est vrai, mais, a priori, je n'ai pas à le faire car je ne me sers de cette variable qu"en local dans le fichier .cpp.

Moi je vois la variable "file" dans plusieurs fonction sans jamais être déclarée, ce n'est donc définitivement pas une variable locale ;)
Quoi qu'il en soit le compilateur est clair : la variable n'existe pas, qu'elle soit locale ou non il faut la déclarer à l'endroit adéquat.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Go Up