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

  FORUM HardWare.fr
  Programmation
  C

  Passage de pointeurs en paramètre erronés !

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Passage de pointeurs en paramètre erronés !

n°649746
Khyna
Posté le 20-02-2004 à 13:45:37  profilanswer
 

Bonjour,
j'ai encore un petit soucis avec les pointeurs que je ne maitrise toujours pas completement...
 
J'ai deux fonctions, une fontion qui me charge une liste chainée (horizontalement et verticalement) et une fonction qui m'affiche cette liste dans le terminal.
 
Voici les signatures des méthodes :

Code :
  1. struct jour* chargeAgenda(char unFichier[100],struct jour **j)
  2. int afficher(struct jour *j)


 
En fait le problème est que qd j'appelle ma fontion afficher() de ma fonction chargeAgenda il m'affiche bien ma liste et il n'y a pas d'erreur.
Par contre qd j'efface cet appel de ma méthode chargeAgenda. et que je créé un main de ce type :
 

Code :
  1. int main (int argc, char **argv) {
  2.   struct jour *j;
  3. ...
  4. ...
  5.   j = chargeAgenda(argv[1],&j);
  6.   afficher(j);


 
Et benh la liste n'est plus du tout bonne, alors je charge a partir du meme fichier. Il me créé une liste infinie avec des valeurs complètement aléatoire.
 
Merci de me dépanner, je sais je pose beaucoup de poste. Mais la je suis vraiment bloquer.

mood
Publicité
Posté le 20-02-2004 à 13:45:37  profilanswer
 

n°649761
cedricbrun
Posté le 20-02-2004 à 13:59:18  profilanswer
 

Bon..déjà je vois pas pourquoi tu passe J et en paramètre, et en valeur de retour..
A priori c'est l'un ou l'autre mais pas les deux. (étant donné que tu ne renvoi qu'une chose, je dirais en valeur de retour)
 
Ensuite faudrait montrer un petit peu du code.. genre la fonction
chargeAgenda.
Dans chargeAgenda, voila ce que tu fais :  
t'alloue ta structure jour
tu la remplie avec les données de ton fichier
et tu la renvoi
return monBidouillage
 

n°649768
Khyna
Posté le 20-02-2004 à 14:11:21  profilanswer
 

Voici la fonction chargeAgenda, ne chambrer pas trop... je débute en C.. :pt1cable:  
 

