Erreur Structure - left of ... must have struct/union type

Résolu
BV91 Messages postés 16 Statut Membre -  
BV91 Messages postés 16 Statut Membre -
Bonjour,

J'essaie de faire une sorte de contrôle sur la valeur d'un registre et ce en retournant un booléen faux si le nombre ne convient pas. Pour cela, j'ai écrit la fonction "Number2RegS" :

int Number2RegS()
    {
      int registre = 0;
      registre = ShowRegS();
      if(isdigit(registre.c1) == 0) // sin non, retourner un booléen faux
        {
	        return false;
        }  
      if(isdigit(registre.c2) == 0) 
        {
	        return false;
        } 
      if(isdigit(registre.c3) == 0) 
        {
	        return false;
        } 
      if(isdigit(registre.c4) == 0) // sin non, retourner un booléen faux
        {
	        return false;
        } 
    }


Le code de la fonction "ShowRegS" que j'appelle est le suivant :

int ShowRegS()
    {
      struct MonRegistre registre; // registre est de type MonRegistre
      printf("%llu",registre.c1);
      printf("%llu",registre.c2);
      printf("%llu",registre.c3);
      printf("%llu",registre.c4);
    }


Quand je compile le code, j'ai une erreur : error C2224: left of '.c1' must have struct/union type au niveau de la ligne
if(isdigit(registre.c1) == 0)


Je ne comprends pas d'où vient l'erreur... Parce que pour moi ce qu'il y a à gauche de c1 est une variable de type MonRegistre...

Quelqu'un pourrait m'aider ?

Merci d'avance !

