Deux instructions similaires, deux résultats différents ?!!! [Réglé] - C - Programmation
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
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..
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
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 :
|
et voila mes différentes structures...
Code :
|
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 ??
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 ?
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 : |
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
Marsh Posté le 17-02-2004 à 12:41:44
Respect...
J'ai tout mon code a revoir mais :
RESPECT...
Par contre je ne comprend tjrs pas pour ctime et difftime ...
Marsh Posté le 17-02-2004 à 12:43:37
khyna a écrit : |
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
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
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 :
|
et ca me rend toujours :
Citation : |
La aussi je comprend rien...
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
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 :
|
ca me rend :
Citation : |
Marsh Posté le 17-02-2004 à 13:05:52
Merci pour tout, j'ai pas encore les automatismes en C...
Marsh Posté le 17-02-2004 à 13:06:03
parce que l'erreur est ridicule ou parce que tu l'as pas encore trouvé ?
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 ?
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
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 ?
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
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 :
Et voila ce que ca m'affiche :
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
Message édité par Khyna le 17-02-2004 à 13:06:48