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

Résolu/Fermé
BV91 Messages postés 15 Date d'inscription vendredi 12 avril 2013 Statut Membre Dernière intervention 21 mai 2013 - 19 avril 2013 à 10:48
BV91 Messages postés 15 Date d'inscription vendredi 12 avril 2013 Statut Membre Dernière intervention 21 mai 2013 - 20 avril 2013 à 18:36
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

Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
19 avril 2013 à 11:17
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
BV91 Messages postés 15 Date d'inscription vendredi 12 avril 2013 Statut Membre Dernière intervention 21 mai 2013
Modifié par BV91 le 19/04/2013 à 11:49
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
Utilisateur anonyme
19 avril 2013 à 13:34
déclare ta fonction de cette manière :

MonRegistre ShowRegS()    


PS : peux donner la déclaration de ta structure ?
0
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
BV91 Messages postés 15 Date d'inscription vendredi 12 avril 2013 Statut Membre Dernière intervention 21 mai 2013
19 avril 2013 à 11:38
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
Utilisateur anonyme
19 avril 2013 à 11:40
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
BV91 Messages postés 15 Date d'inscription vendredi 12 avril 2013 Statut Membre Dernière intervention 21 mai 2013
19 avril 2013 à 11:45
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
Utilisateur anonyme
19 avril 2013 à 11:53
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
BV91 Messages postés 15 Date d'inscription vendredi 12 avril 2013 Statut Membre Dernière intervention 21 mai 2013
Modifié par BV91 le 19/04/2013 à 12:04
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
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
19 avril 2013 à 12:13
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
BV91 Messages postés 15 Date d'inscription vendredi 12 avril 2013 Statut Membre Dernière intervention 21 mai 2013
20 avril 2013 à 18:36
Prise de tête pour moi, oui, car je démarre... :-)
Merci pour ta réponse qui m'a fait sortir du tourbillon !
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
19 avril 2013 à 13:04
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
Utilisateur anonyme
19 avril 2013 à 13:35
c'est quoi "news" ?

un faute de frappe ...
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 19/04/2013 à 15:44
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