4 réponses

  1. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    Salut.
    Dans la fonction retournant une erreur, registre est un entier et pas une structure, modifie son type, ainsi que le type de retour de ShowRegS et surtout faire retourner une valeur à cette fonction. Mais je ne sais pas ce que tu controles, tu n'initialises nulle part ta variable.
    0
    1. BV91 Messages postés 16 Statut Membre
       
      Salut et merci pour ta réponse !

      Pour le type de retour de ShowRegS, je ne sais pas quel type il faut mettre. J'ai essayé void (comme je fais juste de l'affichage) mais ça ne marche pas... J'ai donc ajouté un "return" à ShowRegS comme tu me l'as indiqué :
      int ShowRegS()    
          {    
            struct MonRegistre registre; // registre est de type MonRegistre    
            scanf("%llu", &registre); // je demande à l'utilisateur de me donner une valeur pour le registre 
            printf("%llu",registre.c1);    
            printf("%llu",registre.c2);    
            printf("%llu",registre.c3);    
            printf("%llu",registre.c4);    
      
            return registre;    
          };


      Je suis consciente que int n'est pas compatible avec la structure "registre" que je "return"... Y aurait-il une façon pour donner le bon type de retour à ma fonction ShowRegS ?

      J'ai oublié d'initialiser la variable "registre" à contrôler. En effet, la structure registre que je dois contrôler est le output de la fonction ShowRegS :

      bool Number2RegS()    
          {   
            struct MonRegistre registre;   
            registre = ShowRegS();   
      
            if(isdigit(registre.c1) == 0) // sin non, retourner un booléen faux   
              {   
               return false;   
              }     
            if(isdigit(registre.c2) == 0)    
              {   
               return false;   
              }    
            if(isdigit(registre.c3) == 0)    
              {   
               return false;   
              }    
            if(isdigit(registre.c4) == 0) // sin non, retourner un booléen faux   
              {   
               return false;   
              }    
      
          }
      Merci encore.
      0
    2. Utilisateur anonyme
       
      déclare ta fonction de cette manière :

      MonRegistre ShowRegS()    


      PS : peux donner la déclaration de ta structure ?
      0
  2. Utilisateur anonyme
     
    salut !

    Je vais peu être dire n'importe quoi mais tu déclare un entier :
    int registre = 0;


    auquel tu attribut une valeur :
    registre = ShowRegS();


    Je suppose que showRegS renvoi un entier (ce qui n'est pas le cas)
    ensuite tu fais :

    registre.c4


    Sur un int c'est pas possible (d'où le message), mais sur ta structure oui.

    de même, petite note : tu déclare ta fonction qui retourne un entier :

    int Number2RegS()


    Mais tu renvois un booléen (ce qui en soit n'est pas faux, mais c'est pas top) Seulement si tu rentre dans un de tes tests, mais pas dans le cas ou aucuns test n'est vérifié.

    Essaye plutot :

    bool Number2RegS()   
        {   
          if(isdigit(ShowRegS().c1) == 0) // sin non, retourner un booléen faux   
            {   
             return false;   
            }     
          if(isdigit(ShowRegS().c2) == 0)    
            {   
             return false;   
            }    
          if(isdigit(ShowRegS().c3) == 0)    
            {   
             return false;   
            }    
          if(isdigit(ShowRegS().c4) == 0) // sin non, retourner un booléen faux   
            {   
             return false;   
            }   
       return true;   
        }


    ou : (si la portée de ta strucutre le permet)

     bool Number2RegS()   
        {   
          MonRegistre registre = ShowRegS();   
          if(isdigit(registre .c1) == 0) // sin non, retourner un booléen faux   
            {   
             return false;   
            }     
          if(isdigit(registre .c2) == 0)    
            {   
             return false;   
            }    
          if(isdigit(registre .c3) == 0)    
            {   
             return false;   
            }    
          if(isdigit(registre .c4) == 0) // sin non, retourner un booléen faux   
            {   
             return false;   
            }   
       return true;   
        }


    naga
    0
    1. BV91 Messages postés 16 Statut Membre
       
      Merci naga pour ta réponse !

      En effet, je me suis emmêlé les pinceux... :$

      J'ai donc changé le type de retour de Number2RegS pour qu'il devienne "bool".
      La variable registre n'est pas de type int, plutôt il s'agit d'une structure.
      0
    2. Utilisateur anonyme
       
      la valeur de retour de la fonction "ShowRegS()" l'est en effet, mais au dessus du déclare un int.

      ecris :
      MonRegistre registre;
      registre = ShowRegS();   


      à la place de

      int registre=0;
      registre = ShowRegS();   


      et dis moi si tu as toujours l'erreur.
      0
    3. BV91 Messages postés 16 Statut Membre
       
      J'ai corrigé la déclaration de mes variables.
      Comme je l'ai dit là-haut, il faut que le type de ma fonction ShowRegS soit une structure sinon error C2115: 'return' : incompatible types... :(
      0
    4. Utilisateur anonyme
       
      ah mais j'ai raté quelque chose !

      déjà :
      int ShowRegS()
          {
            struct MonRegistre registre; // registre est de type MonRegistre
            printf("%llu",registre.c1);
            printf("%llu",registre.c2);
            printf("%llu",registre.c3);
            printf("%llu",registre.c4);
          }

      ne renvois rien, donc bon.
      tu souhaites tester c1,c2,c3 et c4

      essaye donc :

      int[] ShowRegS()
          {
            int[] a = news int[4];
            struct MonRegistre registre; // registre est de type MonRegistre
            printf("%llu",registre.c1);
            printf("%llu",registre.c2);
            printf("%llu",registre.c3);
            printf("%llu",registre.c4);
            a[0]=registre.c1;
            a[1]=registre.c2;
            a[2]=registre.c3;
            a[3]=registre.c4;
      return a;
          }


      avec

       bool Number2RegS()   
          {   
            int[] registre = ShowRegS();   
            if(isdigit(registre[0]) == 0) // sin non, retourner un booléen faux   
              {   
               return false;   
              }     
            if(isdigit(registre[1]) == 0)    
              {   
               return false;   
              }    
            if(isdigit(registre[2]) == 0)    
              {   
               return false;   
              }    
            if(isdigit(registre[3]) == 0) // sin non, retourner un booléen faux   
              {   
               return false;   
              }   
         return true;   
          }
      


      après tu n'initalise pas le registre :
            struct MonRegistre registre; // registre est de type MonRegistre
            printf("%llu",registre.c1);
            printf("%llu",registre.c2);
            printf("%llu",registre.c3);
            printf("%llu",registre.c4);


      peut-être voulais-tu faire un "scanf" ?
      0
    5. BV91 Messages postés 16 Statut Membre
       
      Donc on enregistre les valeurs du registre dans un tableau ?
      J'ai une erreur de syntaxe par contre : error C2059: syntax error : '[' au tout début de la fonction ShowRegS :
      int[] a = news int[4]; 


      J'ai ajouté une ligne de scanf aussi :
      struct MonRegistre registre; // registre est de type MonRegistre       
      scanf("%llu", & registre); // je demande à l'utilisateur de me donner une valeur pour le registre 


      Et pareil aussi pour le commencement de la fonction Number2RegS :
      int[] registre = ShowRegS();
      j'ai cette erreur : error C2143: syntax error : missing ';' before '['
      0
  3. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    Quelle prise de tête pour rien ! Il suffit simplement de retourner la structure !
    struct MonRegistre ShowRegS()    
        {    
          struct MonRegistre registre; // registre est de type MonRegistre    
          scanf("%llu", &registre); // je demande à l'utilisateur de me donner une valeur pour le registre 
          printf("%llu",registre.c1);    
          printf("%llu",registre.c2);    
          printf("%llu",registre.c3);    
          printf("%llu",registre.c4);    
    
          return registre;    
        };

    Es tu sur que ton scanf va bien faire ce que tu attends de lui ? a mon avis, il ne t'initialisera que "c1", d'après les langueurs que tu écris dans tes fonctions.
    0
    1. BV91 Messages postés 16 Statut Membre
       
      Prise de tête pour moi, oui, car je démarre... :-)
      Merci pour ta réponse qui m'a fait sortir du tourbillon !
      0
  4. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    Salut BV91,

    Juste une observation en passant, indépendante de ta question (à laquelle, je crois, on est bien en mal de répondre car tout est très confus, et on n'a que des bouts de code peu cohérents).

    Si tu fais ta "modélisation" de code pour du C destiné à être embarqué, reste vraiment sur du C pur, pas de mélanges avec C++, et sur un standard conservateur (C89). Le travail d'adaptation sera moins important.

    "true" ou false" n'existent pas (faux est 0, et vrai toute valeur autre que 0).

    new (c'est quoi "news" ?) c'est du C++, l'allocation de mémoire c'est avec malloc

    Dal
    0
    1. Utilisateur anonyme
       
      c'est quoi "news" ?

      un faute de frappe ...
      0
    2. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      Autre chose BV91, si on se fie à ton scanf, le contenu de la struct c1, c2, c3 et c4 seraient des "unsigned long long int". c'est pas un peu gros pour des "registres" ?

      De plus, si tu testes avec isdigit, ce sont des valeurs ASCII de caractères de 0 à 9 qui sont testées... c1, c2, c3 et c4 ce ne serait pas pour caractère 1, caractère 2, caractère 3, et caractère 4 ?

      Si c1, c2, c3 et c4 sont sensés être des représentations ASCII de chiffres de 0 à 9, char me parait être le type à utiliser pour ta structure.

      Mais... ton "registre" ne va pas contenir des chars, mais un entier sur 16 bits.

      Donc, comme évoqué dans ce sujet précédent, cela suppose que tu te fasses une fonction qui prend en entrée un entier, vérifie qu'il est entre 0 et 9999 et renvoie une chaîne de caractères avec sprintf(chaine, "%04d", contenu_reg);

      Mais bon, c'est toi qui vois ce que tu veux faire et comment :-)


      Dal
      0