Problèmes de passage de pointeur en paramètre

Problèmes de passage de pointeur en paramètre - C - Programmation

Marsh Posté le 22-02-2004 à 17:31:58    

Bonjour, j'ai un beug qui revient deux fois dans mon code, donc ca me débloquerais bien si qqun pouvait me dire ou est ce que je me suis planté.
 
Je vous donne en exmple qu'un seul de mes beug je me débrouillerais pour l'autre. :)  
Donc en fait j'ain une fonction :
 

Code :
  1. int extractPeriode(char *periode,struct tm *dateDebut,struct tm *dateFin) {
  2.   if ( strchr(periode,'-') != 0 ) {//si on veut travailler sur une priode
  3.    
  4.     time_t tDateDebut;
  5.     time_t tDateFin;
  6.     double diff;
  7.     dateDebut->tm_mday = chartoint(periode[0])*10 + chartoint(periode[1]);
  8.     dateDebut->tm_mon = chartoint(periode[3])*10 + chartoint(periode[4])-1;
  9.     dateDebut->tm_year = ( ( chartoint(periode[6]) *1000 ) + (chartoint(periode[7])*100) + (chartoint(periode[8])*10) + chartoint(periode[9])) -1900;
  10.      
  11.     dateFin->tm_mday = chartoint(periode[11])*10 + chartoint(periode[12]);
  12.     dateFin->tm_mon = chartoint(periode[14])*10 + chartoint(periode[15])-1;
  13.     dateFin->tm_year = ( ( chartoint(periode[17]) *1000 ) + (chartoint(periode[18])*100) + (chartoint(periode[19])*10) + chartoint(periode[20])) -1900;
  14.    
  15.     mktime(dateDebut);
  16.      
  17.     mktime(dateFin);
  18.    
  19.    
  20.    
  21.    
  22.   } else {//si on veut travailler sur une semaine.
  23.    
  24.     time_t tDate;
  25.     strptime2(periode,dateDebut);
  26.    
  27.     tDate = mktime(dateDebut);
  28.     tDate = tDate + 60*60*24*6;
  29.    
  30.     dateFin = localtime(&tDate);
  31.    
  32.     tDate = mktime(dateFin);
  33.  
  34.     printf("date fin (dans extract.) : %s",ctime(&tDate));
  35.    
  36.   }
  37.  
  38.   return 0;
  39.    
  40. }


 
Qui me calcule la date debut et date fin d'une période (chaine de caractère de type : "12/2004" ou "12/03/2004-25/11/2004".
 
En fait à l'intérieur meme de ma fonction tout semble bien se passé ( avec plusieurs prtinf j'arrive a avoir les dates. )
 
Et le pb c que dans mon main, qd j'appelle cette fonction de cette manière :
 

Code :
  1. struct tm *dateDebut;
  2.       struct tm *dateFin;
  3.       time_t tDateDebut;//a supprimer apres debeugage.
  4.       time_t tDateFin;//a supprimer apres debeugage.
  5.       dateDebut = malloc(sizeof(struct tm));
  6.       dateFin = malloc(sizeof(struct tm));
  7.       extractPeriode(argv[3],dateDebut,dateFin);
  8.       tDateDebut = mktime(dateDebut);
  9.       tDateFin = mktime(dateFin);
  10.      
  11.       printf("date debut : %s",ctime(&tDateDebut));
  12.       printf("date fin : %s",ctime(&tDateFin));


et benh, seul la dateDebut est bien enregistrer, la date fin me donne un date invalide ( donc 1970).
Voici la sorti que ca me preoduit :

Citation :


date fin (dans extract.) : Sun Jun 16 01:00:00 2002
date debut : Mon Jun 10 01:00:00 2002
date fin : Thu Jan  1 00:59:59 1970
 
 


 
 
Je vous remercie de me donner une piste car la je vois vraiment pas !!!

Reply

Marsh Posté le 22-02-2004 à 17:31:58   

Reply

Marsh Posté le 23-02-2004 à 09:57:20    

dateFin = localtime(&tDate);
 
le struct tm * retourné par localtime est une allocation statique, donc le prochain appel a une fonction de la lib qui va avoir besoin d'une telle srtucture va ecraser les données
 
(en plus tu as alloué dateFin dans le vent ds ta main).
 
essaye en remplacant dateFin = localtime(&tDate);
par memcpy(dateFin, localtime(&tDate), sizeof(*dateFin));


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 23-02-2004 à 11:54:14    

blackgoddess a écrit :

dateFin = localtime(&tDate);
 
