Partage
  • Partager sur Facebook
  • Partager sur Twitter

no match for 'operator='

(operand types are '[struct]' and 'int')

Sujet résolu
    22 novembre 2017 à 11:49:20

    bonjour,

    Je suis actuellement en train de travailler sur Arduino YÙN Mini (du coup je ne sais jamais si je dois poster sur le forum C ou C++ ^^') et j'essaye d'initialiser une structure en une seule instruction en la considérant comme une unique variable (afin de limiter le nombre d'instructions et donc l'utilisation de la mémoire si précieuse).

    voici en premier lieux des extraits de mon code :

    strucutres.h

    #ifndef STRUC_H
    #define STRUC_H
    // [...]
    typedef struct OwnTime otime;
    struct OwnTime{
    byte h : 5;
    byte m : 6;
    byte s : 6;
    byte ls: 6;
    };
    #endif
       


    time.c

    // [...]
    void PdateSetup(){
    Pdate.begin("/bin/date");
    yunTime = 0x00003F; // set time to 00:00:00 with last second to 63. as it is unexpected, Time will be redefined.
    }
    // [...]
     

    main.c

    #include <Wire.h>
    #include <I2C.h>
    #include <Servo.h>
    #include <RtcUtility.h>
    #include <Bridge.h>
    // [...]
    Process Pdate;
    otime yunTime;
    // [...]
    void setup(){
    PdateSetup();
    }
    void loop(){
    }
    // [...]
     


    à la compilation, j'obtiens l'erreur suivante:

    1
    no match for 'operator=' (operand types are 'otime {aka OwnTime}' and 'int')

    j'ai googlé cette erreur mais aucun autre topic était assez similaire au miens pour que les réponses me conviennent. Y a-t-il un moyen économique en mémoire et en temps qui puisse me permettre d'initialiser ma structure ou d'indiquer au compiler de traiter cette affectation bit à bit sans tenir compte du type?

    Je suis encore étudiant en Alternance, et c'est dans le cadre de mon apprentissage que j'ai cette tâche à remplir (évidemment que j'ai demandé à mon tuteur au préalable !). Veuillé donc être, s'il vous plaît, indulgent si mes erreur paraissent candides. Je suis encore littéralement un no0b.

    merci beaucoup à vous et bonne journée ! :3

    EDIT: également, j'ai une erreur identique pour l'instruction ci-après me permettant de mettre rapidement yunTime.ls dans yunTime.s en corrompant toutes les autres données de la variable sans inquiétudes puisqu'elle sont redéfinies juste après :

    if ((yunTime.ls & ~(yunTime.s)) || (yunTime.ls > 60)){//if a second has passed or last second is incoherent
    yunTime.s << 6; //puts yunTime.ls into yunTime.s. others will be redefined anyway.
    //...
    //... Update time
    //...



     

    -
    Edité par Zaszigre 22 novembre 2017 à 11:54:52

    • Partager sur Facebook
    • Partager sur Twitter
      22 novembre 2017 à 12:03:19

      Zaszigre a écrit:

      Y a-t-il un moyen économique en mémoire et en temps qui puisse me permettre d'initialiser ma structure ou d'indiquer au compiler de traiter cette affectation bit à bit sans tenir compte du type?


      Tu peux définir une union, dont l'un des champs est ta structure et l'autre est un type englobant ta structure
      • Partager sur Facebook
      • Partager sur Twitter
      Dream on, Dream on, Dream until your dream comes true
        22 novembre 2017 à 13:34:50

        romantik a écrit:

        Tu peux définir une union, dont l'un des champs est ta structure et l'autre est un type englobant ta structure


        Je n'ai encore jamais utiliser d'union, je me suis renseigné très rapidement il y a quelques semaines de cela mais du coup on peut dire que je ne connais que leur existence.

        Ce que j'ai compris des union, c'est que ça permet de définir plusieurs variables à une même adresse. Mon exemple ci dessous est-il correct ?

        // [...]
        
        
        typedef union time utime
        union time{
            otime structure;
            int integer;
        };
        
        void main(){
            utime yunTime;
            yunTime.integer = 0x00003F
        }

        Cela est-il plus lent ou occupe-t-il plus d'espace mémoire (que ce soit ma mémoire flash ou ma mémoire SRAM) que ma solution en imaginant que yunTime soit un int ? (ça n'aurait pas de sens de comparer l'optimisation de deux solution dont l'une d'elles n'existe pas ^^)

        merci beaucoup !

        • Partager sur Facebook
        • Partager sur Twitter
          22 novembre 2017 à 14:38:03

          Tous les champs de l'union occupe le même espace mémoire, donc la taille totale de ton type en mémoire est la taille du plus gros type qui la compose.

          Dans ton cas, ta structure fait 3*6+5 = 23 bits, je connais pas très bien les détails à ce niveau là mais pour des raisons de pagination, la taille qui sera alloué sera supérieur, avec un peu de chance c'est à l'octet supérieur, 3 octets donc 24 bits, mais peut-être que c'est au mot supérieur, tu passe donc à 4 octets soit 32 bits.

          Et la taille du int n'est également pas standard, elle peut varier selon les systèmes. Mais disons que c'est 4 octets, soit 32 bits

          La taille de ton union est donc le max entre ces 2 types, probablement le int à 4 octets, utime fait donc 4 octets parce que tu as rajouté un int pour ta manipulation, alors que ta structure faisait seulement 3 octets, donc oui tu as peut-être perdu 1 octet

          Mais peut-être que tu peux faire

          union utime
          {
              int integer :24;
              struct
              {
                  int h :5;
                  int m :6;
                  int s :6;
                  int ls :6;
              } structure;
          }

          pour éviter cette perte

          ça fait longtemps que je n'ai pas fait une telle manipulation alors je ne me souviens plus du sens de déclaration que tu doit respecter dans ta structure, mais fais y très attention. Il me semble que les derniers champs déclaré sont les LSB. EDIT : Perdu, apparemment les premier déclarés sont les LSB, après un petit test sur coliru

          -
          Edité par romantik 22 novembre 2017 à 16:00:00

          • Partager sur Facebook
          • Partager sur Twitter
          Dream on, Dream on, Dream until your dream comes true
            22 novembre 2017 à 15:19:06

            romantik a écrit:

            Et la taille du int n'est également pas standard, elle peut varier selon les systèmes. Mais disons que c'est 4 octets, soit 32 bits

            Sur Arduino Yùn (et arduino en général, en tout cas, au moins sur les ATmega32U4) un int est codé sur 2 octets donc il me faut au moins un uint32_t

            du coup voici ma solution pour Arduino YÙN Mini (surement portable sur toutes les cartes Arduino et µControlleur ATmega):

            typedef union time utime;
            union time{
                uint32_t i : 23;
                struct{
                    h :5;
                    m :6;
                    s :6;
                    ls:6;
                }t;
            }
            // [...]
            
            void PdateSetup(){
                Pdate.begin("/bin/date");
                yunTime.i = 0x0003F; // set time to 00:00:00 with last second to 63. as it is unexpected, Time will be redefined.
            }
            
            void PdateUpdate(){
              if ((yunTime.t.ls & ~(yunTime.t.s)) || (yunTime.t.ls > 60)){//if a second has passed or last second is incoherent
                yunTime.i << 6; //puts yunTime.ls into yunTime.s. others will be redefined anyway.
                
            // [...]
            yunTime.t.h = (string.substring(0, colon1)).toInt(); yunTime.t.m = (string.substring(colon1 + 1, colon2)).toInt(); yunTime.t.s = (string.substring(colon2 + 1)).toInt(); } }




            merci beaucoup pour votre aide !

            -
            Edité par Zaszigre 23 novembre 2017 à 8:38:04

            • Partager sur Facebook
            • Partager sur Twitter

            no match for 'operator='

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown