Go Down

Topic: Accéder à une structure existant en dehors de son appli (Read 1 time) previous topic - next topic

PatMax

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 :)

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"

Code: [Select]


#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


Code: [Select]

#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 :)

J-M-L

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

kamill

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.

PatMax

J-M-L :
<Pourquoi?>                                                               pour l'utiliser !
<Au pire vous pouvez modifier le code.. >       oui ! c'est ce que je fais depuis que je programme ;)


_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 !

PatMax

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.

Code: [Select]

//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 ?

kamill

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

Code: [Select]
extern const uint8_t PROGMEM dscrc_table[];

PatMax

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


kamill

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" ?

PatMax

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


kamill

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

PatMax

Ç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 :)




kamill

Tu peux aussi utiliser la force brute :smiley-mr-green: en copiant le tableau dans ton code.

PatMax

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


PatMax

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

Go Up