Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1604 connectés 

  FORUM HardWare.fr
  Programmation
  C

  passage pointeur de struct en argument

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

passage pointeur de struct en argument

n°703987
da_s_monk
Awwwww! Good Job!
Posté le 20-04-2004 à 15:41:23  profilanswer
 

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
mood
Publicité
Posté le 20-04-2004 à 15:41:23  profilanswer
 

n°704028
Taz
bisounours-codeur
Posté le 20-04-2004 à 15:57:47  profilanswer
 

c'est du C :o

n°704040
da_s_monk
Awwwww! Good Job!
Posté le 20-04-2004 à 16:01:09  profilanswer
 

ok donc maintenant que c dans la bonne catégorie, qqun aurait-t-il une réponse?

n°704046
Taz
bisounours-codeur
Posté le 20-04-2004 à 16:09:27  profilanswer
 

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

n°704092
da_s_monk
Awwwww! Good Job!
Posté le 20-04-2004 à 16:45:50  profilanswer
 

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

n°704100
Moktar1er
No one replies...
Posté le 20-04-2004 à 16:49:27  profilanswer
 

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 ...

n°704175
da_s_monk
Awwwww! Good Job!
Posté le 20-04-2004 à 18:22:17  profilanswer
 

g oublier "*": VOICEBOXMSG_T *msgList

n°1722069
yo_play
Posté le 22-04-2008 à 17:11:22  profilanswer
 

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.
n°1722099
tpierron
Posté le 22-04-2008 à 17:24:39  profilanswer
 

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" );


n°1722110
yo_play
Posté le 22-04-2008 à 17:29:22  profilanswer
 

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.
mood
Publicité
Posté le 22-04-2008 à 17:29:22  profilanswer
 

n°1722118
yo_play
Posté le 22-04-2008 à 17:37:52  profilanswer
 

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.
n°1722125
Elmoricq
Modérateur
Posté le 22-04-2008 à 17:43:31  profilanswer
 

  • le strcpy() était effectivement nécessaire


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

n°1722255
yo_play
Posté le 22-04-2008 à 20:13:07  profilanswer
 

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.
n°1722613
yo_play
Posté le 23-04-2008 à 09:58:56  profilanswer
 

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.
n°1722626
Elmoricq
Modérateur
Posté le 23-04-2008 à 10:20:36  profilanswer
 

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 ?

n°1722634
yo_play
Posté le 23-04-2008 à 10:25:37  profilanswer
 

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.
n°1722641
Elmoricq
Modérateur
Posté le 23-04-2008 à 10:32:45  profilanswer
 

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
n°1722646
yo_play
Posté le 23-04-2008 à 10:39:43  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  passage pointeur de struct en argument

 

Sujets relatifs
[ADA] pointeur de lignepassage de variable par url avec esay php
probleme pointeur void alors qu'un cast de char* marche :\passage d'un tableau php parametre à une fonction javascript
probleme de passage de fonction en parametresprobleme avec pointeur sur objet
[c/c++] pointeur de method ?? est ce que c'est possible??[perl-cgi] Passage de parametres
affectation de pointeur[PHP] commande exec() et passage d'arguments
Plus de sujets relatifs à : passage pointeur de struct en argument


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR