[Réglé] Deux instructions similaires, deux résultats différents ?!!!

Deux instructions similaires, deux résultats différents ?!!! [Réglé] - C - Programmation

Marsh Posté le 17-02-2004 à 11:48:21    

Bonjour,
 
J'ai un petit soucis avec une partie de mon code qui me pose pb...
Voila mon code :
 

Code :
  1. struct rdv *rdvTmp;
  2.     time_t tDebut;
  3.     time_t tFin;
  4.     double diff;
  5.     (int)rdvTmp = malloc(sizeof(rdvTmp->dateDebut)*2+100);
  6.    
  7.     readRDV(rdvTmp,i);
  8.     tDebut = mktime(&(rdvTmp->dateDebut));
  9.     tFin = mktime(&(rdvTmp->dateFin));
  10.     printf("Heure de début :  %s", ctime(&tDebut));
  11.     printf("Heure de Fin :  %s", ctime(&tFin));
  12.     printf("De %s à %s \n", ctime(&tDebut), ctime(&tFin));


 
Et voila ce que ca m'affiche :

Citation :


Heure de début :  Tue Apr 16 17:07:00 2002
Heure de Fin :  Tue Apr 16 22:30:00 2002
De Tue Apr 16 17:07:00 2002
 à Tue Apr 16 17:07:00 2002


 
Il y a un peitit pb comme vous pouvez le voir. Les deux instructions sont quasiment identique et elle ne rendent pas le meme résultat.
Et ca me bloque pour la suite de mon code car qd je fais un difftime(tFin,tDebut) ca me rend 0 sec alors que normalement ca devrait me rendre un peu plus que zéro secondes.  
Peut etre qu'il y a une grosse bourde dans mon code mais franchement je vois pas...
Merci d'avance de me remettre en place
 :pt1cable:


Message édité par Khyna le 17-02-2004 à 13:06:48
Reply

Marsh Posté le 17-02-2004 à 11:48:21   

Reply

Marsh Posté le 17-02-2004 à 11:51:15    

(int)rdvTmp = malloc(sizeof(rdvTmp->dateDebut)*2+100);
 
t'es sur de toi là ?
 
 
c normal sinon, regarde la documentation de ctime

Reply

Marsh Posté le 17-02-2004 à 11:53:32    

pour le malloc je sais que c loin d'etre propre mais ya que comme ca que ca passe sans segmentation fault. Je verais ca plus tard.
Mais le problème ne vient pas de la.
 
Sinon c pas du tout normal... pour la fonction ctime...
Je fais appelle à la meme fonction...  
Je comprend vriament pas..

Reply

Marsh Posté le 17-02-2004 à 11:59:27    

ctime n'est pas réentrante, ni rien, elle renvoie un pointeur vers un buffer statique interne, pas partageable, donc quand tu mélanges 2 appels, ben y a n'importe quoi qui se passe
 
sinon, donne des précisions sur ton malloc, je veux voir la tete de ta structure rdv

Reply

Marsh Posté le 17-02-2004 à 12:20:41    

Bon je vais te filer la méthode entière...
Car j'ai d'autres malloc bizaroïde... Mais ca marche que comme ca...
 

Code :
  1. int chargeAgenda(char unFichier[100]) {
  2.   int i = 2;// incrment pour les lignes.
  3.   struct rdv *unRdv;//le rdv avec lequel on va commencer la liste.
  4.   time_t tDebutRDV1;
  5.   time_t tFinRDV1;
  6.   (int)j = malloc(sizeof(j));// allocation de mmoire pour le pointeur sur ma liste.
  7.   (int)j->unRdvAgenda = malloc(1000000);
  8.   (int)unRdv = malloc(sizeof(unRdv->dateDebut)*2+100);// allocation de mmoire pour le premier rdv.
  9.   initializeFile(unFichier);// initialisation du fichier.
  10.   readRDV(unRdv,1);// lit le premier rdv  la ligne 1.
  11.  
  12.   j->dateDuJour = unRdv->dateDebut;
  13.   j->jourSuivant = NULL;
  14.   j->unRdvAgenda->leRdv.dateDebut = unRdv->dateDebut;
  15.   j->unRdvAgenda->leRdv.dateFin = unRdv->dateFin;
  16.   strcpy(j->unRdvAgenda->leRdv.libelle, unRdv->libelle);
  17.   j->unRdvAgenda->leRdvAgendaSuivant = NULL;
  18.   tDebutRDV1 = mktime(&(unRdv->dateDebut));
  19.   tFinRDV1 = mktime(&(unRdv->dateFin));
  20.   while ( !eof() ) {
  21.     struct rdv *rdvTmp;
  22.     time_t tDebut;
  23.     time_t tFin;
  24.     double diff;
  25.     (int)rdvTmp = malloc(sizeof(rdvTmp->dateDebut)*2+100);
  26.    
  27.     readRDV(rdvTmp,i);
  28.     tDebut = mktime(&(rdvTmp->dateDebut));
  29.     tFin = mktime(&(rdvTmp->dateFin));
  30.     printf("Heure de dbut :  %s", ctime(&tDebut));
  31.     printf("Heure de Fin :  %s", ctime(&tFin));
  32.     printf("De %s  %s \n", ctime(&tDebut), ctime(&tFin));
  33.     //diff = difftime(tFin,tDebut);
  34.     //printf ("dure du RDV %d sec\n",diff);  
  35.     i++;
  36.   }
  37.   closeFile();
  38. }


 
