Une syntaxe C++ que je ne comprend pas (->)
Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

Une syntaxe C++ que je ne comprend pas (->)



  1. #1
    Forhorse

    Une syntaxe C++ que je ne comprend pas (->)


    ------

    Bonjour à tous,
    Petit message en forme de bouteille à la mer (c'est pas capital mais j'aime bien comprendre)

    Pour le contexte, j'essaye de compiler une version "custom" de ESPeasy
    https://espeasy.readthedocs.io/en/latest/
    dont les sources se trouvent ici
    https://github.com/letscontrolit/ESPEasy

    Après avoir cloné le dépôt et compilé tel quel, ça fonctionne.

    Le problème c'est que j'aimerais compilé une version "custom" de ESPeasy avec un "plug-in" non officiellement supporté que l'on peut trouver ici

    https://github.com/letscontrolit/ESP...uginPlayground

    Et plus particulièrement le P127 : Teleinfo

    J'ai trouvé comment editer un fichier Custom.h pour que ça compile avec les "plug-ins" de mon choix, j'ai colé le code du plug-in et ses librairies où il faut, jusque là, visiblement pas de problème.
    Sauf qu'a la compilation il me sort une erreur :
    C:/Users//Documents/PlatformIO/Projects/EspEasy/ESPEasy/src/_P127_Teleinfo.ino: In function 'boolean Plugin_127(byte, EventStruct*, String&)':
    C:/Users//Documents/PlatformIO/Projects/EspEasy/ESPEasy/src/_P127_Teleinfo.ino:136:44: error: lvalue required as left operand of assignment
    UserVar[event->BaseVarIndex+x] = (float)value;
    la ligne 136 est la suivante
    Code:
    UserVar[event->BaseVarIndex+x] = (float)value;
    Bon, visiblement "UserVar" n'est pas défini, ce qui est sans doute la source de mon problème, mais là n'est pas la question en fait (désolé d'être aussi long)

    concrètement, a quoi correspond cette notation avec la fléche (->) ?
    Ce n'est pas la première fois que je suis confronté à cette notation, avec une erreur de compilation à ce niveau, et sans comprendre ce que ça fait / a quoi ça sert; je n'ai jamais réussit à apporter une correction.
    Mes recherche sur le net à propos de cette notation sont restée infructueuse... ou en tout cas c'est un concept C++ qui m'échappe.
    Quelqu'un pour m'expliquer ou m'indiquer un site qui explique ça pour un débutant ?
    Merci d'avance.

    -----
    Tout projet flou conduit à une connerie précise !

  2. #2
    MissJenny

    Re : Une syntaxe C++ que je ne comprend pas (->)

    l'opérateur "->" permet d'accéder aux divers champs d'une structure. Si tu as une erreur de compilation c'est peut-être parce que ton compilateur pense trouver du C-ansi (pas ++)?

  3. #3
    Forhorse

    Re : Une syntaxe C++ que je ne comprend pas (->)

    Je ne pense pas que ce soit un problème avec le langage détecté par le compilateur, "UserVar" est utilisé dans d'autre plug-ins (tous ?) de ESPeasy et ça compile sans problème avec eux (ça semble être pour ainsi dire une variable système).
    Je pense surtout que sa "structure" à évolué et qu'il y a une différence de "version" entre la façon dont ce doit être utilisé maintenant et celle dont c'était utilisé à l’époque où le plug-in que je cherche à ajouté à été écrit. C'est une version de test, qui n'a pas franchement évoluée depuis sa version initiale en 2020.

    Merci pour la réponse en tout cas.
    Une structure c'est une notion encore un peu trop abstraite pour mon niveau de C++ (j'ai surtout connu ça en programmation d'automates programmables industriels)
    Mais je sais où je dois creuser pour essayer de comprendre cette syntaxe.
    Tout projet flou conduit à une connerie précise !

  4. #4
    Ikhar84
    Animateur Informatique

    Re : Une syntaxe C++ que je ne comprend pas (->)

    Tu peux MoteurdeRecherchiser : "C++ arrow operator" :

    https://www.geeksforgeeks.org/arrow-...with-examples/

    Dans ton cas ou UserVar pose problème (c'est un pointeur sur un "tableau"), ou c'est l'index invoqué qui pose problème [event->BaseVarIndex + x]...

    D'ailleurs les nommages (capitales) sont hors "norme", on réserve ve type de nommage aux classes pas aux variables, tu as vérifié la casse de tes variables ?
    J'ai glissé Chef !

  5. A voir en vidéo sur Futura
  6. #5
    umfred

    Re : Une syntaxe C++ que je ne comprend pas (->)

    le problème ça serait plutôt qu'on ne peut pas affecter une valeur à UserVar[event->BaseVarIndex+x].
    Il faudrait retrouver la déclaration de cette variable et voir son type ....

  7. #6
    Forhorse

    Re : Une syntaxe C++ que je ne comprend pas (->)

    La déclaration de "UserVar" doit sans doute être faite dans le code du "core" ESPeasy vu que c'est une variable qui est utilisé dans tous les "plug-ins", j'ai pas encore trouvé où.
    Tout projet flou conduit à une connerie précise !

  8. #7
    Médiat

    Re : Une syntaxe C++ que je ne comprend pas (->)

    Dans UserVarStruct.h la structure UserVarStruct est définie, mais est-ce le type de la variable UserVar ? Sinon faites une recherche dans tous les .h, votre compilateur doit savoir faire cela.
    Je suis Charlie.
    J'affirme péremptoirement que toute affirmation péremptoire est fausse

  9. #8
    Forhorse

    Re : Une syntaxe C++ que je ne comprend pas (->)

    J'utilise VisualStudioCode mais je suis loin de le maitriser.
    J'ai effectivement trouvé UserVarStruct.h mais c'est trop pointu pour moi.

    En mode bourrin j'ai essayé de modifier la ligne qui pose problème en m'inspirant du code d'autres plug-ins.

    si je remplace
    Code:
    UserVar[event->BaseVarIndex+x] = (float)value;
    par
    Code:
    UserVar[event->TaskIndex,x,(float)value];
    ça complie sans erreur (je ne suis pas allé plus loin parce que sans doute que ça ne fonctionnerait cependant pas)

    par contre si je remplace par
    Code:
    UserVar[event->TaskIndex,BaseVarIndex+x,(float)value];
    Alors ça ne compile pas car "BaseVarIndex" n'est pas déclaré...

    Partant de là j'ai essayé
    Code:
    UserVar[event->x] = (float)value;
    Et ça ne compile pas non plus
    'struct EventStruct' has no member named 'x'
    Je pense vraiment que le code de ce plug-in est trop vieux et qu'il n'est plus conforme au fonctionnement du "core" ESPeasy qui lui a continué d’évoluer (3 ans pour un tel projet ça fait une masse colossale de modification)
    C'est trop compliqué pour moi.
    J'y reviendrais peut être si j'arrive à écrire moi même un plug-in et donc à comprendre globalement les concepts associés (pour un projet j'aimerais bien pouvoir l’intégrer à ESPeasy)
    Tout projet flou conduit à une connerie précise !

  10. #9
    polo974

    Re : Une syntaxe C++ que je ne comprend pas (->)

    c'est la joie des pointeurs (un truc puissant que j'adore en C et C++)...

    si on a un objet ou une structure, pour accéder à un de ses éléments, on utilise
    Code:
     monsuperobjet.monsuperelement
    mais si comme ici, on a juste passé le pointeur (c'est moins gros à passer un pointeur qu'une grosse structure ou objet, et en plus on peut le modifier, alors on écrit
    Code:
    ptrsurmonsuperobjet->monsuperelement
    donc devant la flèche, il faut un pointeur sur une structure (ou un obj)

    en fait, on pourrait aussi écrire:
    Code:
    (*ptrsurmonsuperobjet).monsuperelement
    ou
    Code:
     ptrsurmonsuperobjet[0].monsuperelement
    mais la flèche, c'est plus parlant, la flèche, ça pointe, donc ça rappelle qu'on a à faire à un pointeur...
    Dernière modification par polo974 ; 15/01/2024 à 14h52.
    Jusqu'ici tout va bien...

  11. #10
    Forhorse

    Re : Une syntaxe C++ que je ne comprend pas (->)

    Ok merci beaucoup pour l'explication.
    Je suis pas super à l'aise avec le concept mais ça va m'aider à comprendre.

    Et sinon pour le problème de base, j'ai trouvé cette discussion lancé par quelqu'un qui semble confronté au même problème que moi pour un autre "plug-in"
    https://www.letscontrolit.com/forum/...pic.php?t=9988
    Là non plus j'ai pas encore tout compris, mais il semble qu'avec ma modification en mode "bourrin" j'étais sur la bonne piste.
    Tout projet flou conduit à une connerie précise !

  12. #11
    umfred

    Re : Une syntaxe C++ que je ne comprend pas (->)

    Pour moi, il manquerait la variable cible donc un truc du genre
    Code:
    UserVar[event->BaseVarIndex+x].varcible = (float)value;
    il reste à trouver le nom de cette variable; ou alors comme la solution qu'il indique (mais en float)
    Code:
    UserVar.setFloat(event->BaseVarIndex+x, 0, (float)value);

  13. #12
    Bounoume

    Re : Une syntaxe C++ que je ne comprend pas (->)

    ou alors, 2 points qui m'intriguent.....
    soit
    la variable UserVar ..... elle n'a pas été déclarée dans le corps de la fonction, ni ne me semble appartenir à un objet dont la fonction est membre....alors, elle est déclarée où? si c'est comme variable globale ça conviendrait....
    mais en plus elle devrait être déclarée comme tableau de valeurs indicées par un [ ]
    ........si elle n'a pas été déclarée ainsi, alors comment la fonction :
    boolean Plugin_127(byte function, struct EventStruct *event, String& string) {.....};
    .....peut-elle y accéder?

    ou alors, dans le modèle du type
    struct EventStruct {....}; (qu' il faudrait réussir à trouver dans un des en-tête en .h )
    .... est-ce qu'il y a bien une variable dont le nom est BaseVarIndex ??
    sinon affectation impossible.....

    si ces vieux souvenirs de + de 10 ans... peuvent être utiles....
    rien ne sert de penser, il faut réfléchir avant.... (Pierre Dac...)

  14. #13
    Forhorse

    Re : Une syntaxe C++ que je ne comprend pas (->)

    UserVar est déclarée dans UserVarStruct.h
    dit en #7
    Tout projet flou conduit à une connerie précise !

  15. #14
    umfred

    Re : Une syntaxe C++ que je ne comprend pas (->)

    Citation Envoyé par Forhorse Voir le message
    UserVar est déclarée dans UserVarStruct.h
    dit en #7
    non c'est la structure UserVarStruct qui y est défini, pas la variable UserVar (à moins que l'on l'a loupé)

  16. #15
    Médiat

    Re : Une syntaxe C++ que je ne comprend pas (->)

    Avec Visual studio il faut 1s pour chercher dans tous les fichiers et cela résoudra le problème !
    Je suis Charlie.
    J'affirme péremptoirement que toute affirmation péremptoire est fausse

Discussions similaires

  1. syntaxe en C
    Par cubitus_54 dans le forum Programmation et langages, Algorithmique
    Réponses: 18
    Dernier message: 06/04/2014, 21h59
  2. syntaxe en C
    Par cubitus_54 dans le forum Électronique
    Réponses: 7
    Dernier message: 27/03/2014, 22h15
  3. Syntaxe LangageC
    Par invitef98e5f5a dans le forum Programmation et langages, Algorithmique
    Réponses: 20
    Dernier message: 10/11/2010, 08h29
  4. Syntaxe
    Par invite58d2d622 dans le forum Chimie
    Réponses: 1
    Dernier message: 17/01/2006, 16h33