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

  FORUM HardWare.fr
  Programmation
  C

  Problèmes de passage de pointeur en paramètre

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problèmes de passage de pointeur en paramètre

n°651054
Khyna
Posté le 22-02-2004 à 17:31:58  profilanswer
 

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

mood
Publicité
Posté le 22-02-2004 à 17:31:58  profilanswer
 

n°651568
blackgodde​ss
vive le troll !
Posté le 23-02-2004 à 09:57:20  profilanswer
 

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 )-
n°651683
leneuf22
Posté le 23-02-2004 à 11:54:14  profilanswer
 

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
n°651695
blackgodde​ss
vive le troll !
Posté le 23-02-2004 à 12:06:40  profilanswer
 

oui :)


---------------
-( BlackGoddess )-
n°651709
Taz
bisounours-codeur
Posté le 23-02-2004 à 12:12:55  profilanswer
 

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

n°651722
blackgodde​ss
vive le troll !
Posté le 23-02-2004 à 12:19:09  profilanswer
 

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 )-
n°651733
leneuf22
Posté le 23-02-2004 à 12:26:01  profilanswer
 

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

n°651743
blackgodde​ss
vive le troll !
Posté le 23-02-2004 à 12:31:17  profilanswer
 

bin pour enlever le pointeur ?


---------------
-( BlackGoddess )-
n°651747
leneuf22
Posté le 23-02-2004 à 12:34:03  profilanswer
 

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

n°651751
blackgodde​ss
vive le troll !
Posté le 23-02-2004 à 12:37:09  profilanswer
 

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


---------------
-( BlackGoddess )-
mood
Publicité
Posté le 23-02-2004 à 12:37:09  profilanswer
 

n°651760
leneuf22
Posté le 23-02-2004 à 12:41:28  profilanswer
 

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

n°651765
blackgodde​ss
vive le troll !
Posté le 23-02-2004 à 12:45:26  profilanswer
 

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 )-
n°651775
leneuf22
Posté le 23-02-2004 à 12:53:50  profilanswer
 

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

n°651841
blackgodde​ss
vive le troll !
Posté le 23-02-2004 à 14:05:28  profilanswer
 

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


---------------
-( BlackGoddess )-
n°651847
Taz
bisounours-codeur
Posté le 23-02-2004 à 14:11:03  profilanswer
 

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

n°651857
blackgodde​ss
vive le troll !
Posté le 23-02-2004 à 14:22:35  profilanswer
 

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 )-
n°652072
Khyna
Posté le 23-02-2004 à 16:33:48  profilanswer
 

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

n°652090
Taz
bisounours-codeur
Posté le 23-02-2004 à 16:43:06  profilanswer
 

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

n°653405
leneuf22
Posté le 24-02-2004 à 17:37:31  profilanswer
 

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.

n°653420
Taz
bisounours-codeur
Posté le 24-02-2004 à 17:46:23  profilanswer
 

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

n°653577
blackgodde​ss
vive le troll !
Posté le 24-02-2004 à 19:28:07  profilanswer
 

euh ... c quoi auto et restrict ??

n°653619
Taz
bisounours-codeur
Posté le 24-02-2004 à 19:59:56  profilanswer
 

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

n°653914
blackgodde​ss
vive le troll !
Posté le 24-02-2004 à 23:38:36  profilanswer
 

ok , mci :)

mood
Publicité
Posté le   profilanswer
 


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

  Problèmes de passage de pointeur en paramètre

 

Sujets relatifs
Passage de pointeurs en paramètre erronés !Peut on appeller un .exe creer en VB avec un parametre ?
pointeur et structureParametre template sous forme de chaine de caracteres
[MySql] Requete parametre sur likeAffichage d'un div au passage de la souris
Problèmes de compilation avec gcc sous LinuxPassage de paramètres avec un callback
Sondage Pointeur 
Plus de sujets relatifs à : Problèmes de passage de pointeur en paramètre


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