Accéder à une structure existant en dehors de son appli

A nouveau Bonsoir !

J'utilise la bibliothèque One-Wire pour gérer mes sondes DS18x20, tout roule comme sur des roulettes !
La bibliothèque de Github est vraiment bien faite.

Seulement voilà, j'aimerais faire un truc qui n'est pas prévu dans le contrat d'utilisation :slight_smile:

J'aimerais accéder à la table de calcul du CRC (pour me calculer mon CRC à moi en dehors des sondes) ;
or si la fonction de calcul est accessible (ben oui), la table ne l'est pas... elle est décrite dans
le fichier "OneWire.cpp"

#if ONEWIRE_CRC8_TABLE

static const uint8_t PROGMEM dscrc_table[] = {

 0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
 157,195, 33,127,252,162, 64, 30, 95,   ..............
 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168, 116,
 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53};

et dans "OneWire.h" on retrouve la déclaration de la fonction de calcul

#if ONEWIRE_CRC
    // Compute a Dallas Semiconductor 8 bit CRC, these are used in the
    // ROM and scratchpad registers.

    static uint8_t crc8(const uint8_t *addr, uint8_t len);

Ma question est : comment puis-je accéder à cette table depuis mon appli ? j'ai essayé les directives "extern", mais tant que la table n'est pas déclarée partagée, ça ne fonctionne pas.

Comment pourrais-je faire ? il me la faut cette table :slight_smile:

Pourquoi?

Au pire vous pouvez modifier le code..

Bonjour,

Ta table ne fait pas partie de la class OneWire et est déclarée static. Donc n'est pas accessible en dehors de son fichier .cpp.
La seule solution (que le vois) est de la déclarer globale (virer static dans OneWire.cpp) et ensuite tu pourras la déclarer extern dans ton programme.

J-M-L :
<Pourquoi?> pour l'utiliser !
oui ! c'est ce que je fais depuis que je programme :wink:

pepe - Today : mais c'est ce que je fais ! j'utilise la fonction de calcul qui est bien déclarée pour calculer sur un tableau d'octets, ça calcule bien. Mais je voudrais pouvoir lire la table directement depuis mon programme.

kamill : OK, j'ai essayé. Pour l'instant je n'y arrive pas , soit mon appli ne voit pas la table, soit ce sont les modules .cpp et .h de OneWire qui râlent. Je continue à chercher, merci !

Bon, je n'y arrive pas encore.

Avant de faire un accès à la table dans mon appli, je compile en enlevant la directive "static" de cette table dans le .cpp
OK, cela compile.

