Erreur Structure - left of ... must have struct/union type [Résolu/Fermé]

Signaler
Messages postés
15
Date d'inscription
vendredi 12 avril 2013
Statut
Membre
Dernière intervention
21 mai 2013
-
Messages postés
15
Date d'inscription
vendredi 12 avril 2013
Statut
Membre
Dernière intervention
21 mai 2013
-
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

Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 283
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.
Messages postés
15
Date d'inscription
vendredi 12 avril 2013
Statut
Membre
Dernière intervention
21 mai 2013

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.
Messages postés
4270
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
4 mars 2021
209
déclare ta fonction de cette manière :

MonRegistre ShowRegS()    


PS : peux donner la déclaration de ta structure ?
Messages postés
4270
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
4 mars 2021
209
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
Messages postés
4270
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
4 mars 2021
209
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.
Messages postés
15
Date d'inscription
vendredi 12 avril 2013
Statut
Membre
Dernière intervention
21 mai 2013

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... :(
Messages postés
4270
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
4 mars 2021
209
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" ?
Messages postés
15
Date d'inscription
vendredi 12 avril 2013
Statut
Membre
Dernière intervention
21 mai 2013

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 '['
Messages postés
4270
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
4 mars 2021
209
arf j'ai mis un 's' en trop .
et comme le dit dal :
new (c'est quoi "news" ?) c'est du C++, l'allocation de mémoire c'est avec malloc 


pas fais gaffe an langage ^^
et en fait ca sera plus simple de déclarer de cette manière :
int a[4];


mais c'est seulement dans le cas où tu ne souhaite pas retourner ta structure en valeur de retour. Sinon, regarde plus haut =)
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 283
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.
Messages postés
15
Date d'inscription
vendredi 12 avril 2013
Statut
Membre
Dernière intervention
21 mai 2013

Prise de tête pour moi, oui, car je démarre... :-)
Merci pour ta réponse qui m'a fait sortir du tourbillon !
Messages postés
5541
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
7 mai 2021
933
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
Messages postés
4270
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
4 mars 2021
209
c'est quoi "news" ?

un faute de frappe ...
Messages postés
5541
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
7 mai 2021
933
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