Code :
  1. struct jour* chargeAgenda(char unFichier[100]) {
  2.  
  3.   struct jour *j;
  4.   int i = 2;// incrment pour les lignes.
  5.   struct rdv unRdv;//le rdv avec lequel on va commencer la liste.
  6.   double diff;//diffrence en seconde entre deux dates.Sert a tudier la chronologie.
  7.   struct jour *p;//pointeur qui nous permet de parcourir la liste.
  8.   struct jour *precedentP;//precedent du pointeur qui parcoure la liste.
  9.   time_t tTest;
  10.   j = malloc(sizeof(struct jour));
  11.   j->unRdvAgenda = malloc(sizeof(struct rdvAgenda));
  12.   j->jourSuivant = malloc(sizeof(struct jour));
  13.   p = malloc(sizeof(struct jour));
  14.   precedentP = malloc(sizeof(struct jour));
  15.   p->unRdvAgenda = malloc(sizeof(struct rdvAgenda));
  16.   precedentP->unRdvAgenda = malloc(sizeof(struct rdvAgenda ));
  17.   p->jourSuivant = malloc(sizeof(struct jour));
  18.   precedentP->jourSuivant = malloc(sizeof(struct jour));
  19.   initializeFile(unFichier);// initialisation du fichier.
  20.   readRDV(&unRdv,1);// lit le premier rdv  la ligne 1.
  21.   j->dateDuJour = unRdv.dateDebut;
  22.   j->jourSuivant = NULL;
  23.   j->unRdvAgenda->leRdv.dateDebut = unRdv.dateDebut;
  24.   j->unRdvAgenda->leRdv.dateFin = unRdv.dateFin;
  25.   strcpy(j->unRdvAgenda->leRdv.libelle, unRdv.libelle);
  26.   j->unRdvAgenda->leRdvAgendaSuivant = NULL;
  27.   while ( !eof() ) {
  28.     struct rdv rdvTmp;
  29.    
  30.     readRDV(&rdvTmp,i);
  31.     p = j;
  32.     precedentP = NULL;
  33.    
  34.  
  35.     if ( rdvTmp.dateDebut.tm_mday == j->dateDuJour.tm_mday && rdvTmp.dateDebut.tm_mon == j->dateDuJour.tm_mon && rdvTmp.dateDebut.tm_year == j->dateDuJour.tm_year) {//la date du rdvTmp est la meme que le premier rdv de la liste.
  36.       struct rdvAgenda *newRdvAgenda;
  37.       struct rdvAgenda *pRdvAgenda;
  38.       struct rdvAgenda *precPRdvAgenda;
  39.       time_t tPRddvAgenda;
  40.       time_t tNewRdvAgenda;
  41.       double diffRdv;
  42.       newRdvAgenda = malloc(sizeof(struct rdvAgenda));
  43.       newRdvAgenda->leRdvAgendaSuivant = malloc(sizeof(struct rdvAgenda));
  44.       pRdvAgenda = malloc(sizeof(struct rdvAgenda));
  45.       pRdvAgenda->leRdvAgendaSuivant = malloc(sizeof(struct rdvAgenda));
  46.       precPRdvAgenda = malloc(sizeof(struct rdvAgenda));
  47.       precPRdvAgenda->leRdvAgendaSuivant = malloc(sizeof(struct rdvAgenda));
  48.       newRdvAgenda->leRdv.dateDebut = rdvTmp.dateDebut;
  49.       newRdvAgenda->leRdv.dateFin = rdvTmp.dateFin;
  50.       strcpy(newRdvAgenda->leRdv.libelle, rdvTmp.libelle);
  51.       pRdvAgenda = p->unRdvAgenda;
  52.       precPRdvAgenda = NULL;
  53.       tPRddvAgenda = mktime(&(pRdvAgenda->leRdv.dateDebut));
  54.       tNewRdvAgenda = mktime(&(newRdvAgenda->leRdv.dateDebut));
  55.      
  56.       diffRdv = difftime(tNewRdvAgenda,tPRddvAgenda);
  57.       while ( diffRdv >= 0 && pRdvAgenda->leRdvAgendaSuivant != NULL ) {
  58. precPRdvAgenda = pRdvAgenda;
  59. pRdvAgenda = pRdvAgenda->leRdvAgendaSuivant;
  60. tPRddvAgenda = mktime(&(pRdvAgenda->leRdv.dateDebut));
  61. diffRdv = difftime(tNewRdvAgenda,tPRddvAgenda);
  62.       }
  63.      
  64.       if ( diffRdv < 0 && precPRdvAgenda == NULL) {//il y a qu'un seul rdvAgenda et il doit se placer apres le rdvTmp.
  65. p->unRdvAgenda = newRdvAgenda;
  66. newRdvAgenda->leRdvAgendaSuivant = pRdvAgenda;
  67.       } else {
  68. if (pRdvAgenda->leRdvAgendaSuivant == NULL) {
  69.  
  70.   pRdvAgenda->leRdvAgendaSuivant = newRdvAgenda;
  71.  
  72. } else {
  73.  
  74.   precPRdvAgenda->leRdvAgendaSuivant = newRdvAgenda;
  75.   newRdvAgenda->leRdvAgendaSuivant = pRdvAgenda;
  76.  
  77.       }
  78.      
  79.       //free(precPRdvAgenda->leRdvAgendaSuivant);
  80.       //free(pRdvAgenda->leRdvAgendaSuivant);
  81.       //free(pRdvAgenda);
  82.       //free(precPRdvAgenda);
  83.       printf("cas spcial au tour : %d\n",i);
  84.     } else {// sinon la date du rdvTmp est avant ou apres la tete de la liste.
  85.    
  86.       time_t tRdvTmp;
  87.       time_t tDateDuJour;
  88.       tRdvTmp = mktime(&(rdvTmp.dateDebut));
  89.       tDateDuJour = mktime(&(p->dateDuJour));
  90.      
  91.       diff = difftime(tRdvTmp,tDateDuJour);
  92.       if ( diff < 0 ) {//le rdvTmp se situe avant le premier jour (tete de la liste) rpertori.
  93. //on cr un nouveau jour, qui sera notre nouvelle tete de liste.
  94. struct jour *newJ;
  95. newJ = malloc(sizeof(struct jour));// allocation de mmoire pour le pointeur sur ma liste.
  96. newJ->unRdvAgenda = malloc(sizeof(struct rdvAgenda));
  97. newJ->jourSuivant = malloc(sizeof(struct jour));
  98. newJ->dateDuJour = rdvTmp.dateDebut;
  99. newJ->jourSuivant = j;
  100. newJ->unRdvAgenda->leRdv.dateDebut = rdvTmp.dateDebut;
  101. newJ->unRdvAgenda->leRdv.dateFin = rdvTmp.dateFin;
  102. strcpy(newJ->unRdvAgenda->leRdv.libelle, rdvTmp.libelle);
  103. newJ->unRdvAgenda->leRdvAgendaSuivant = NULL;
  104. j = newJ;
  105.       } else {//le rdvTmp se situe apres le premier jour (tete de la listerpertori).
  106. while ( diff >= 0 && ( p->dateDuJour.tm_mday != rdvTmp.dateDebut.tm_mday || p->dateDuJour.tm_mon != rdvTmp.dateDebut.tm_mon || p->dateDuJour.tm_year != rdvTmp.dateDebut.tm_year ) && p->jourSuivant != NULL ) {
  107.   //on se place sur le jour le plus appropri.
  108.   precedentP = p;
  109.   p = p->jourSuivant;
  110.   tDateDuJour = mktime(&(p->dateDuJour));
  111.   diff = difftime(tRdvTmp,tDateDuJour);
  112. if ( p->dateDuJour.tm_mday == rdvTmp.dateDebut.tm_mday && p->dateDuJour.tm_mon == rdvTmp.dateDebut.tm_mon && p->dateDuJour.tm_year == rdvTmp.dateDebut.tm_year ) {//il y a un jour deja rpertori pour ce le jour du rdvTmp.
  113.   struct rdvAgenda *newRdvAgenda;
  114.   struct rdvAgenda *pRdvAgenda;
  115.   struct rdvAgenda *precPRdvAgenda;
  116.   time_t tPRddvAgenda;
  117.   time_t tNewRdvAgenda;
  118.   double diffRdv;
  119.   newRdvAgenda = malloc(sizeof(struct rdvAgenda));
  120.   newRdvAgenda->leRdvAgendaSuivant = malloc(sizeof(struct rdvAgenda));
  121.   pRdvAgenda = malloc(sizeof(struct rdvAgenda));
  122.   pRdvAgenda->leRdvAgendaSuivant = malloc(sizeof(struct rdvAgenda));
  123.   precPRdvAgenda = malloc(sizeof(struct rdvAgenda));
  124.   precPRdvAgenda->leRdvAgendaSuivant = malloc(sizeof(struct rdvAgenda));
  125.  
  126.   newRdvAgenda->leRdv.dateDebut = rdvTmp.dateDebut;
  127.   newRdvAgenda->leRdv.dateFin = rdvTmp.dateFin;
  128.   strcpy(newRdvAgenda->leRdv.libelle, rdvTmp.libelle);
  129.   pRdvAgenda = p->unRdvAgenda;
  130.   precPRdvAgenda = NULL;
  131.  
  132.   tPRddvAgenda = mktime(&(pRdvAgenda->leRdv.dateDebut));
  133.   tNewRdvAgenda = mktime(&(newRdvAgenda->leRdv.dateDebut));
  134.  
  135.   diffRdv = difftime(tNewRdvAgenda,tPRddvAgenda);
  136.  
  137.   while ( diffRdv >= 0 && pRdvAgenda->leRdvAgendaSuivant != NULL ) {
  138.    
  139.     precPRdvAgenda = pRdvAgenda;
  140.    
  141.     pRdvAgenda = pRdvAgenda->leRdvAgendaSuivant;
  142.    
  143.     tPRddvAgenda = mktime(&(pRdvAgenda->leRdv.dateDebut));
  144.     diffRdv = difftime(tNewRdvAgenda,tPRddvAgenda);
  145.    
  146.   }
  147.   if ( diffRdv < 0 && precPRdvAgenda == NULL) {//il y a qu'un seul rdvAgenda et il doit se placer apres le rdvTmp.
  148.     p->unRdvAgenda = newRdvAgenda;
  149.     newRdvAgenda->leRdvAgendaSuivant = pRdvAgenda;
  150.   } else {
  151.     if (pRdvAgenda->leRdvAgendaSuivant == NULL) {
  152.       pRdvAgenda->leRdvAgendaSuivant = newRdvAgenda;
  153.     } else {
  154.       precPRdvAgenda->leRdvAgendaSuivant = newRdvAgenda;
  155.       newRdvAgenda->leRdvAgendaSuivant = pRdvAgenda;
  156.  
  157.     } 
  158.   }
  159.   //free(precPRdvAgenda->leRdvAgendaSuivant);
  160.   //free(pRdvAgenda->leRdvAgendaSuivant);
  161.   //free(pRdvAgenda);
  162.   //free(precPRdvAgenda);
  163.  
  164.   printf("cas spcial au tour : %d\n",i);
  165.  
  166. } else {
  167.  
  168.   if (  p->jourSuivant == NULL && diff > 0) {//le rdvTmp tombe sur un jour qui n'est pas rpertori et qui est apres tous les autres rdv de la liste.
  169.     //on cr un nouveau jour, qui sera  la fin de la liste.
  170.    
  171.     struct jour *newJ;
  172.      
  173.  
  174.     newJ = malloc(sizeof(struct jour));// allocation de mmoire pour le pointeur sur ma liste.
  175.     newJ->unRdvAgenda = malloc(sizeof(struct rdvAgenda));
  176.     newJ->jourSuivant = malloc(sizeof(struct jour));
  177.    
  178.    
  179.     newJ->dateDuJour = rdvTmp.dateDebut;
  180.     newJ->jourSuivant = NULL;
  181.     newJ->unRdvAgenda->leRdv.dateDebut = rdvTmp.dateDebut;
  182.     newJ->unRdvAgenda->leRdv.dateFin = rdvTmp.dateFin;
  183.     strcpy(newJ->unRdvAgenda->leRdv.libelle, rdvTmp.libelle);
  184.     newJ->unRdvAgenda->leRdvAgendaSuivant = NULL;
  185.    
  186.     p->jourSuivant = newJ;
  187.    
  188.     p = newJ;
  189.    
  190.   } else {// cas ou il existe forcment des rdv dans liste qui sont avant et apres.
  191.    
  192.     //on cr un nouveau jour, qui sera au milieu de la liste.
  193.             struct jour *newJ;
  194.    
  195.     newJ = malloc(sizeof(struct jour));// allocation de mmoire pour le pointeur sur ma liste.
  196.     newJ->unRdvAgenda = malloc(sizeof(struct rdvAgenda));
  197.     newJ->jourSuivant = malloc(sizeof(struct jour));
  198.     precedentP->jourSuivant = newJ;
  199.     newJ->dateDuJour = rdvTmp.dateDebut;
  200.     newJ->jourSuivant = p;
  201.     newJ->unRdvAgenda->leRdv.dateDebut = rdvTmp.dateDebut;
  202.     newJ->unRdvAgenda->leRdv.dateFin = rdvTmp.dateFin;
  203.     strcpy(newJ->unRdvAgenda->leRdv.libelle, rdvTmp.libelle);
  204.     newJ->unRdvAgenda->leRdvAgendaSuivant = NULL;
  205.    
  206.     p = newJ;
  207.   }
  208.  
  209. }
  210.       }
  211.     }
  212.     if ( !eof() ) {
  213.       readRDV(&rdvTmp,i);//pour pas avoir d'occurence  la fin.
  214.     }
  215.     i++;
  216.   }
  217.   //afficher(j);
  218.  
  219.   closeFile();
  220.  
  221.   free(precedentP->jourSuivant);
  222.   free(p->jourSuivant);
  223.   free(precedentP->unRdvAgenda);
  224.   free(p->unRdvAgenda);
  225.   free(precedentP);
  226.   free(p);
  227.   return j;
  228.  
  229. }

n°651423
chagarou
Posté le 22-02-2004 à 22:18:16  profilanswer
 

khyna a écrit :

Voici la fonction chargeAgenda, ne chambrer pas trop... je débute en C.. :pt1cable:  


Premiere constatation 300 lignes pour une fonction c'est bcp trop, tu m'etonne que tu t'y retrouve pas. T'as certainement des sequences de code recurrente met les sous forme de fonctions plutot que de faire un copier coller bourrin.
 
Deuxieme constatation j'ai vraiment la flemme d'essayer de cherche l'erreur dans ce pave, mais ta fonction au clair.


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

  Passage de pointeurs en paramètre erronés !

 

Sujets relatifs
Peut on appeller un .exe creer en VB avec un parametre ?Parametre template sous forme de chaine de caracteres
[MySql] Requete parametre sur likeAffichage d'un div au passage de la souris
Passage de paramètres avec un callbackpasser un tableau d'entier en parametre dans une URL [resolu]
passage de php/mysql vers php/access : problemes [resolu][VBA] Passer un tableau en parametre de fonction ?
[VB] passer un array en parametre ???[XSLT] Récupération d'un paramètre dans l'URL
Plus de sujets relatifs à : Passage de pointeurs en paramètre erronés !


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