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 :

Pb : malloc qui marche une fois sur deux .... ?


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 32
    Points : 24
    Points
    24
    Par défaut [RESOLU] Pb : malloc qui marche une fois sur deux .... ?
    Bonjour à tous ,

    alors là j'ai un gros problème et incompréhensible (pour moi en tout cas)
    je reprend un programme écrit sous Unix et je le met sous Cygwin (sous windows).
    Ce programme a dû être écrit par des informagiciens !

    voila comment je déclare mon pointeur :

    voila comment je lui alloue la mémoire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     fbinaire = (char*) malloc (sizeof(char)*255);
    C'est cette dernière ligne qui ne marche pas ... Ou du moins le programme la passe une fois sur deux , et des fois une fois sur quatre ! (en fait c'est aléatoire)

    Symptômes ... : Le programme s'arrête violemment !

    Quelqu'un saurait de quoi ça vient svp ?

    Je rappelle que je bosse sous Cygwin et que ça marche très bien sous Unix !

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 29
    Points : 31
    Points
    31
    Par défaut
    on pourrait avoir un peu plus a se mettre sous la dent stp
    il y a trois sortes de personnes : celles qui savent compter et celles qui ne savent pas compter ...

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 32
    Points : 24
    Points
    24
    Par défaut
    Ben que veux tu que je te dise d'autre ? lol

    ya le "free(fbinaire)" à la fin ... c'est tout ce que je peux dire !

    la syntaxe que j'ai mise marche mais pas tout le temps c'est tout !
    J'ai pas de message d'erreur , ... rien !

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Mias à part le ; qui manque à la fin de la premiere ligne, rien que du regulier dans ce que tu nous montres...

    c'est sans doute la lignes
    qui precede le malloc qui expliquerait le Pb, non ?

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 32
    Points : 24
    Points
    24
    Par défaut
    lol non je me fais pas des blagues pareilles

    Justement tout est régulier c'est ça qui m'inquiète ... :

    - La syntaxe est tout ce qu'il y a de plus normal
    - Si ça plante sous Unix et pas sous Cygwin alors ça doit venir de Cygwin
    - Si ça vient de Cygwin alors ça devrait planter tout le temps ! lol

    Incompréhensible !

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 29
    Points : 31
    Points
    31
    Par défaut
    gandalf : lol

    guillaume ce que je voulais dire : c'est met un peu plus de code !!
    il y a trois sortes de personnes : celles qui savent compter et celles qui ne savent pas compter ...

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 32
    Points : 24
    Points
    24
    Par défaut
    ben qu'est ce que tu veux de plus comme code ?!!!

    Tiens voila le code de la procédure !

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    int OuvrirF63( GESTION *gestionPtr, int argc, char **argv)
    {
      char *fbinaire, temp[255];
      FILE* Fichier63;
      FILE* FicCom;
      Station *Station63;
      Entete63 Entete;
     
      if (argc != 3) {
        Tcl_AppendResult (gestionPtr->interp, "Mauvais nombre d'arguments : ce doit etre \"", argv[0], " OuvrirF63 <nomFichier63> \"", 0) ;
        return(TCL_ERROR) ;
      }
    /**************** Test philou *********/
    printf ("\nAvant alloc memoire dans OuvrirF63\n");
    /***********************************/
     
      Station63 = (Station*) malloc(sizeof(Station));
     
     
    /**************** test philou *********/
    printf ("\nEntre les deux malloc\n");
    /**********************************/
     
      fbinaire = (char*) malloc(sizeof(char)*255);
     
    /********** test philou **********/
    printf ("on est au debut de OuvrirF63");
    /*********************************/ 
     
       if ( estBinaire(argv[2]) == 0 ) {
         creeBinaire(argv[2], fbinaire);	       
         }
        else {
         strcpy(fbinaire, argv[2]);
       }  
     
      /* Ouverture en lecture du fichier binaire */
      Fichier63 = fopen(fbinaire, "rb");
     
     
      /* Creation du fichier de communication C/Tcl utilise par LectureStation */
      strcpy (temp, (char *)getenv("HOME"));
      strcat (temp, FIC_COM);
      FicCom = fopen(temp, "w");
     
      /* Ecriture dans le fichier de communication des informations contenues
       *  dans le fichier binaire */
      LectureStation(Fichier63, FicCom, Station63, Entete);
      /* verifs 
         printf("\n %s passe par lecture station cree temp.txt \n");*/
     
      /* Ecriture du nom complet du fichier binaire a la fin du fichier de cimmunication */
      fprintf( FicCom, "%s\n", fbinaire);
     
      fclose(Fichier63);
      fclose(FicCom);
     
      free(Station63);
     
      free(fbinaire);
     
      return (TCL_OK);
    }
    Tu me diras si ça t'aide ... mais j'en doute ...


    Il y a 3 tests (" /******* test philou ********/) :

    - les deux premiers marchent à tous les coups
    - le troisième ( printf("On est au début de ouvrirF63") ) marche pas à tout les coups, et qd il s'affiche pas ça plante DONC ça vient de la ligne avec le malloc que je vous ai écrite dans le premier post !

  8. #8
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Peut-être n'as-tu pas assez de mémoire libre :
    Test le retour de malloc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if((fbinaire = (char*) malloc(sizeof(char)*255)) ==NULL )
    perror("Malloc failed ");
    Nas'

  9. #9
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Citation Envoyé par guillaume_pfr
    ...
    - le troisième ( printf("On est au début de ouvrirF63") ) marche pas à tout les coups, et qd il s'affiche pas ça plante DONC ça vient de la ligne avec le malloc que je vous ai écrite dans le premier post !
    Pardon pour ma boutade, mais tu vois tu finis par nous en donner un peu plus !

    tu fais une erreur d'interpretation, le fait que cette chaine ne s'affiche pas n'indique pas que ca plante avant, il faudrait faire un flush après le printf, ou au moins la finir avec un \n et tu verra que ton Pb viens certainement des lignes qui suivent....

    les sorties printf sont tamponnée...

  10. #10
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    ahhhh c'était ca l'erreur ? je pensais que tu parlais d'une erreur de malloc et que t'étais sur !! de toute facon, t'aurais tester le retour de malloc, t'aurais su direct que ce n'était pas le problème (si ton retour est différent de null).
    Sinon, pourquoi son printf ne s'affiche pas ? Qd j'ai ce genre d'erreur, mon premier reflexe est de vider le tampon (flushing) mais c'est juste un reflexe.
    Je comprend par exemple après un scanf que des elements "parasites" puisse rester ds le buffer, mais ds son code, qu'est-ce qui cause cela? je ne vois que des printf... ou alors c'est qch en dehors de cette fonction?

    Nas'

  11. #11
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    les printf remplissent un tampon et ce tampon est vidé quand il y trop de choses dedans, quand on ecrit sur la sortie standard (pas tjs) et souvent quand on mets un \n sur la sortie standard(pas tjs)...

    du coup, comme il n'y a pas de flush, on ne sait pas ou est l'erreur, en tout cas on ne peut pas si fier au fait que le printf ne sorte pas...

  12. #12
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 32
    Points : 24
    Points
    24
    Par défaut
    le problème c'est que même si je teste le retour du malloc je n'ai pas de trace.....même en "flushan!!"
    Donc je ne sais plus quoi faire....mais je pense bien que le problème vient du malloc et de cygwin

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    int OuvrirF63( GESTION *gestionPtr, int argc, char **argv)
    {
      char *fbinaire, temp[255];
      FILE* Fichier63;
      FILE* FicCom;
      Station *Station63;
      Entete63 Entete;
    FILE* log;
     
      if (argc != 3) {
        Tcl_AppendResult (gestionPtr->interp, "Mauvais nombre d'arguments : ce doit etre \"", argv[0], " OuvrirF63 <nomFichier63> \"", 0) ;
        return(TCL_ERROR) ;
      }
    /**************** Test philou *********/
    printf ("\nAvant alloc memoire dans OuvrirF63\n");
     
    /***********************************/
     
     
     Station63 = (Station*) malloc(sizeof(Station));
     
    /**************** test philou *********/
    printf ("\nEntre les deux malloc\n");
    /**********************************/
     
    log=fopen (LOG_FILE,"a+");
    if (log == NULL) {
    	printf ("probleme ouverture fichier %s, errno=%d\n"LOG_FILE, errno);
    }
    fprintf (log,"\nEntre les deux malloc\n");
    fflush(log);
     
     
    fbinaire = (char*) malloc(sizeof(char)*255);
    if (fbinaire == NULL) {
    fprintf (log, "Probleme alloc mémoire, errno=%d",errno );
    }
    fflush(log);
     
     
       if ( estBinaire(argv[2]) == 0 ) {
         creeBinaire(argv[2], fbinaire);	       
         }
        else {
         strcpy(fbinaire, argv[2]);
       }  
     
      /* Ouverture en lecture du fichier binaire */
      Fichier63 = fopen(fbinaire, "rb");
     
     
      /* Creation du fichier de communication C/Tcl utilise par LectureStation */
      strcpy (temp, (char *)getenv("HOME"));
      strcat (temp, FIC_COM);
      FicCom = fopen(temp, "w");
     
      /* Ecriture dans le fichier de communication des informations contenues
       *  dans le fichier binaire */
      LectureStation(Fichier63, FicCom, Station63, Entete);
      /* verifs 
         printf("\n %s passe par lecture station cree temp.txt \n");*/
     
      /* Ecriture du nom complet du fichier binaire a la fin du fichier de cimmunication */
      fprintf( FicCom, "%s\n", fbinaire);
     
      fclose(Fichier63);
      fclose(FicCom);
     
      free(fbinaire);
      free(Station63);
     
     
      return (TCL_OK);
    }
    J'ai même testé avec un fichier log pour voir le message de retour du malloc mais il y a jamais de message dans le log.....sauf erreur de code de ma part...

  13. #13
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Si c'est printf qui est tamponnées et que l'erreur est bien celle indiquée par Gandalf, cela veut dire qu'il vaut purjer stdout et non le flux de ton fichier.
    Essaye donc de faire :
    Nas'

  14. #14
    fd
    fd est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 131
    Points : 162
    Points
    162
    Par défaut
    si tu pense que le pbm viens du malloc c'est que tu dois corrompre ton heap quelque part.

  15. #15
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 32
    Points : 24
    Points
    24
    Par défaut
    Erf désolé ça venait pas du malloc !

    Je savais pas qu'il fallait flusher les tampons après chaque printf !
    J'ai bien purgé le stdout comme vous me l'avez dit et j'ai maintenant réussi à localiser la panne !

    Merci à tous !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/10/2011, 10h14
  2. Pb de requête qui marche une fois sur deux
    Par emulamateur dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 26/04/2011, 16h45
  3. NamedQuery qui marche une fois sur deux
    Par Damascus06 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 06/12/2010, 15h41
  4. getElementById qui retourne "" une fois sur deux
    Par Cronycs dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/05/2007, 17h33
  5. Erreur ASP : le test qui marche une fois sur 2 !
    Par Ryo_san dans le forum ASP
    Réponses: 2
    Dernier message: 04/07/2006, 09h47

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