IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Erreur à l'ouverture d'un fichier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut Erreur à l'ouverture d'un fichier
    Bonjour

    J'obtient le message suivant que je n'arrive pas à débugger. L'erreur se produit (d'après mes tests d'affichages dans cette fonction, à la ligne que j'ai indiqué !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    int print_conf ( int step ) {
     
      int   erreur = 0 ;
      int   iat ;
      char  num[LEN], nom[LEN] ;
      FILE  *mdcrd ;
     
      strcpy ( nom, amdcrd ) ;
     
      if ( ncrd > 0 ) {
        strcat( nom , ".xyz" ) ;
        mdcrd = fopen( nom , "w" ) ;  "  <= ICI * * * * * * * * "
      } else if ( ncrd < 0 ) {
        sprintf( num, "_%d.xyz", step ) ;
        strcat( nom, num ) ;
        mdcrd = fopen( nom, "w" ) ;
      } else {
        return erreur ;
      }
     
      // impression de la conf
      fprintf( mdcrd,"%d \n",nat) ;
      fprintf( mdcrd,"coordonnees xyx en angstrom, iteration = %d \n", step ) ;
      for ( iat = 0 ; iat < nat ; iat++ ) {
        fprintf( mdcrd,"%s %8.3f %8.3f %8.3f\n", aname, x[iat]*1e10, y[iat]*1e10, z[iat]*1e10 );
      }
     
      fclose(mdcrd) ;
     
      return erreur ;
    }
    J'ai du mal à comprendre pourquoi j'ai une telle erreur ici. Surtout que cette erreur se produit au 2eme passage à cet endroit pendant l'exécution du programme.

    Merci pour votre aide

    Voici le message d'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    *** glibc detected *** cargol_dev: malloc(): memory corruption: 0x00002addf3d8f010 ***
    ======= Backtrace: =========
    /lib64/libc.so.6[0x34ba0724ac]
    /lib64/libc.so.6(__libc_malloc+0x7a)[0x34ba07402a]
    /lib64/libc.so.6[0x34ba0616ba]
    cargol_dev[0x406ab5]
    cargol_dev[0x4016d7]
    cargol_dev[0x4042b7]
    /lib64/libc.so.6(__libc_start_main+0xf4)[0x34ba01d974]
    cargol_dev[0x400dd9]
    ======= Memory map: ========
    00400000-0040b000 r-xp 00000000 00:16 16420150                           /****/cargol/cargol_dev
    0060b000-0060c000 rw-p 0000b000 00:16 16420150                           /******/programme/cargol/cargol_dev
    1456e000-147c0000 rw-p 1456e000 00:00 0                                  [heap]
    34b9a00000-34b9a1c000 r-xp 00000000 08:02 2207999                        /lib64/ld-2.5.so
    34b9c1b000-34b9c1c000 r--p 0001b000 08:02 2207999                        /lib64/ld-2.5.so
    34b9c1c000-34b9c1d000 rw-p 0001c000 08:02 2207999                        /lib64/ld-2.5.so
    34ba000000-34ba14c000 r-xp 00000000 08:02 2208485                        /lib64/libc-2.5.so
    34ba14c000-34ba34c000 ---p 0014c000 08:02 2208485                        /lib64/libc-2.5.so
    34ba34c000-34ba350000 r--p 0014c000 08:02 2208485                        /lib64/libc-2.5.so
    34ba350000-34ba351000 rw-p 00150000 08:02 2208485                        /lib64/libc-2.5.so
    34ba351000-34ba356000 rw-p 34ba351000 00:00 0
    34ba400000-34ba482000 r-xp 00000000 08:02 2208490                        /lib64/libm-2.5.so
    34ba482000-34ba681000 ---p 00082000 08:02 2208490                        /lib64/libm-2.5.so
    34ba681000-34ba682000 r--p 00081000 08:02 2208490                        /lib64/libm-2.5.so
    34ba682000-34ba683000 rw-p 00082000 08:02 2208490                        /lib64/libm-2.5.so
    34c0400000-34c040d000 r-xp 00000000 08:02 2204497                        /lib64/libgcc_s-4.1.2-20080825.so.1
    34c040d000-34c060d000 ---p 0000d000 08:02 2204497                        /lib64/libgcc_s-4.1.2-20080825.so.1
    34c060d000-34c060e000 rw-p 0000d000 08:02 2204497                        /lib64/libgcc_s-4.1.2-20080825.so.1
    2addf3d8b000-2addf3d8c000 rw-p 2addf3d8b000 00:00 0
    2addf3d8d000-2addf3d91000 rw-p 2addf3d8d000 00:00 0
    2addf3daf000-2addf3db1000 rw-p 2addf3daf000 00:00 0
    2addf4000000-2addf4021000 rw-p 2addf4000000 00:00 0
    2addf4021000-2addf8000000 ---p 2addf4021000 00:00 0
    7fffb6d09000-7fffb6d1e000 rw-p 7ffffffea000 00:00 0                      [stack]
    ffffffffff600000-ffffffffffe00000 ---p 00000000 00:00 0                  [vdso]
    Aborted

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 42
    Par défaut
    Si je ne me trompe pas la variable amdcrd est une variable global ?

    Si oui, elle est sans doute modifié par ton programme et donc au deuxième passage, elle indique un mauvais nom d'où l'erreur pour ouvrir un fichier.

    Mauvais nom ou peut être que la mémoire pour cette variable n'est pas bien alloué ou réalloué .

    a+,

  3. #3
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 085
    Par défaut
    Bonsoir,

    C'est une tres bonne initiative que d'utiliser des printf afin de retracer le cheminement du programme.
    Malheuresement, il arrive que cette methode se retourne contre toi. Tu peux etre victime d'une "erreur" silencieuse (ou d'une erreur "poupée Russe" comme je les appel ^^).

    Dans un premier temsp, il FAUT TOUJOURS tester le retour de certaine fonction.
    Ce sont les fonction primoriale en general, c'est a dire les malloc, les fopen ...
    Ne va pas tester un printf.

    Pourquoi ca ? Parce que si tu ouvre un fichier avec fopen mais que cela plante (a cause du mauvais chemin, etc etc), ton programme va continuer et plantera plus loin, a une ligne qui n'a rien a voir avec l'origine du probleme (la fameuse erreur silencieuse/poupée Russe). C'est pour cela qu'il faut agir des la manifestation du probleme.


    Pour cela, il faut regarder la doc de la fonction (ou "man", pour les fonction standart). Il y a toujours une valeur retourner par la fonction permettant de savoir si oui ou non elle s'est bien passer.

    Par exemple, fopen retourne NULL en cas d'erreur et une adresse valide pour la reussite.

    Donc, apres fopen, si tu as NULL, c'est qu'il y a eu un probleme.
    Maintenant que l'on sait qu'il y a eu un probleme, il faut agir.
    La meilleur chose a faire et dabord de savoir pourquoi ca a planter.

    Pour cela, il existe une fonction qui permet d'afficher la derniere erreur rencontrer par une fonction standart : il s'agit de la fonction perror.
    L'erreur est decrite dans le fichier de sortie d'erreur : stderr (c'est autoamtique, rien a preciser)

    Donc, pour faire simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    FILE *fichier = fopen("monBidule.txt", "r");
     
    /* On regarde s'il y a eu un probleme */
    if (fichier == NULL)
    {
        /* On affiche le message d'erreur, a toi de voir comment marche perror */
        perror ("Probleme lors de l'ouverture de \"monBidule.txt\" en mode \"r\" dans la fonction TaFonction ");
     
       /* Et la, c'est a toi de decider quoi faire : quitter la fonction seulement ? arreter le programme ? */
    }
    Voila, fais ca pour tout tes malloc et fopen, ce sera deja bien.


    Je le repete encore une fois, faire des variable global, a moins de pouvoir le justifier, est dangereux, je te le deconseille.

  4. #4
    Membre émérite
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut
    J'ai trouvé mon erreur.

    En fait j'ai déclaré des structures FILE en variables globales (désolé sofEvens). Je les ouvre au début de l'exécution et je pensais ne les fermer qu'à la fin. Cette manip m'évite au cours des itération du calcul d'ouvrir et fermer le fichier sans arret et ça accélère un peu le calcul.

    Le hic c'est que j'avais oublié de supprimer des lignes ou je fermais ou ouvrait ces même fichier ...

    Bref ça marche. Par contre j'aimerais savoir comment vous faites pour ne pas utiliser de variables globales. Moi j'en ai tout un tas et j'arrive po à m'en passer. Par exemple j'ai les vitesses et les positions d'une particules elles sont déclarer là modifier ici, imprimée là bas ect ... comment les transmettre utiliser des paramètres à chaque fois ?

  5. #5
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Le mieux, je pense, est encore d'utiliser les structures
    Comme ça tu passes le tout en argument

  6. #6
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 085
    Par défaut
    Oui, on transmet toutes les informations par parametre, il n'y a que ce moyen a part les varaible global (a ma connaissance).

    Apres, il faut voir : si vraiment tu dois avoir des variable global, fais les. L'exemple typique est l'utilisation d'openGL.

    Sinon, si tu ne reussi jamais a passer tes argument parce qu'il y en a trop, ou parce que c'est trop brouillon, c'est un manque de structure dans ton code.

    Si tu n'arrive pas a nommer clairement une fonction, c'est qu'elle fait trop de chose ou qu'elle est inadapter.

    En general, je m'en suis toujours tirer avec des fonction que je juge correct. Mais bon, j'ai toujours fait des programme "scolaire" (il y en a un ou j'ai fait énormément [pour moi] et ou c'est clair ^^)

Discussions similaires

  1. Gestion d'erreur à l'ouverture d'un fichier
    Par COCONUT2 dans le forum Général VBA
    Réponses: 6
    Dernier message: 20/01/2010, 22h47
  2. Réponses: 10
    Dernier message: 18/08/2006, 19h38
  3. Réponses: 12
    Dernier message: 16/06/2006, 16h22
  4. Msg d'erreur à l'ouverture d'un fichier
    Par climz dans le forum Access
    Réponses: 2
    Dernier message: 01/06/2006, 09h14
  5. erreur à l'ouverture de mon fichier xml
    Par 2tsiris dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 03/04/2006, 14h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo