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 :

Drole de bug avec Calloc !


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2007
    Messages : 106
    Par défaut Drole de bug avec Calloc !
    Bonjour a tous,

    voila, j'ai cree un petit parser de commande, modeste et pas parfait mais suffisant pour mes besoins....

    il fonctionne correctement mais cree un bug assez bizarre : les allocations memoires dynamiques, que j'effectue apres, plantent.
    Les variables utilisees pour ces allocations n'ont apparement aucun lien avec le parser. Cependant, si j'ote le parser, tous va bien.... bizarre

    encore plus bizarre, le code fonctionne parfaitement sous linux. sous windows avec devcpp..bug.

    voici un code minimal qui demontre le probleme

    merci d'avance pour votre aides

    Dav
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par dmichel
    Bonjour a tous,

    voila, j'ai cree un petit parser de commande, modeste et pas parfait mais suffisant pour mes besoins....

    il fonctionne correctement mais cree un bug assez bizarre : les allocations memoires dynamiques, que j'effectue apres, plantent.
    Les variables utilisees pour ces allocations n'ont apparement aucun lien avec le parser. Cependant, si j'ote le parser, tous va bien.... bizarre

    encore plus bizarre, le code fonctionne parfaitement sous linux. sous windows avec devcpp..bug.

    voici un code minimal qui demontre le probleme

    merci d'avance pour votre aides

    Dav
    Salut,

    Je n'ai pas regardé en détail, mais c'est pas beau à voir. Outre l'inclusion de l'en-tête iostream qui n'existe pas en C et les casts de calloc() qui sont déconseillés, je vois:

    • Des variables globales: en as-tu réellement besoin?
    • Que fait ta fonction allocationmem(), à part générer des trous de mémoire, parce que là, je vois pas? ())

    De manière générale, tu ne vérifies jamais la valeur de retour de tes fonctions d'allocation dynamique. C'est une grosse erreur, tu devrais toujours le faire...

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    et c'est passé à la compile ça ???? sous Linux ????

    je te crois pas...

    Au moins 2 énormités qui ne passent pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     Opt_name[0] = "-h";
     Opt_name[1] = "-c";
     Opt_name[2] = "-p";
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
               Opt_data[j] = cmd_v[i+k+1];
    Les chaînes de caractères ne se copient pas comme ça, en C...

    Il faut utiliser un strcpy, ou un strdup...

    Comme tu as déjà alloué la mémoire, ça sera strcpy :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    strcpy( Opt_name[0], "-h");
    strcpy( Opt_name[1], "-c");
    strcpy( Opt_name[2], "-p");
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
               strcpy (Opt_data[j], cmd_v[i+k+1]);

  4. #4
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2007
    Messages : 106
    Par défaut
    oups...j'avais pa fais gaffe a l'en-tête iostream...

    mais a part ca...oui le code est assez brouillon avec des variable globales, etc...
    mais ca n'explique pas le probleme ! La fonction allocationmem() ne fait rien en effet....car c'est juste un example !

    Pourquoi est-ce que ca plante avec le parser ? pourquoi ca passe sans le parser?

    sinon, ca compile sans problemes sous linux (as-tu essaye au moins ?)
    et je vois pas le probleme avec Du moment que Opt_name est definie comme

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Il n'y a aucun problème à faire sauf que tu as une fuite de mémoire puisqu'avant tu as alloué de la mémoire à Opt_name[0].
    J'ai regardé ton code, à quoi sert cette fonction
    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
    void allocationmem(int bla)
    {
     
    int *gb_type,*gb_line,*gb_fill,*gb_trans,*gb_orient;
    int *gb_type_old,*gb_line_old,*gb_fill_old,*gb_trans_old,*gb_orient_old;
    int *gb_type_left,*gb_type_right;
     
    printf("allocation...\n");
     
           gb_type = (int*)calloc(bla,sizeof(int));
           gb_fill = (int*)calloc(bla,sizeof(int));
           gb_line = (int*)calloc(bla,sizeof(int));
           gb_trans = (int*)calloc(bla,sizeof(int));
           gb_orient = (int*)calloc(bla,sizeof(int));
           gb_type_old = (int*)calloc(bla,sizeof(int));
           gb_fill_old = (int*)calloc(bla,sizeof(int));
           gb_line_old = (int*)calloc(bla,sizeof(int));
           gb_trans_old = (int*)calloc(bla,sizeof(int));
           gb_orient_old = (int*)calloc(bla,sizeof(int));
           gb_type_left = (int*)calloc(bla,sizeof(int));
           gb_type_right = (int*)calloc(bla,sizeof(int));
     
    printf("allocation terminated\n");
     
    }/*end function*/
    Puisque tu alloues des variables qui ne sont pas utilisées ensuite ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Trap D
    Il n'y a aucun problème à faire
    EN C ?????????????

    que je sache "-h" est une chaîne de caractères, pas un caractère..

    Et en C, la copie/assignation de chaîne se fait par strcpy..

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

Discussions similaires

  1. Drole de bug avec DataGrid et requete
    Par angelevil dans le forum Windows Forms
    Réponses: 4
    Dernier message: 06/06/2009, 00h20
  2. Bug avec le test de profondeur
    Par Tellmarch dans le forum OpenGL
    Réponses: 1
    Dernier message: 17/10/2004, 00h59
  3. Bug avec requete
    Par arsgunner dans le forum ASP
    Réponses: 8
    Dernier message: 14/06/2004, 16h25
  4. [C#] Bug (?) avec la propriété TransparencyKey de la Form
    Par FrigoAcide dans le forum Windows Forms
    Réponses: 5
    Dernier message: 21/05/2004, 14h14
  5. [CR9] Bug avec les champs à valeur vide ?
    Par Djob dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 15/07/2003, 21h21

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