Segmentation fault

Segmentation fault - C - Programmation

Marsh Posté le 09-02-2004 à 17:34:30    

Re bonjour,
Je m'y reprend pour vous expliquer mon pb.
J'ai une fonction :  
 

Code :
  1. int readDateDebut(struct rdv *unRdv, int numLigne ) {
  2.   int i = 0;
  3.   char* uneLigne;
  4.   char unChar;
  5.   int jour;
  6.   int mois;
  7.   int annee;
  8.   int minute;
  9.   int heure;
  10.   (int)uneLigne = malloc(100);
  11.   assert(numLigne > 0 );
  12.   //positionnement au debut du fichier.
  13.   fseek(monFichier,0,SEEK_SET);
  14.   //positionnement sur la bonne ligne.
  15.   while ( i != numLigne && !feof(monFichier) ) {
  16.    
  17.     fgets(uneLigne,100,monFichier);
  18.     i++;
  19.   }
  20.   //si on est sur la bonne ligne
  21.   if ( i == numLigne ) {
  22.     //r�cup�ration du jour de la date de debut.
  23.     unChar = uneLigne[0];
  24.     jour = atoi(&unChar);
  25.     jour = jour * 10;
  26.     unChar = uneLigne[1];
  27.  
  28.     //..je vous passe les détails.. (c pas de la que vient le pb.)
  29.    
  30.     minute = atoi(&unChar);
  31.     minute = minute * 10;
  32.     unChar = uneLigne[15];
  33.     minute = minute + atoi(&unChar);
  34.     unRdv->dateDebut.tm_min = minute; //<-
  35.     unRdv->dateDebut.tm_hour = heure; //<- C la que j'ai un segmentation fault.
  36.     unRdv->dateDebut.tm_mday = jour;  //<-
  37.     unRdv->dateDebut.tm_mon = mois;   //<-
  38.     unRdv->dateDebut.tm_year = annee;;//<-
  39.   } else {//sinon on est a la fin du fichier.
  40.     printf("EOF!!\n" );
  41.     return 1;
  42.   }
  43.   free(uneLigne);
  44.   return 0;
  45. }


 
et mon main() :  

Code :
  1. int main (int argc, char **argv) {
  2.   struct rdv *rdv1;
  3.   monFichier = fopen(argv[1],"r" );//ouvre le fichier pass� en parametre en lecture.
  4.   if ( monFichier == NULL ) {//test si l'ouverture c'est bien passer.
  5.    
  6.     close(monFichier);//on ferme le fichier
  7.     printf("Pas d'acces � %s \n", argv[1]);//et on enonce le probleme.
  8.     return 1;
  9.   } else {
  10.     printf("debut de la lecture du rdv de la ligne 2\n" );
  11.     //fseek(monFichier,0,SEEK_SET);
  12.     readRDV(rdv1,2);
  13.     printf("fin de la lecture du rdv de la ligne 2\n" );
  14.     fclose(monFichier);
  15.   }
  16.   return 0;
  17. }


et j'ai un segmentation fault la ou je l'ai mis en commentaire.
voici la ma struct rdv :

Code :
  1. struct rdv {
  2.   struct tm dateDebut;
  3.   struct tm dateFin;
  4.   char libelle[77];
  5. };


 
si qqun peut m'éclairer ca serait sympa.
Merci d'avance

Reply

Marsh Posté le 09-02-2004 à 17:34:30   

Reply

Marsh Posté le 09-02-2004 à 17:50:31    

Ben tu alloues pas la memoire pour ta structure:
==> struct rdv *rdv1;  
Tu declares un pointeur sur une structure (non allouée).
==> readRDV(rdv1,2);  
Si c'est la meme chose que: int readDateDebut(struct rdv *unRdv, int numLigne )
==> unRdv->dateDebut.tm_min = minute;
rien que la deja ca peut foirer, puisque unRdv pointe sur une zone non allouée.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 09-02-2004 à 18:02:34    

tu peux te calmer s'il te plait ? deux topics avec 2 titres pourris, deux fois que je perds mon temps pour voir que tu n'a pas alloué une pauvre structure

Reply

Marsh Posté le 09-02-2004 à 18:14:49    

char unChar;
int minute;  
[...]
minute = atoi(&unChar);


C'est pas très propre tout ça.
 
Je pense qu'il y a en fait pas mal de choses à reprendre dans ton code.
 
Quel est le format d'une ligne de ton fichier ?


Message édité par darkoli le 09-02-2004 à 18:16:08
Reply

Marsh Posté le 09-02-2004 à 19:24:55    

taz a écrit :

