Erreur Structure - left of ... must have struct/union type
Résolu
BV91
Messages postés
15
Date d'inscription
Statut
Membre
Dernière intervention
-
BV91 Messages postés 15 Date d'inscription Statut Membre Dernière intervention -
BV91 Messages postés 15 Date d'inscription Statut Membre Dernière intervention -
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" :
Le code de la fonction "ShowRegS" que j'appelle est le suivant :
Quand je compile le code, j'ai une erreur : error C2224: left of '.c1' must have struct/union type au niveau de la ligne
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 !
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 !
A voir également:
- Expression must have struct or union type
- Or - Guide
- Trait d'union insécable word - Guide
- Bbox must - Accueil - Guide box et connexion Internet
- Expression écrite cm1 cm2 télécharger gratuit - Télécharger - Éducatifs
- Clear type - Guide
4 réponses
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.
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.
salut !
Je vais peu être dire n'importe quoi mais tu déclare un entier :
auquel tu attribut une valeur :
Je suppose que showRegS renvoi un entier (ce qui n'est pas le cas)
ensuite tu fais :
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 :
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 :
ou : (si la portée de ta strucutre le permet)
naga
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
ah mais j'ai raté quelque chose !
déjà :
ne renvois rien, donc bon.
tu souhaites tester c1,c2,c3 et c4
essaye donc :
avec
après tu n'initalise pas le registre :
peut-être voulais-tu faire un "scanf" ?
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" ?
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 :
J'ai ajouté une ligne de scanf aussi :
Et pareil aussi pour le commencement de la fonction Number2RegS :
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 '['
Quelle prise de tête pour rien ! Il suffit simplement de retourner la structure !
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.
struct MonRegistre ShowRegS() { struct MonRegistre registre; // registre est de type MonRegistre scanf("%llu", ®istre); // 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.
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
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
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
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
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é :
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 :
Merci encore.
PS : peux donner la déclaration de ta structure ?