passage pointeur de struct en argument

passage pointeur de struct en argument - C - Programmation

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:

Code :
  1. typedef struct VOICEBOXMSG{
  2. int num;
  3. char state[15];
  4. char sender[15];
  5. char date[11];
  6.  char file[50];
  7. }VOICEBOXMSG_T;


 
dans mon main g:

Code :
  1. int main(void){
  2.    VOICEBOXMSG_T *msgList;
  3.    msgList = readMsg(msgList);
  4.    return(0);
  5. }


 
avec readMsg correspondant à ca:

Code :
  1. VOICEBOXMSG_T *readMsg(VOICEBOXMSG_T *msg){
  2.     msg = new VOICEBOXMSG_T[4];
  3.     return(msg);
  4. }


 
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
Reply

Marsh Posté le 20-04-2004 à 15:41:23   

Reply

Marsh Posté le 20-04-2004 à 15:57:47    

c'est du C :o

Reply

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?

Reply

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

Reply

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();
}

Reply

Marsh Posté le 20-04-2004 à 16:49:27    

euh... et ça compile ça? :heink:
 
msgRead retourne un VOICEBOXMSG_T* et pourtant tu retourne un VOICEBOXMSG_T ... que tu stockes dans un VOICEBOXMSG_T ...

Reply

Marsh Posté le 20-04-2004 à 18:22:17    

g oublier "*": VOICEBOXMSG_T *msgList

Reply

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 :
  1. CparminGEN *cInMain;
  2. CparmoutGEN *cOutMain;
  3.    
  4. CparminGEN    cInMainArea;
  5. CparmoutGEN   cOutMainArea;
  6. /* Init parameter area  */
  7. cInMain  = &cInMainArea;
  8. cOutMain = &cOutMainArea;
  9. memset(cInMain  , '', sizeof(cInMainArea)  );
  10. memset(cOutMain , '', sizeof(cOutMainArea) );
  11.    
  12.    
  13. cInMain.CORE_FCT = "GEN"; /*l'erreur se trouve sur cette ligne*/
  14. [...] /*même chose que la ligne du dessus*/
  15. MSCRGS01(cInMain, cOutMain);


La structure en question :

Code :
  1. typedef struct
  2. {
  3.   char CORE_FCT[FC_L+1];
  4.   char CORE_FICIN[FN_L+1];
  5.   char CORE_TYPE_FIC;
  6.   char CORE_LG_REC[REC_L+1];
  7.   char CORE_TYPE_DATA;
  8.   char CORE_TYPE_LC;
  9.   char CORE_TYPE_RC;
  10.   char CORE_TYPE_SIG;
  11.   char CORE_FIC_SIG[FN_L+1];
  12.   char CORE_SHA_ALGO;
  13. } CparminGEN, *pCparminGEN;


Sachant que je ne dois pas toucher à la structure.


---------------
Everything burns. | Where life had no value, death, sometimes, had its price.
Reply

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 :
  1. strcpy(cInMain.CORE_FCT, "GEN" );


Reply

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é.
 
Bon, à tout hasard (mais bordel de merde, lis la doc associée à cette foutue fonction) :
 


Tu supputes mal.
Je suis juste complètement à la rue en ce qui concerne mes souvenirs des pointeurs et autres affectations.
Ok, sinon.
Merci.


---------------
Everything burns. | Where life had no value, death, sometimes, had its price.
Reply

Marsh Posté le 22-04-2008 à 17:29:22   

Reply

Marsh Posté le 22-04-2008 à 17:37:52    

Bon, finalement, je reste sur la même erreur, malgré le strcpy. [:transparency]


---------------
Everything burns. | Where life had no value, death, sometimes, had its price.
Reply

Marsh Posté le 22-04-2008 à 17:43:31    

  • le strcpy() était effectivement nécessaire


  • cInMain c'est un struct*, pas un struct. Utilise (*cInMain).champ ou cInMain->champ

Reply

Marsh Posté le 22-04-2008 à 20:13:07    

Elmoricq a écrit :

  • le strcpy() était effectivement nécessaire


  • cInMain c'est un struct*, pas un struct. Utilise (*cInMain).champ ou cInMain->champ

Hello toi.
J'avais testé le ...->..., sans résultat. Mais dans le strcpy donc... [:transparency]  
Je teste demain matin.


---------------
Everything burns. | Where life had no value, death, sometimes, had its price.
Reply

Marsh Posté le 23-04-2008 à 09:58:56    

yo_play a écrit :

Hello toi.
J'avais testé le ...->..., sans résultat. Mais dans le strcpy donc... [:transparency]  
Je teste demain matin.


Bon.
Ca fonctionne bien. [: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. :o


---------------
Everything burns. | Where life had no value, death, sometimes, had its price.
Reply

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 ?

Reply

Marsh Posté le 23-04-2008 à 10:25:37    

Elmoricq a écrit :

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 ?


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... [:transparency]  
Voilà pour le code:

Code :
  1. strcpy(cInMain->CORE_TYPE_FIC, "F" );


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 :
  1. typedef struct
  2. {
  3.   char CORE_FCT[FC_L+1];
  4.   char CORE_FICIN[FN_L+1];
  5.   char CORE_TYPE_FIC;
  6.   char CORE_LG_REC[REC_L+1];
  7.   char CORE_TYPE_DATA;
  8.   char CORE_TYPE_LC;
  9.   char CORE_TYPE_RC;
  10.   char CORE_TYPE_SIG;
  11.   char CORE_FIC_SIG[FN_L+1];
  12.   char CORE_SHA_ALGO;
  13. } CparminGEN, *pCparminGEN;


---------------
Everything burns. | Where life had no value, death, sometimes, had its price.
Reply

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

Message cité 1 fois
Message édité par Elmoricq le 23-04-2008 à 10:35:15
Reply

Marsh Posté le 23-04-2008 à 10:39:43    

Elmoricq a écrit :

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 ( '' ).
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


Impeccable. [:bodette]  
Merci. [:prodigy]


---------------
Everything burns. | Where life had no value, death, sometimes, had its price.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed