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

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°645117
Khyna
Posté le 17-02-2004 à 11:48:21  profilanswer
 

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
mood
Publicité
Posté le 17-02-2004 à 11:48:21  profilanswer
 

n°645122
Taz
bisounours-codeur
Posté le 17-02-2004 à 11:51:15  profilanswer
 

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

n°645131
Khyna
Posté le 17-02-2004 à 11:53:32  profilanswer
 

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

n°645141
Taz
bisounours-codeur
Posté le 17-02-2004 à 11:59:27  profilanswer
 

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

n°645159
Khyna
Posté le 17-02-2004 à 12:20:41  profilanswer
 

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
n°645168
Taz
bisounours-codeur
Posté le 17-02-2004 à 12:26:26  profilanswer
 

<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 ?

n°645182
Khyna
Posté le 17-02-2004 à 12:36:07  profilanswer
 

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
n°645184
Taz
bisounours-codeur
Posté le 17-02-2004 à 12:38:00  profilanswer
 

#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
n°645189
Khyna
Posté le 17-02-2004 à 12:41:44  profilanswer
 

: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
n°645194
Khyna
Posté le 17-02-2004 à 12:43:37  profilanswer
 

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

mood
Publicité
Posté le 17-02-2004 à 12:43:37  profilanswer
 

n°645199
Taz
bisounours-codeur
Posté le 17-02-2004 à 12:45:27  profilanswer
 

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
 

n°645201
Khyna
Posté le 17-02-2004 à 12:46:21  profilanswer
 

je fais comment alors pour comparer deux date ?

n°645204
Taz
bisounours-codeur
Posté le 17-02-2004 à 12:48:32  profilanswer
 

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
n°645210
Khyna
Posté le 17-02-2004 à 12:53:31  profilanswer
 

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

n°645213
Taz
bisounours-codeur
Posté le 17-02-2004 à 12:55:53  profilanswer
 

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

n°645215
Khyna
Posté le 17-02-2004 à 12:56:56  profilanswer
 

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
n°645222
Taz
bisounours-codeur
Posté le 17-02-2004 à 13:01:26  profilanswer
 

et pourtant ...

n°645223
Taz
bisounours-codeur
Posté le 17-02-2004 à 13:01:53  profilanswer
 

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

n°645224
Khyna
Posté le 17-02-2004 à 13:03:11  profilanswer
 

plait il ?

n°645227
Taz
bisounours-codeur
Posté le 17-02-2004 à 13:04:10  profilanswer
 

%f et pas %d

n°645230
Khyna
Posté le 17-02-2004 à 13:05:03  profilanswer
 

Est ce que tu veux bien me gifler stp ?

n°645232
Khyna
Posté le 17-02-2004 à 13:05:52  profilanswer
 

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

n°645233
Taz
bisounours-codeur
Posté le 17-02-2004 à 13:06:03  profilanswer
 

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

n°645234
Khyna
Posté le 17-02-2004 à 13:06:20  profilanswer
 

parce que je suis ridicule...

n°645238
Taz
bisounours-codeur
Posté le 17-02-2004 à 13:07:15  profilanswer
 

pas autant que ton code, pas autant

n°645242
Khyna
Posté le 17-02-2004 à 13:08:49  profilanswer
 

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

n°645245
Taz
bisounours-codeur
Posté le 17-02-2004 à 13:10:30  profilanswer
 

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

n°645249
Khyna
Posté le 17-02-2004 à 13:12:11  profilanswer
 

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

n°645255
Taz
bisounours-codeur
Posté le 17-02-2004 à 13:15:54  profilanswer
 

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
n°645257
Khyna
Posté le 17-02-2004 à 13:16:37  profilanswer
 

ok
merci professeur Taz...

mood
Publicité
Posté le   profilanswer
 


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

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

 

Sujets relatifs
VC++.NET, qui connait les différents types de licence Microsoft ???[PHP] Classer un tableau de résultats par ordre décroissant
[php]une erreur que je ne comprend pas[reglé]ouvrir 2 adresses différents à partir d'un clic ?
Tester l'existence d'un répertoire [REGLE !!!]site comparatif des différents compilos c++ existants ?
[reglé]Text area et couleur de fond[XHTML] Validation XHTML Framset avec Javascript et ASP [Réglé]
[PHP] champs en php : tous pareils ou tous différents ?[reglé]probleme mysql
Plus de sujets relatifs à : [Réglé] Deux instructions similaires, deux résultats différents ?!!!


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