et voila mes différentes structures...

Code :
  1. struct rdv {
  2.   struct tm dateDebut;
  3.   struct tm dateFin;
  4.   char libelle[100];
  5. };
  6. struct rdvAgenda {
  7.   struct rdv leRdv;// un pointeur sur le rdv.
  8.   struct rdvAgenda *leRdvAgendaSuivant;// un pointeur sur le rdv suivant.
  9. };
  10. struct jour {
  11.   struct tm dateDuJour;// la date du jour.
  12.   struct rdvAgenda *unRdvAgenda;// un pointeur le premier rendez-vous du jour.
  13.   struct jour *jourSuivant;// un pointeur sur le jour suivant.
  14. };


 
Je sais pas si tu vois le principe : en fait a partir d'un fichier (ou il y a une liste de rdv) , je veux creer une liste chainée de rdv par jour..
 
Voila voila...
Sinon pour le difftime, je fais comment alors pour avoir une vrai valeur ??


Message édité par Khyna le 17-02-2004 à 12:22:11
Reply

Marsh Posté le 17-02-2004 à 12:26:26    

<Type> *ptr= malloc(sizeof(Type))
 
 
  struct rdv {
      struct tm dateDebut;
      struct tm dateFin;
      char libelle[100];
  };  
 
 
->
 
struct rdv *ptr = malloc( sizeof(struc rdv) );
 
ni plus, ni moins
 
 
et c'est quoi ces cast de l-value en int ?

Reply

Marsh Posté le 17-02-2004 à 12:36:07    

autrement j'ai des warning, ca aussi je comprend pas...
ya pas mal de trucs que je comprend pas en C.
 

Citation :


warning: initialization makes pointer from integer without a cast


Message édité par Khyna le 17-02-2004 à 12:37:41
Reply

Marsh Posté le 17-02-2004 à 12:38:00    

#include <stdlib.h>
pour le prototype de malloc
 
superbe exemple de cast inutiles et qui cachent une erreur grave


Message édité par Taz le 17-02-2004 à 12:38:33
Reply

Marsh Posté le 17-02-2004 à 12:41:44    

:jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  
Respect...
J'ai tout mon code a revoir mais :
RESPECT...
 
 
Par contre je ne comprend tjrs pas pour ctime et difftime ...


Message édité par Khyna le 17-02-2004 à 12:43:20
Reply

Marsh Posté le 17-02-2004 à 12:43:37    

khyna a écrit :

:jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  
Respect...
J'ai tout mon code a revoir mais :
RESPECT...
 
 
Par contre je ne comprend tjrs pas pour ctime et difftime ...

Reply

Marsh Posté le 17-02-2004 à 12:43:37   

Reply

Marsh Posté le 17-02-2004 à 12:45:27    

ctime renvoie un pointeur sur un buffer statique. c'est a dire que tous les appels à ctime utilise le meme buffer pour y imprimer la date. le pointeuir retourner est tout le temps le meme
 
ptr = ctime( ... );
affichage
ptr = ctime( ... );
affichage
 
tout va bien
 
par contre
ptr1 = ctime( ... );
ptr2 = ctime( ... ); // écrasement du buffer
affichage ptr1 // le buffer contient la date de ptr2
affichage ptr2
 
et comme pour les fonctions, l'odre d'évaluation des arguments est indéterminé, et bien
 
appel( ctime( ... ), ctime( ... ) )
 
ça fait boum
 

Reply

Marsh Posté le 17-02-2004 à 12:46:21    

je fais comment alors pour comparer deux date ?

Reply

Marsh Posté le 17-02-2004 à 12:48:32    

ben tu peux comparer les time_t, à la main ou pourquoi pas, et c'est sans doute bien mieux, en utilisant difftime


Message édité par Taz le 17-02-2004 à 12:48:50
Reply

Marsh Posté le 17-02-2004 à 12:53:31    

Le problème est que difftime me pose le meme soucis que ctime...
 
Qd je fais la différence entre les deux dates, il me rend toujours 0. alors que les deux dates sont bien différents, a mon avis c un pb d'écrasement de buffer comme tu me la dis mais je vois pas du tout comment résoudre le pb.
Et ca me semble tout de meme bizarre que qd on compare deux time_t il y est un pb... C'est le but normalement..
Voici le code :

