Passage de pointeurs en paramètre erronés !

Passage de pointeurs en paramètre erronés ! - C - Programmation

Marsh Posté le 20-02-2004 à 13:45:37    

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.

Reply

Marsh Posté le 20-02-2004 à 13:45:37   

Reply

Marsh Posté le 20-02-2004 à 13:59:18    

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
 

Reply

Marsh Posté le 20-02-2004 à 14:11:21    

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

Reply

Marsh Posté le 22-02-2004 à 22:18:16    

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.

Reply

Sujets relatifs:

Leave a Replay

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