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

  FORUM HardWare.fr
  Programmation
  C

  Segmentation fault

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Segmentation fault

n°636255
Khyna
Posté le 09-02-2004 à 17:34:30  profilanswer
 

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

mood
Publicité
Posté le 09-02-2004 à 17:34:30  profilanswer
 

n°636274
gilou
Modérateur
Modosaurus Rex
Posté le 09-02-2004 à 17:50:31  profilanswer
 

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! --  Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- Il ne faut plus dire Sarkozy, mais Sarkozon -- (╯°□°)╯︵ ┻━┻
n°636281
Taz
bisounours-codeur
Posté le 09-02-2004 à 18:02:34  profilanswer
 

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

n°636284
darkoli
Le Petit Dinosaure Bleu
Posté le 09-02-2004 à 18:14:49  profilanswer
 

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
n°636367
void_ppc
Posté le 09-02-2004 à 19:24:55  profilanswer
 

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

n°636372
Taz
bisounours-codeur
Posté le 09-02-2004 à 19:28:29  profilanswer
 

darkoli a écrit :

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


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

ça fait même « boom »

n°636432
Khyna
Posté le 09-02-2004 à 20:23:55  profilanswer
 

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
n°636452
Taz
bisounours-codeur
Posté le 09-02-2004 à 20:53:37  profilanswer
 

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

n°636461
Khyna
Posté le 09-02-2004 à 21:02:36  profilanswer
 

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 ?

n°636470
blackgodde​ss
vive le troll !
Posté le 09-02-2004 à 21:13:24  profilanswer
 

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 )-
mood
Publicité
Posté le 09-02-2004 à 21:13:24  profilanswer
 

n°636473
Taz
bisounours-codeur
Posté le 09-02-2004 à 21:15:56  profilanswer
 

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

n°636481
gilou
Modérateur
Modosaurus Rex
Posté le 09-02-2004 à 21:30:39  profilanswer
 

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! --  Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- Il ne faut plus dire Sarkozy, mais Sarkozon -- (╯°□°)╯︵ ┻━┻
n°636494
Khyna
Posté le 09-02-2004 à 21:46:43  profilanswer
 

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


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

  Segmentation fault

 

Sujets relatifs
Segmentation fault a cause d'un fseek(monFichier,0,0)Segmentation fault aléatoires !!
drole de segmentation fault (urgent)[C] fread -> segmentation fault
Signal Handler (segmentation fault)segmentation fault
Segmentation fault <core dumped>Impossible de lancer une commande systeme : segmentation fault
[Assembleur Intel] Segmentation Fault, SIGSEGV ?? 
Plus de sujets relatifs à : Segmentation fault


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)