tu peux te calmer s'il te plait ? deux topics avec 2 titres pourris, deux fois que je perds mon temps pour voir que tu n'a pas alloué une pauvre structure


 
monseigneur à daigné regarder le topic, monseigneur est trop bon.
 
Arrêtez de poser des questions vous autres, monseigneur attend de la question de qualité, qui vaille le coup de bouger son lard

Reply

Marsh Posté le 09-02-2004 à 19:28:29    

darkoli a écrit :

char unChar;
int minute;  
[...]
minute = atoi(&unChar);


C'est pas très propre tout ça.

ça fait même « boom »

Reply

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

Désolé pour ceux que j'ai ofensé...
 
Mais le problème est que ca passait tres bien chez moi comme ca.
Et je suis un grand débutant en C.
donc il faut vraiemnt que j'alloue de la mémoire pour chaque pointeur? Comment ca se fait que ca passait chez moi et pas a mon ecole ?
 
Pour ce qui est de la propreté du code est ce que qqun peut me conseillier qqchose car je vois pas pkoi c pas propre (je débute ..)...
 
Voici le format d'une ligne de mon fichier :

Code :
  1. 15/08/2003 12:00-13:00 Aller chez le coiffeur


Message édité par Khyna le 09-02-2004 à 20:26:02
Reply

Marsh Posté le 09-02-2004 à 20:53:37    

non
parce que t'avais du bol, tu te balladais dans uns egment de mémoire à tois

Reply

Marsh Posté le 09-02-2004 à 21:02:36    

Donc si je comprend bien a chaque pointeur il faut un malloc et un free ?...
Mais dans ce cas la comment je fais pour mon pointeur sur FILE (FILE *monFichier) je lui alloue quoi comme et mémoire ? idem pour rdv1 ?

Reply

Marsh Posté le 09-02-2004 à 21:13:24    

c'est fopen qui alloue en interne un ptr FILE, et fclose qui le libère.
pour rdv1 tu dois bien utiliser malloc et free.


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

Marsh Posté le 09-02-2004 à 21:13:24   

Reply

Marsh Posté le 09-02-2004 à 21:15:56    

khyna a écrit :

Donc si je comprend bien a chaque pointeur il faut un malloc et un free ?...
Mais dans ce cas la comment je fais pour mon pointeur sur FILE (FILE *monFichier) je lui alloue quoi comme et mémoire ? idem pour rdv1 ?

non. un pointeur est une chose complètement distincte des allocations dynamiques

Reply

Marsh Posté le 09-02-2004 à 21:30:39    

khyna a écrit :

Donc si je comprend bien a chaque pointeur il faut un malloc et un free ?...
Mais dans ce cas la comment je fais pour mon pointeur sur FILE (FILE *monFichier) je lui alloue quoi comme et mémoire ? idem pour rdv1 ?


 
Tu confonds deux choses:
Le pointeur et ce sur quoi il pointe.
- Tu n'alloues pas de la memoire a un pointeur, c'est fait quand tu le declares (puisque c'est juste un truc de taille fixe contenant une adresse memoire, le compilo sait tres bien allouer ca de maniere automatique).
Mais ton pointeur, il doit pointer sur quelque chose qui a ete alloué en memoire (et ca le compilo ne peut pas savoir a l'avance de quelle taille ca va etre, puisque tu peux tres bien faire pointer ton pointeur sur plusieurs objets successifs du type pointé: int *p, tu peux faire pointer ca sur un entier, ou sur une suite de n entiers; d'autre part, le compilo peut pas savoir a l'avance si tu veux pointer sur un nouvel objet, ou sur un objet existant deja). Donc ce sur quoi ton pointeur va pointer (ie stocker l'adresse memoire)
- Soit c'est deja alloué (par exemple, quand tu vas faire ton FILE *monFichier tu declares juste le pointeur, et quand tu fais monFichier = fopen(argv[1],"r" ); tu fais pointer ton pointeur sur un truc alloué par le systeme et retourné par la fonction fopen. (et dans le cas de trucs alloués par le systeme, il y a soit des fonctions systeme pour desallouer, soit c'est explicitement indiqué dans la documentation de la fonction systeme qui t'a fourni l'objet sur lequel ton pointeur pointe que c'est a toi de le desallouer apres utilisation).
- Soit c'est pas alloué, et c'est a toi de faire l'allocation a coup de malloc puis apres usage, de faire la desallocation a coup de free.
 
A+,


Message édité par gilou le 09-02-2004 à 21:37:48

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 09-02-2004 à 21:46:43    

Merci bcp, je vais avancer grace a ca.
J'ai du boulot devant moi et je dois revoir tout mon programme alors...
Merci encore pour votre aide

Reply

Sujets relatifs:

Leave a Replay

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