[resolu]Ais je bien passer les arguments par adresse à ma fonction ?

Ais je bien passer les arguments par adresse à ma fonction ? [resolu] - C - Programmation

Marsh Posté le 08-06-2004 à 23:13:37    

je viens de me rendre que lorsque je fais une affectation dans entete, l'affectaion n'est pas prise en compte lorsque je sors de la fonction .. J'ai pourtant bien passer l'adresse de entete, non ????
 
 

Code :
  1. void affectation_envoi (int fenetre, char *data, char **entete) 
  2.     { 
  3.          char *tmp_entete; 
  4.          
  5.          //allocation de tmp_entete   
  6.          if (data == NULL) 
  7.          {   
  8.               tmp_entete = (char *) malloc (6*32+1); 
  9.               tmp_entete[192]='\0'; 
  10.          } 
  11.          else 
  12.          { 
  13.               tmp_entete = malloc (strlen(data)+1); 
  14.               tmp_entete[strlen(data)]='\0'; 
  15.          } 
  16.          
  17.                 //............   
  18.          //affectation de valeur dans tmp_entete   
  19.                 //...........   
  20.      entete = strdup (tmp_entete);
  21.      free(tmp_entete);   
  22.       printf("\n affichage du nouvel entete :\n" );
  23. affichage (entete); //<====== affichage avant  
  24.     }


 
 
et le main ()

Code :
  1. affectation_envoi (2,NULL,&buf);
  2. affichage (buf);   //<========== affichage apres


 
EDIT : retification de l'entete


Message édité par weed le 09-06-2004 à 02:33:37
Reply

Marsh Posté le 08-06-2004 à 23:13:37   

Reply

Marsh Posté le 08-06-2004 à 23:22:57    

non ...  :pfff:
 

Code :
  1. void affectation_envoi (char *data, char **entete )
  2. {
  3.   // ...
  4. }


 
dans le main :
 

Code :
  1. affectation_envoi{NULL, &buff);


 
à la limite ...


Message édité par theshockwave le 08-06-2004 à 23:25:16
n°757327
weed
Posté le 08-06-2004 à 23:47:44  profilanswer
 

un grand merci a toi ..
 
mais j'obtiens  
"In function `main':
c:548: warning: passing arg 3 of `affectation_envoi' from incompatible pointer type"
 

Code :
  1. avec affectation_envoi (NULL,&buf);
  2. ou affectation_envoi (NULL,buf);


Message édité par weed le 08-06-2004 à 23:49:07
n°757330
weed
Posté le 08-06-2004 à 23:49:43  profilanswer
 

et entete est declarer comme ca en simple pointeur :
char    *entete = malloc ( bits * sizeof (int)+1);

n°757353
weed
Posté le 09-06-2004 à 00:13:29  profilanswer
 

je rectifie parce que cela me semblait bizzare avec l'erreur car il parle de type de pointeur incompatible sur le 3ème argument ...
 
j'avais supprimer un argument pour que ce soit plus lisible  
 
l'entete de la fonction est :
void affectation_envoi (int fenetre, char *data, char **entete)  
et j'appelle la fonction comme ca :
affectation_envoi (2,NULL,&buf);

n°757362
theshockwa​ve
I work at a firm named Koslow
Posté le 09-06-2004 à 00:24:28  profilanswer
 

donne la déclaration de buffer, juste pour voir

n°757386
weed
Posté le 09-06-2004 à 01:23:42  profilanswer
 

bon apparrement tu avais raison, j'avais declaré le buffer en tableau, je viens de faire avec un malloc est ca fonctionne mais par contre maintenant j'ai plein de truc bizzare a l'affichage  
 

Citation :

tmp_entete :
U  å W V S è
 affichage du nouvel entete :
 
 affichage en ligne 8x@
U  å W V S è
buf juste avant envoi :
U  å W V S è


 
alors que l'on devrait voire apparaitre des 0 et des 1. Je pense que c'est l'affciahge d'une adresse ou quelque chose de ce genre.
 
dans ma fonction j'ai mis :

Code :
  1. void affectation_envoi (int fenetre, char *data, char **entete)
  2. {
  3. strncpy (&tmp_entete[psource.position], entete[pdesti.position ]|/g],psource.lg);
  4. strncpy (&tmp_entete[pdesti.position],[g] entete[psource.position] ,psource.lg);
  5. }


je pense que c'est ca ? entete[psource.position] ? non ?


Message édité par weed le 09-06-2004 à 01:31:48
Reply

Marsh Posté le 09-06-2004 à 02:33:14    

c'est bon en fait j'ai trouvé
je me suis fais un petit dessin pour mieux me representer  
et c'est en fait la  
la valeur pointer de entete (*entete) + n

Reply

Marsh Posté le 09-06-2004 à 03:16:53    

:heink:
 
tu fais un malloc ... et tu écrases toujours le pointeur passé en param avec ton strdup ? ca va te faire une méchante fuite mémoire, ca ...
 
Edit : enfin, le peu de code que tu as posté semble assez bancal, j'aurais peur de lire le reste ...


Message édité par theshockwave le 09-06-2004 à 03:22:44
Reply

Marsh Posté le 09-06-2004 à 04:37:16    

je comprends pas du tout ce que ce que tu veux dire :
*entete = strdup (tmp_entete);
 
je passe l'adresse du premier caractere à strdup. strdup me renvoie un char*, l'adresse du premeir caractere du nouveau bloc ...
 
strdup copie les block et non pas les données, je pense. Donc apres je peux faire un free, je pense puisque je n'utilise plus les blocks de données que pointés tmp_entete
free(tmp_entete);  
tu veux parler de ce free  
 
EDIT : on ne copie l'adresse du premier element de tmp_entete dans *entete


Message édité par weed le 09-06-2004 à 04:40:40
Reply

Marsh Posté le 09-06-2004 à 04:37:16   

Reply

Marsh Posté le 09-06-2004 à 13:50:32    

je voudrais bien voir ce que tu fais de ta variable buff avant l'appel à ta fonction

Reply

Marsh Posté le 09-06-2004 à 16:13:05    

Code :
  1. if ((numbytes=recv(new_fd, buf, MAXDATASIZE, 0)) == -1)
  2.  {
  3.   perror("\nrecv_serveur\n" );
  4.   exit(1);
  5.  }
  6.  buf[numbytes] = '\0';
  7.  printf("\nreception de :\n" );
  8.  affichage(buf);
  9.  // j'extraie les differentes de valeur que buf contient et j'affecte ces valeurs dans des variables globales, d'ou le pourquoi j'ai un seul parametre
  10.  affectation_seg(buf);
  11.  if (seg.c_ack == 0 && seg.syn == 1)
  12.  {
  13.   printf("\nDebut de connexion\n" );
  14.   //random de snd.iss qui est le numéro de séquence initial  
  15.   snd.wnd    = 3;  //3 octets
  16.   snd.iss = 523;
  17.   //initialisation de variable
  18.   initialisation_send ();
  19.   //modification de buf avant d'etre envoyé
  20.   affectation_envoi (2,NULL,&buf);
  21.   printf("\n envoie du paqueti :\n" );
  22.   affichage (buf);
  23.   if (send(new_fd, buf, strlen(buf), 0) == -1)
  24.   {
  25.    perror("send" );
  26.   }
  27.  }


Message édité par weed le 09-06-2004 à 16:15:15
Reply

Sujets relatifs:

Leave a Replay

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

© 2018 Forum. All Rights Reserved.