Code :
  1. struct rdv *rdvTmp;
  2.     time_t tDebut;
  3.     time_t tFin;
  4.     double diff;
  5.     rdvTmp = malloc(sizeof(struct rdv));
  6.    
  7.     readRDV(rdvTmp,i);
  8.     tDebut = mktime(&(rdvTmp->dateDebut));
  9.     tFin = mktime(&(rdvTmp->dateFin));
  10.     diff = difftime(tFin,tDebut);
  11.     printf ("dure du RDV %d sec\n",diff);


 
et ca me rend toujours :
 

Citation :


durée du RDV 0 sec
 


 
La aussi je comprend rien...

Reply

Marsh Posté le 17-02-2004 à 12:55:53    

si difftime dit 0, c'est que c'est 0
tu foires un truc quelque part, ce qui fait que tu as la meme date dans tes deux champs. le problème est en amont, pas difftime

Reply

Marsh Posté le 17-02-2004 à 12:56:56    

je suis sur que non car qd je fais deux printf, avant ca me rend qqchose de différent...
 
Regarde je te met le code et je te met le résultat :
 

Code :
  1. struct rdv *rdvTmp;
  2.     time_t tDebut;
  3.     time_t tFin;
  4.     double diff;
  5.     rdvTmp = malloc(sizeof(struct rdv));
  6.    
  7.     readRDV(rdvTmp,i);
  8.     tDebut = mktime(&(rdvTmp->dateDebut));
  9.     tFin = mktime(&(rdvTmp->dateFin));
  10.     printf("Heure de dbut :  %s", ctime(&tDebut));
  11.     printf("Heure de Fin :  %s", ctime(&tFin));
  12.     //printf("De %s  %s \n", ctime(&tDebut), ctime(&tFin));
  13.     diff = difftime(tFin,tDebut);
  14.     printf ("dure du RDV %d sec\n",diff);


 
ca me rend :

Citation :


 
Heure de début :  Tue Apr 16 17:07:00 2002
Heure de Fin :  Tue Apr 16 22:30:00 2002
durée du RDV 0 sec
 


Message édité par Khyna le 17-02-2004 à 12:58:07
Reply

Marsh Posté le 17-02-2004 à 13:01:26    

et pourtant ...

Reply

Marsh Posté le 17-02-2004 à 13:01:53    

%f :o
 
si tu commencais par lire la doc :o

Reply

Marsh Posté le 17-02-2004 à 13:03:11    

plait il ?

Reply

Marsh Posté le 17-02-2004 à 13:04:10    

%f et pas %d

Reply

Marsh Posté le 17-02-2004 à 13:05:03    

Est ce que tu veux bien me gifler stp ?

Reply

Marsh Posté le 17-02-2004 à 13:05:52    

Merci pour tout, j'ai pas encore les automatismes en C...

Reply

Marsh Posté le 17-02-2004 à 13:06:03    

parce que l'erreur est ridicule ou parce que tu l'as pas encore trouvé ?

Reply

Marsh Posté le 17-02-2004 à 13:06:20    

parce que je suis ridicule...

Reply

Marsh Posté le 17-02-2004 à 13:07:15    

pas autant que ton code, pas autant

Reply

Marsh Posté le 17-02-2004 à 13:08:49    

,'abuse pas non plus...
Je veux bien croire que je suis pitoyable mais pas à ce poitn isn't it ?

Reply

Marsh Posté le 17-02-2004 à 13:10:30    

si si ton code l'est.
 
juste comme ça : à chaque fois que t'as besoin d'un pointeur, t'es pas obligé de faire un malloc, l'adresse d'une variable allouée automatiquement suffit souvent
 
 
 
  struct rdv *rdvTmp;
 
      (int)rdvTmp = malloc(sizeof(rdvTmp->dateDebut)*2+100);
       
      readRDV(rdvTmp,i);  
 
 
 
  struct rdv rdvTmp;      
      readRDV(&rdvTmp, i);  
 
 
et ça t'évite de faire des bêtises en plus :D

Reply

Marsh Posté le 17-02-2004 à 13:12:11    

ahh... Je savais vraiment pas...
J'ai pas encore tout assimiler dans les histoires de pointeurs..
T'as pas d'autres trucs comme ca ?

Reply

Marsh Posté le 17-02-2004 à 13:15:54    

1) n'utilise les pointeur que quand tu en as vraiment besoin (prends quelques secondes pour te poser la question). on a besoin d'une allocation dynamique quand on veut alloué un espace mémoire qui devra survivre à l'appel de fonction. vu ton code, je pense que je n'utiliserais aucun malloc
 
2) fait bien les malloc comme je t'ai montré, oublie pas les free


Message édité par Taz le 17-02-2004 à 13:16:15
Reply

Marsh Posté le 17-02-2004 à 13:16:37    

ok
merci professeur Taz...

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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