le struct tm * retourné par localtime est une allocation statique, donc le prochain appel a une fonction de la lib qui va avoir besoin d'une telle srtucture va ecraser les données
 
(en plus tu as alloué dateFin dans le vent ds ta main).
 
essaye en remplacant dateFin = localtime(&tDate);
par memcpy(dateFin, localtime(&tDate), sizeof(*dateFin));


 
J'ai pas tout lu, mais pourquoi s'embringuer dans un memset ?

Code :
  1. *dateFin = *localtime(&tDate);


Message édité par leneuf22 le 23-02-2004 à 11:54:34
Reply

Marsh Posté le 23-02-2004 à 12:06:40    

oui :)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 23-02-2004 à 12:12:55    

voir tu vire le type pointeur sur dateFin ça marche encore mieux ...

Reply

Marsh Posté le 23-02-2004 à 12:19:09    

je comprends pac, c un param de sa fonction, et il doit etre modifié, il faut donc bien passer par un pointeur ? les références existent en C ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 23-02-2004 à 12:26:01    

Qui a dit ça ?
Je vois pas ou tu vois une référence...

Reply

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

bin pour enlever le pointeur ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 23-02-2004 à 12:34:03    

Mais kesse ke tu racontes ?!?
T'as pas besoin de références pour faire ce que dit taz

Reply

Marsh Posté le 23-02-2004 à 12:37:09    

euh ... il parlait de la main ou de extractPeriode ? chui pas réveillé moi :/


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 23-02-2004 à 12:37:09   

Reply

Marsh Posté le 23-02-2004 à 12:41:28    

Il parlait des 2 : pas besoin de pointeur.
C'est pas bien de sauter le ptit dèj !

Reply

Marsh Posté le 23-02-2004 à 12:45:26    

int extractPeriode(char *periode,struct tm *dateDebut,struct tm *dateFin) >> comment tu veux changer la valeur de dateFin pour l'appelant si tu le passe par valeur plutot que par pointeur ?
 
edit :
c drole j'ai l'impression que je m'enfonce ^^


Message édité par blackgoddess le 23-02-2004 à 12:46:12

---------------
-( BlackGoddess )-
Reply

Marsh Posté le 23-02-2004 à 12:53:50    

Non mais tu peux utiliser la valeur retour de extractperiode (le return 0 sert à que dalle)

Reply

Marsh Posté le 23-02-2004 à 14:05:28    

c vrai ... ca va copier la struct par contre. (puis ca sera p-e moins lisible)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 23-02-2004 à 14:11:03    

parce que tu crois qu'avec un malloc ça copie pas ?

Reply

Marsh Posté le 23-02-2004 à 14:22:35    

si on fait :
 

Code :
  1. void extractPeriode(char *periode,struct tm *dateDebut,struct tm *dateFin) { ...}
  2. int main() {
  3.    struct tm dateDebut;
  4.    struct tm dateFin;
  5.  
  6.    extractPeriode("machain truc", &dateDebut, &dateFin);
  7.  
  8.    return 0;
  9. }


 
ca copie pas ??


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 23-02-2004 à 16:33:48    

Je viens juste de me pencher sur vos réponse, j'étudie ca dans la soirée !!
Je vous remercie de vos participations

Reply

Marsh Posté le 23-02-2004 à 16:43:06    

const char *periode
 
et puis soyons fou, soupoudrons le rest de restrict

Reply

Marsh Posté le 24-02-2004 à 17:37:31    

je dirais même plus

Code :
  1. auto const signed char* restrict const periode;


 
 
BlackGoddess> les pointeurs, vaut mieux démarrer tout doux, et notre ami ne semble pas encore avoir tout compris à leur sujet !
Mais sur le fond tu as raison.

Reply

Marsh Posté le 24-02-2004 à 17:46:23    

leneuf22 a écrit :

je dirais même plus

Code :
  1. auto const signed char* restrict const periode;



ahaha le fait est que le double const est une très bonne habitude, bon nombre de gens éviterait des mésaventures si le compilo gueulait pour la modification d'un pointer qui devrait pas :o

Reply

Marsh Posté le 24-02-2004 à 19:28:07    

euh ... c quoi auto et restrict ??

Reply

Marsh Posté le 24-02-2004 à 19:59:56    

auto c'est rien, c'est implicite quand tu mets rien. ça spécifie la classe de stockage (comme extern, static, volatile).
 
restrict c'est pour dire au compilateur que les pointeurs ne désigneront pas un même objet. ça peut permettre certaines optimisation

Reply

Marsh Posté le 24-02-2004 à 23:38:36    

ok , mci :)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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