//static const uint8_t PROGMEM dscrc_table[] = {                                     // original
         const uint8_t PROGMEM dscrc_table[] = {                                     // modifie
      0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
    157,195, 33,127,252,162, 64, 30, 95,  1,227,189, 62, 96,130,220,
     35,125,159,193, 66, 28,254,160,225,191...

Mais il faut maintenant que je déclare la table dans le .h , pour qu'elle soit vue depuis mon appli, non ?
Or dès que j'essaye de déclarer cette table dans mon .h, le compilateur détecte des erreurs, dont celle-ci:

\Arduino\libraries\OneWire\OneWire.cpp:145:1: error: uninitialized member 'OneWire::dscrc_table' with 'const' type 'const uint8_t {aka const unsigned char}' [-fpermissive]

Je ne m'attendais pas que cela soit si difficile ! quelqu'un a une piste ?

il faut que tu inclues la définition extern dans OneWire.h

extern const uint8_t PROGMEM dscrc_table[];

Zut, désolé, j'ai toujours une erreur (et un warning) :

C:\Documents and Settings\domi\Mes documents\Arduino\libraries\OneWire/OneWire.h:338:50:
error: storage class specified for 'dscrc_table'

  • extern const uint8_t PROGMEM dscrc_table[];*
  • ^*
    C:\Documents and Settings\domi\Mes documents\Arduino\libraries\OneWire/OneWire.h:338:50:
    warning: 'progmem' attribute ignored [-Wattributes]
    exit status 1
    Error compiling for board Arduino Pro or Pro Mini.

J'ai enlevé la directive PROGMEM, mais cela ne compile pas mieux.

kamill, l'extern je l'aurais plutôt mis dans mon appli, non ? (c'est ce que j'ai fait, cela compile bien, mais
quand j'essaye un accès à la table, elle ne veut pas être reconnue).

Zut, désolé les gars, mais je ne suis pas encore à l'aise avec ces déclarations croisées public et extern...

Chez moi ça fonctionne en mettant l'extern dans OneWire.h.

En mettant l'extern dans le fichier ino ça devrait fonctionner, mais J'ai essayé et il ne réussi pas à trouver la table à l'édition de lien (je soupçonne un bug du compilateur ou de l'ide).

Qu'est ce que ça veut dire "quand j'essaye un accès à la table, elle ne veut pas être reconnue" ?

Voilà ce que cela voulait dire :

  1. j'ai enlevé le 'static' de la déclaration de la table en .cpp,

  2. j'ai essayé de déclarer la table en .h, mais je suis revenu en arrière, et n'ai pas fait de déclaration là

  3. j'ai spécifié dans mon .ino un "extern const uint8_t PROGMEM dscrc_table[];"

  4. j'ai compilé sans avoir de code qui tente d'accéder à cette table dans mon .ino = OK, pas d'erreur

  5. j'ajoute cette ligne dans mon code (.ino) :

Serial.write(val);
Crc = pgm_read_byte(dscrc_table + (Crc ^ val));

(pour l'histoire, je calcule le Crc8 à la volée, en envoyant des octets sur la liaison-série, sans les mettre d'abord dans un buffer, voilà pourquoi cette table m'intéresse)

mais je bute alors sur l'erreur :

sketch\test.ino.cpp.o: In function SendSerialCrc(unsigned char)': C:\Documents and Settings\domi\Mes documents\Arduino\test/test.ino:765: undefined reference to dscrc_table'

C:\Documents and Settings\domi\Mes documents\Arduino\test/test.ino:765: undefined reference to `dscrc_table'
collect2.exe: error: ld returned 1 exit status

exit status 1
Error compiling for board Arduino Pro or Pro Mini.

Chez toi ça marche ? Ah. je suis en IDE 1.6.9

Non chez moi ça fait la même chose si je mets le extern dans le .ino (je persiste à dire que ça devrait fonctionner).
Par contre si je mets le extern dans OneWire.h et que je fais #include <OneWire.h> dans le .ino, là ça fonctionne.

Je suis sous windows en 1.8.3

Ça ressemble quand même à une bizarrerie de l'IDE ou du compilateur, car on a fait ce qui est logique : déclaration de l'extern dans l'.ino ; et puis cela marche chez toi (déclaration en .h), et pas ici.

J'ai eu beau essayer, pas moyen de compiler... l'IDE a l'air parfois bizarre, il a fallu que je déclare des variables inutilisées en début de source pour éviter des erreurs à la compil (trouvé la combine sur le net).

Zut, je n'ai pas envie de me retaper une installation du dernier IDE, cela me fait peur. Je suis sous (aheum...) XP3, avec une version de Java un peu ancienne, les versions Java plus récentes méprisent ma machine (je ne sais pas si Java pourrait être la cause de mon dysfonctionnement ? je n'ai pas l'impression, Java n'a rien à faire à la compil, à l'édition de liens... il me semble ?)

Ou alors je me l'installe sous Linux, j'ai un ubuntu prêt. L'IDE sous Linux est identique à celui sous Windows ?
Ou alors je laisse cette fonction de coté, j'avance sur le reste du code, et je résoudrai plus tard ce point...

Je vais essayer un peu tout ça. Merci pour l'aide, je vais voir comment je m'y prends :slight_smile:

Tu peux aussi utiliser la force brute :grin: en copiant le tableau dans ton code.

SAUVAGE ! hérétique ! pour avoir 2 tables identiques dans la flash ! JAMAIS

:slight_smile:

Je peux aussi fabriquer le Crc8 non par table, mais par calcul, j'ai tout le temps que je veux et c'est facile. Mais bon, j'suis têtu, et puis c'est un bon moyen d'apprendre des choses. Á ce propos, le lien que tu m'as passé pour voir le code généré par le compil est très intéressant, mais je m'étonne que sur un produit destiné à l'apprentissage (l'Arduino), cette fonction ne soit pas plus accessible. Y'a quand même des bizarreries, dans ce monde

En mettant l'extern dans le fichier ino ça devrait fonctionner, mais J'ai essayé et il ne réussi pas à trouver la table à l'édition de lien (je soupçonne un bug du compilateur ou de l'ide).

Non pas si le tableau n’est pas créé...
il y’a le #if ONEWIRE_CRC8_TABLE et un #if ONEWIRE_CRC... sont ils définis et non nuls?

Oui, il est défini dans OneWire.h

Ok (suis sur l’iPhone - pas regardé)

Bonsoir,

La syntaxe du PROGMEM est très pointue, cf.

En résumé :

  • soit en variable globale,
  • soit en static,
    et la position du PROGMEM dans la déclaration est critique :
    const dataType variableName[] PROGMEM = {}; // use this form
    const PROGMEM dataType variableName[] = {}; // or this one

Bonne bidouille,

MicroQuettas

PatMax:
Ou alors je me l'installe sous Linux, j'ai un ubuntu prêt. L'IDE sous Linux est identique à celui sous Windows ?

oui