passage pointeur de struct en argument - C - Programmation
Marsh Posté le 20-04-2004 à 16:01:09
ok donc maintenant que c dans la bonne catégorie, qqun aurait-t-il une réponse?
Marsh Posté le 20-04-2004 à 16:09:27
cvompilateur de marne. ton code n'a ni queue ni tete (à quoi donc sert ton paramètre) et ton super compilateur pète un cable
Marsh Posté le 20-04-2004 à 16:45:50
bon en effet j'avais fait de la m****.
VOICEBOXMSG_T *msgRead(){
VOICEBOXMSG_T msg;
msg = new VOICEBOXMSG_T[4];
return msg;
}
void main(){
VOICEBOXMSG_T msgList;
msgList = msgRead();
}
Marsh Posté le 20-04-2004 à 16:49:27
euh... et ça compile ça?
msgRead retourne un VOICEBOXMSG_T* et pourtant tu retourne un VOICEBOXMSG_T ... que tu stockes dans un VOICEBOXMSG_T ...
Marsh Posté le 22-04-2008 à 17:11:22
Bonjour à tous,
Je sais pas trop où le poster, et je voulais pas créer un topic rien que pour ma question, qui plus est celui-ci doit pouvoir servir dans mon cas.
Je cherche à mettre en paramètre une structure, que je remplis. C'est au niveau du remplissage que ça plante.
J'ai pas réussit à trouver d'infos sur cette erreur jusqu'à maintenant.
J'obtiens les erreurs suivantes qui se ressemblent, je mets la première :
Citation : line 1298.3: 1506-021 (S) Expecting struct or union. |
Mon code étant :
Code :
|
La structure en question :
Code :
|
Sachant que je ne dois pas toucher à la structure.
Marsh Posté le 22-04-2008 à 17:24:39
Oué, c'est vraiment la base du C, affecter une chaine de caractère. Je suppute que tu ne sais pas qu'une chaine en C est un tableau. Qu'un tableau se manipule par adresse et pas par valeur. Et donc qu'une affectation n'a aucun sens, et qu'il faut donc utiliser une fonction dédiée. Je n'irais pas te proposer strcpy() (ou pire strncpy), du fait de ton manque d'expérience, il y a une très forte probabilité que tu vas utiliser une de ces fonctions n'importe comment, avec de magnifique tirage de balle dans le pied qui ne manqueront pas d'égayer ce forum, et des heures de tortures pour débugger le bordel associé.
Bon, à tout hasard (mais bordel de merde, lis la doc associée à cette foutue fonction) :
Code :
|
Marsh Posté le 22-04-2008 à 17:29:22
tpierron a écrit : Oué, c'est vraiment la base du C, affecter une chaine de caractère. Je suppute que tu ne sais pas qu'une chaine en C est un tableau. Qu'un tableau se manipule par adresse et pas par valeur. Et donc qu'une affectation n'a aucun sens, et qu'il faut donc utiliser une fonction dédiée. Je n'irais pas te proposer strcpy() (ou pire strncpy), du fait de ton manque d'expérience, il y a une très forte probabilité que tu vas utiliser une de ces fonctions n'importe comment, avec de magnifique tirage de balle dans le pied qui ne manqueront pas d'égayer ce forum, et des heures de tortures pour débugger le bordel associé. |
Tu supputes mal.
Je suis juste complètement à la rue en ce qui concerne mes souvenirs des pointeurs et autres affectations.
Ok, sinon.
Merci.
Marsh Posté le 22-04-2008 à 17:37:52
Bon, finalement, je reste sur la même erreur, malgré le strcpy.
Marsh Posté le 22-04-2008 à 17:43:31
Marsh Posté le 22-04-2008 à 20:13:07
Elmoricq a écrit :
|
Hello toi.
J'avais testé le ...->..., sans résultat. Mais dans le strcpy donc...
Je teste demain matin.
Marsh Posté le 23-04-2008 à 09:58:56
yo_play a écrit : Hello toi. |
Bon.
Ca fonctionne bien.
Sauf dans le cas où c'est de longueur 1.
Citation : line 1298.24: 1506-280 (W) Function argument assignment between types "unsigned char*" and "unsigned char" is not allowed. |
Un dernier coup de main et c'est bon.
Marsh Posté le 23-04-2008 à 10:20:36
strcpy() prend deux arguments : char* (destination), et const char* (source).
Difficile donc d'utiliser cette fonction pour remplir un unsigned char.
Un char (unsigned ou signed peu importe) est un type de base, tout comme int, double, long, etc. Une simple assignation fait l'affaire.
Par contre je ne vois pas de tel type de donnée dans ta structure, peux-tu montrer le code correspondant à cette erreur ?
Marsh Posté le 23-04-2008 à 10:25:37
Elmoricq a écrit : strcpy() prend deux arguments : char* (destination), et const char* (source). |
Ouai mais la simple assignation, c'est comme dans mon code au départ, dans mon premier post, et il me mettait bien une erreur...Ou alors j'ai pas compris la simple assignation que tu désignes...
Voilà pour le code:
Code :
|
Et pour la structure, certaines ont une longueur de 4, 45, ou 200 quand il y a des crochets, les autres sont de 1 quand il n'y a pas de crochet :
Code :
|
Marsh Posté le 23-04-2008 à 10:32:45
CORE_FCT est un char[], soit un tableau de char.
CORE_TYPE_FIC est un char.
Ce sont donc deux types différents. Pour le premier il faut utiliser strcpy(), qui va parcourir le deuxième argument et recopier un par un chaque char dans le premier argument.
De plus, en C, une chaîne de caractère est TOUJOURS terminée par un caractère nul ( '\0' ).
En effet, on dit "chaîne de caractères" mais en vrai ça n'existe pas en C, l'objet que l'on utilise est constitué uniquement d'une suite de caractères. Et le seul moyen de savoir où ça se termine, c'est de repérer ce caractère nul. S'il n'y en a pas, la lecture continue jusqu'à ce qu'un caractère nul est trouvé, ce qui donne un comportement aléatoire (des fois ça marche, des fois ça donne n'importe quoi, des fois ça crash).
Donc, pour stocker 1 caractère dans une chaîne, en C, il faut que l'espace alloué accepte au moins DEUX caractères : un pour le caractère, et un pour le nul terminal.
Pour résumer :
char[] et char* : strcpy
char : assignation
Petit lien qui explique ça très bien : http://mapage.noos.fr/emdel/notes.htm#char_star
Marsh Posté le 23-04-2008 à 10:39:43
Elmoricq a écrit : CORE_FCT est un char[], soit un tableau de char. |
Impeccable.
Merci.
Marsh Posté le 20-04-2004 à 15:41:23
Bonjour a tous!
bon alors moi g un petit probleme avec les pointeurs... je vous explique:
g cette structure:
dans mon main g:
avec readMsg correspondant à ca:
donc en gros ce que je veux faire c: déclarer un pointeur vers VOICEBOXMSG_T. envoyer ce pointeur vers une fonction, qui va le faire pointer vers un tableau de 4 VOICEBOXMSG_T, et le récupérer.
la compilation passe nickel (pas d'erreur, pas de warning). Par contre quand je le lance, ca plante le prog et ca me dis: "Run-Time Check Failure #3 - The variable 'msgList' is being used without being defined.". Visual dit que ca plante la "msgList = readMsg(msgList);". G essayer de faire en sorte que ca ne renvoies rien (readMsg en void), et c à l'envoies que ca plante
alors voila je comprend pas trop. si qqun à une solution je suis preneur :-)
Message édité par da_s_monk le 20-04-2004 à 15:59:12