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

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°757301
weed
Posté le 08-06-2004 à 23:13:37  profilanswer
 

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
mood
Publicité
Posté le 08-06-2004 à 23:13:37  profilanswer
 

n°757313
theshockwa​ve
I work at a firm named Koslow
Posté le 08-06-2004 à 23:22:57  profilanswer
 

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
n°757391
weed
Posté le 09-06-2004 à 02:33:14  profilanswer
 

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

n°757394
theshockwa​ve
I work at a firm named Koslow
Posté le 09-06-2004 à 03:16:53  profilanswer
 

: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
n°757398
weed
Posté le 09-06-2004 à 04:37:16  profilanswer
 

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
mood
Publicité
Posté le 09-06-2004 à 04:37:16  profilanswer
 

n°757791
theshockwa​ve
I work at a firm named Koslow
Posté le 09-06-2004 à 13:50:32  profilanswer
 

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

n°758093
weed
Posté le 09-06-2004 à 16:13:05  profilanswer
 

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

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

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

 

Sujets relatifs
[PHP] - ereg() toujours flou dans ma tete -> RESOLURencontre HFR: où ? (à part DTC bien sur)
Comment appeler une fonction à l'aide d'un pointeur sur cette fonctionfonction pour connexion serveur + regex
[shell-Linux] Connection à un serveur ftp [resolu][HTML/CSS][RESOLU]Changer la couleur d'un <INPUT>
[PHP/MySQL] - Afficher plusieurs nom d'un champs qu'une ... (RESOLU)Java-Oracle et JSp besoin d'aide [RESOLU]
aide ASP pour un débutant. [Résolu][Websphere] fonction split() de la classe String non implémenté ?
Plus de sujets relatifs à : [resolu]Ais je bien passer les arguments par adresse à ma fonction ?


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