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 :

Aucun problème à la compilation mais plantage à l'exécution


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2012
    Messages : 149
    Points : 112
    Points
    112
    Par défaut Aucun problème à la compilation mais plantage à l'exécution
    Bonsoir,

    Je suis nouveau dans le forum et j'ai un projet à faire pour l'école.
    C'est un programme qui gère le stock d'un magasin (une base de donnée en C koi)

    J'ai aucune erreur à la compilation mais lorsque je l'exécute, il plante direct.

    Je me dis que c'est surement un problème au niveau des pointeurs mais ou et lekel?

    J'ai regardé pendant des heures et des heures et des jours mnt, mais rien.
    J'ai utilisé le debugger mais je ne comprend pas trop ce qu'il m'affiche.

    Si quelqu'un serait m'aider ou me mettre dans la bonne voix, ce serait vraiment sympa...
    J'ai mis le projet entier en pièce jointe dans un .rar, il se présente en 5 fichiers :
    le main, 2 fichiers .h pour les prototype et 2 fichiers .c contenant les fonctions.

    J'ai aussi ajouté une image du schéma de la liste que j'ai faite pour avoir une
    vision de la liste chainé.

    Sinon on ma parlé de d.u.m.a mais j'ai pas trouvé de tuto ou d'explication sauf en anglais sur comment l'utiliser.



    Merci d'avance
    Images attachées Images attachées  
    Fichiers attachés Fichiers attachés

  2. #2
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Hello,

    j'ai juste jeté un coup d'oeil rapide ...

    stock.c : l88 : strcpy(category,buff);
    category n'est pas alloué.

    stock.c : l90 : strcpy(name,buff);
    name n'est pas alloué.

    Ces accès font planter ton appli, je n'ai pas cherché plus loin.

    EDIT: J'ai trouvé ces erreurs en consultant les messages du build :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /Projet_gestion_stock/stock.c||In function ‘loadStock’:|
    /Projet_gestion_stock/stock.c|88|warning: ‘category’ may be used uninitialized in this function|
    /Projet_gestion_stock/stock.c|90|warning: ‘name’ may be used uninitialized in this function|
    /Projet_gestion_stock/stock.c|107|warning: ‘expiDate’ may be used uninitialized in this function|
    ||=== Build finished: 0 errors, 3 warnings ===|

  3. #3
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2012
    Messages : 149
    Points : 112
    Points
    112
    Par défaut
    merci pour ton aide, j'ai corrigé les erreurs en insérant cela dans la boucle for :

    char *category=malloc(sizeof(buff));
    char *name=malloc(sizeof(buff));

    et dans la boucle for suivante :

    char *expiDate=malloc(sizeof(buff));

    Sinon mnt à l'exécution il met un peu plus de temps mais il plante encore donc ya surement encore d'autres erreurs


    ps: Je n'avais pas ces warnings avec codeblocks, tu utilise quel compilateur?

  4. #4
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Salut,

    j'ai installé code::blocks sous linux avec gcc, mais je rajoute toujours les options -Wall et -Wextra (qui signalent ce genre d'oubli). C'est parfois un peu verbeux, tous les warning ne sont pas forcément à éliminer.
    Pour les checks mémoire j'utilise valgrind (un outil indispensable dans la boîte du développeur C )

    Quelles sont les nouvelles erreurs ?

  5. #5
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2012
    Messages : 149
    Points : 112
    Points
    112
    Par défaut
    il n'y a pas son équivalent sur windows?


    Pour ma part, codeblocks m'affiche 0 erreur et 0 warnings mais à l'exécution
    il plante encore.

    Je n'ai pas de linux sous la main sauf si j'installe une machine virtuelle,

    vous ne pourriez pas juste compiler avec valgrind mon code et m'afficher les erreurs qu'il montre pour que j'ai une idée et puisse continuer à trouver les erreurs sil vous plait... ??


    Merci de votre patience

  6. #6
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Dans codeblocks, tu vas dans project build options et tu sélectionnes dans compiler options les lignes avec -Wall et -Wextra pour avoir les messages supplémentaires.

    Poste ton code modifié pour travailler sur les mêmes sources.

  7. #7
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Essaye le debug ... tu as une fenêtre call stack quand ça plante regarde ce qui y est écrit. Il devrait à mon avis te renvoyer vers la ligne 113 de stock.c ; à ton avis comment cette ligne pourrait-elle provoquer une erreur ?

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 630
    Points : 30 860
    Points
    30 860
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par toufik135 Voir le message
    et dans la boucle for suivante :

    char *expiDate=malloc(sizeof(buff));
    Hum, j'ai pas lu ton code mais à ta description de ce malloc dans une boucle for je crains une fuite mémoire. Parce que, quand tu es à l'itération n° 2 de ta boucle et que tu récupères une zone mémoire allouée, tu en fais quoi de la zone allouée et récupérée lors de l'itération n° 1 ???

    Citation Envoyé par toufik135 Voir le message
    Sinon mnt à l'exécution il met un peu plus de temps mais il plante encore...
    Si tu travailles au plantage tu n'iras pas loin. Surtout que tu peux arriver dans des situations où le code bien qu'erroné ne fait pas planter de suite style
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *pt;
    strcpy(pt, "toto");
    où ce remplissage de pointeur non alloué fonctionnera pendant une semaine, un mois, un an mais un jour tu rajoutes un simple "printf()" et là ça plante. Et toi tu cherches comme un ouf pourquoi le printf() fait planter alors que l'erreur est ailleurs mais oubliée depuis longtemps.
    Un code ça se travaille d'abord avec sa tête...

    Citation Envoyé par toufik135 Voir le message
    ...donc ya surement encore d'autres erreurs
    J'ai quand-même récupéré et regardé le source. Je me suis arrêté ici
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ITEM *buildItem (int id, char *name, char *category, double price)
    {
        ITEM *article=malloc(sizeof(ITEM));
        article->id=id;
        article->name=name;
        article->category=category;
        article->price=price;
        return article;
    }
    Ben là tu ne copies dans tes éléments que des pointeurs qui pointent vers des variables probablement déjà effacées. Donc si tout le reste est à l'avenant effectivement il y a sûrement encore énormément d'autres erreurs...

    Citation Envoyé par toufik135 Voir le message
    ps: Je n'avais pas ces warnings avec codeblocks, tu utilise quel compilateur?
    Aucun compilateur ne remplace la réflexion...

    Citation Envoyé par toufik135 Voir le message
    Je n'ai pas de linux sous la main sauf si j'installe une machine virtuelle,
    C'est en effet parfois bien utile vu les outils dispo sous Linux...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2012
    Messages : 149
    Points : 112
    Points
    112
    Par défaut
    @Sve@r: tu propose d'allouer comment alors pour
    char *expiDate=malloc(sizeof(buff)); par exemple pour qu'il n'y ait pas de fuite?

    Pour la fonction ITEM *buildItem (int id, char *name, char *category, double price) enfet les éléments en entré sont pris d'un fichier .txt qu'on va lire ligne par ligne puis lorsqu'on a lu et mis grace a strcpy pour les char et atoi pour les int les éléments, on utilise cette fonction pour construire une structure donc à ce moment là, les éléments en entré existent et sont mis dans la structure puis la structure est retourné.

    J'ai créé un nouveau projet ou j'ai testé cette fonction et ça marche donc je vois pas trop ce que tu veux me dire désolé

    @kwariz: Voila j'ai vu cette ligne, je l'ai mis en commentaire puis j'ai lancé le debugger et il ma mis une autre ligne (42) où il y avait le *current qui parcourt la liste avec une boucle for
    Enfet j'avais mis i=0 au lieu de le mettre à 1 et donc à la fin de la liste, il parcourt encore une (qui n'existe pas) donc c'est normal qu'il plante.

    Maintenant il ne plante plus et s'exécute correctement (sans planter).

    Je vais donc maintenant tester avec les fonctions print pour voir si il fonctionne bien et affiche correctement ce qu'il doit afficher.

    Je vous tiens au courant mais en tout cas un grand merci à vous pour tout.

    J'ai attaché le fichier corrigé.
    Projet_gestion_stock.rar

  10. #10
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2012
    Messages : 149
    Points : 112
    Points
    112
    Par défaut
    Voila, ça marche pas lol, à l'affichage il met 2 ligne avec des valeurs rien à voir et plante.

    J'ai utilisé le debugger et il me met une erreur avec wscanf que je ne comprend pas, j'ai fait un screenshot et attaché le fichier pour que vous voyez cette erreur...

    Nom : erreur.JPG
Affichages : 66
Taille : 157,2 Ko

  11. #11
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2012
    Messages : 149
    Points : 112
    Points
    112
    Par défaut
    Serait-ce un problème au niveau de la lecture des valeurs depuis le fichier .txt
    ( à savoir les fgets ) ?

  12. #12
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2012
    Messages : 149
    Points : 112
    Points
    112
    Par défaut
    j'ai créé un nouveau projet pour tester la fonction qui lit le fichier et en effet, il lit mal le fichier :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main()
    {
        FILE *file=fopen("stock.txt","r");
        char buff[20];
        int i, id=0, quantity;
        double price;
     
        if(file!=NULL)
           {
               fgets(buff,20,file);
               int nbItems=atoi(buff);
     
               for(i=0;i<nbItems;i++)
                  {
     
                      char *category=malloc(sizeof(buff));
                      fgets(buff,20,file);
                      strcpy(category,buff);
     
                      char *name=malloc(sizeof(buff));
                      fgets(buff,20,file);
                      strcpy(name,buff);
     
                      fgets(buff,20,file);
                      price=atoi(buff);
     
                      printf("\n %s %s : %lf ",category,name,price);
     
     
                      id++;
     
                  }
     
              fgets(buff,20,file);
     
              for(i=0;i<nbItems;i++)
                  {
                        fgets(buff,20,file);
                        id=atoi(buff);
     
                        fgets(buff,20,file);
                        quantity=atoi(buff);
     
                        char *expiDate=malloc(sizeof(buff));
                        fgets(buff,20,file);
                        strcpy(expiDate,buff);
     
                        printf("\n %d %d expire le %s ",id,quantity,expiDate);
     
                  }
           }
     
           else
              {
                  printf("\n impossible d'ouvrir le fichier stock \n\n");
              }
     
         fclose(file);
        return 0;
    }
    Savez-vous comment utiliser correctement les fgets pour ce cas là?

  13. #13
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Effectivement, il y a beaucoup de choses à améliorer. Tout d'abord le prix est un flottant, alors un atoi qui renvoit un entier est le malvenu.
    Sve@r a tout à fait raison, tu alloues de la mémoire que tu ne libères jamais.

    Si j'étais toi, je refondrais un peu le code en ajoutant des fonctions qui manipulent tes structures (une fonction pour créer un stockItem/Item, une par champs pour accéder et une pour modifier ces champs, une pour libérer l'allocation faite ; au minimum) et réécrire ton code qui sera non seulement plus clair mais aussi plus facile à débugger.

    Je jèterais aussi un rapide coup d'oeil sur la doc du debugger de code::blocks, comment mettre un breakpoint, comment faire du pas à pas et comment examiner la valeur de tes variables (minimum indispensable à connaître quand on programme et que ça plante, c'est-à-dire tout le temps).

    Mettre en commentaire et bidouiller pour essayer de faire tomber ton programme en marche est à mon avis voué à l'échec.

    Je suppose que le format du fichier stock.txt est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    première lignes N=nombre de produit
    N fois {
      catégorie
      libellé
      prix
    }
    Plusieurs fois {
      id produit
      quantité
      ( date au format JJ/MM/AAAA 
        ou 
        '-' si pas de date
      )
    }
    Où plusieurs fois peut être différent de N, non ?

  14. #14
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 630
    Points : 30 860
    Points
    30 860
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par toufik135 Voir le message
    @Sve@r: tu propose d'allouer comment alors pour
    char *expiDate=malloc(sizeof(buff)); par exemple pour qu'il n'y ait pas
    de fuite?
    Imagines le code suivant
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (i=0; i < 10; i++)
    {
        toto=random();
    }
    Comme tu le vois, toto ne garde que la dernière valeur générée. Ben là c'est pareil. Ton expiDate ne garde que la nième zone allouée.
    Donc si tu veux conserver les 10 random(), te faut
    1) soit utiliser un tableau
    2) soit faire tout le traitement utilisant chaque random() dans le for
    Et pareil pour expiDate.
    Donc se serait un truc de ce type
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char *expiDate[10];
    for (i=0; i < 10; i++)
    {
        expiDate[i]=malloc(...);
    }

    Puis plus tard
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (i=0; i < 10; i++)
    {
        free(expiDate[i]);
    }

    Citation Envoyé par toufik135 Voir le message
    Pour la fonction ITEM *buildItem (int id, char *name, char *category, double price) enfet les éléments en entré sont pris d'un fichier .txt qu'on va lire ligne par ligne puis lorsqu'on a lu et mis grace a strcpy pour les char et atoi pour les int les éléments, on utilise cette fonction pour construire une structure donc à ce moment là, les éléments en entré existent et sont mis dans la structure puis la structure est retourné.

    J'ai créé un nouveau projet ou j'ai testé cette fonction et ça marche donc je vois pas trop ce que tu veux me dire désolé
    Je comprends un peu mieux comment tu travailles
    1) tu alloues une zone
    2) tu copies les octets lus depuis le fichier dans la zone (via strcpy())
    3) tu passes l'adresse de cette zone à ta fonction qui la stocke dans ta structure.
    Donc effectivement vu comme ça ça marche et comme l'adresse allouée est récupérée ailleurs il n'y a pas de fuite. Mais bon, pourquoi ne pas faire le malloc() dans la fonction ??? Au-moins tu la rends vraiment indépendante et simplifie ton code. Ou mieux, tu peux simplifier beaucoup de problèmes en présumant par exemple que name ne dépassera pas 30 caractères et mettre directement char name[31] dans ta structure et la remplir via strcpy(). Ainsi tu évites beaucoup de soucis liés au malloc()...

    Citation Envoyé par toufik135 Voir le message
    j'ai créé un nouveau projet pour tester la fonction qui lit le fichier et en effet, il lit mal le fichier :

    Code c : 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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main()
    {
    FILE *file=fopen("stock.txt","r");
    char buff[20];
    int i, id=0, quantity;
    double price;
     
    if(file!=NULL)
    {
    fgets(buff,20,file);
    int nbItems=atoi(buff);
     
    for(i=0;i<nbItems;i++)
    {
     
    char *category=malloc(sizeof(buff));
    fgets(buff,20,file);
    strcpy(category,buff);
     
    char *name=malloc(sizeof(buff));
    fgets(buff,20,file);
    strcpy(name,buff);
     
    fgets(buff,20,file);
    price=atoi(buff);
     
    printf("\n %s %s : %lf ",category,name,price);
     
     
    id++;
     
    }
     
    fgets(buff,20,file);
     
    for(i=0;i<nbItems;i++)
    {
    fgets(buff,20,file);
    id=atoi(buff);
     
    fgets(buff,20,file);
    quantity=atoi(buff);
     
    char *expiDate=malloc(sizeof(buff));
    fgets(buff,20,file);
    strcpy(expiDate,buff);
     
    printf("\n %d %d expire le %s ",id,quantity,expiDate);
     
    }
    }
     
    else
    {
    printf("\n impossible d'ouvrir le fichier stock \n\n");
    }
     
    fclose(file);
    return 0;
    }

    Savez-vous comment utiliser correctement les fgets pour ce cas là?
    Déjà utiliser sizeof() pour un tableau c'est pas terrible. Déjà ça te retourne ici toujours 20 (donc autant utiliser un char[20]) et si tu remplaces ton tableau par un pointeur (ce qui arrive parfois quand on déporte un code dans une fonction), alors ça te renvoie 4 (la taille de l'adresse). Tu connais pas strlen() ???

    Code c : 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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main()
    {
        FILE *file=fopen("stock.txt","r");
        char buff[20];
        int i;
        double *price;
        char **category;
        char **name;
        char *c;
        int nbItems
     
        if(file == NULL)
        {
            printf("\n impossible d'ouvrir le fichier stock \n\n");
            return -1;
        }
     
        fgets(buff,20,file);
        sscanf(buff, "%d", &nbItems);
        price=malloc(nbItems * sizeof(double));
        category=malloc(nbItems * sizeof(char*));
        name=malloc(nbItems * sizeof(char*));
     
        for(i=0;i<nbItems;i++)
        {
            fgets(buff,20,file);   
            if ((c=strrchr(buf, '\n')) != NULL) *c='\0';   // purge du '\n' terminant chaque ligne d'un fichier texte
            category[i]=malloc(strlen(buf) + 1);
            strcpy(category[i], buff);
     
            fgets(buff,20,file);
            if ((c=strrchr(buf, '\n')) != NULL) *c='\0';   // purge du '\n' terminant chaque ligne d'un fichier texte
            category[i]=malloc(strlen(buf) + 1);
            strcpy(name, buff);
     
            fgets(buff,20,file);
            // ici la purge du '\n' terminant chaque ligne d'un fichier texte est inutile vu que le sscanf() va l'ignorer
            sscanf(buff, "%lf", &price[i]);
        }
        fclose(file);
     
        for(i=0;i<nbItems;i++)
        {
            printf("i=%d - name=%s, category=%s, price=%lf\n", i, name[i], category[i], price[i]);
            free(name[i]);
            free(category[i]);
        }
         free(name);
         free(category);
         free(price);
         return 0;
    }
    Bien sûr, j'ai tapé ça vite fait car normalement il te faut tester chaque malloc() mais c'est pour te montrer le principe. Et ce code présume que chaque ligne de ton fichier ne dépassera pas 19 caractères (ce qui est possible mais douteux)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  15. #15
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2012
    Messages : 149
    Points : 112
    Points
    112
    Par défaut
    alors merci pour ces précieuses réponses,

    @kwariz: j'ai pas bien capté ce que tu as dis désolé ( je suis débutant )
    pour le double que j'avais utilisé comme un entier, j'ai corrigé.

    @Sve@r: c'est tout à fait logique ce que tu me dis, j'avais fait un malloc dans la boucle for car j'avais un programme avant où j'ai fais cela et ça a marché mais la apparemment ça ne marche pas donc je ne pense pas effectivement que c'était une bonne idée lol.
    J'ai corrigé donc le code et maintenant il m'affiche la liste mais mélangé avec des données qui manque -> j'ai attaché un screenshot pour que vous voyez ce que ça m'affiche et ce que ça doit m'afficher normalement :
    Nom : pb_affichage.jpg
Affichages : 75
Taille : 275,9 Ko

    Comment utilisé le strrchr() pour ce cas là alors? pour qu'il ne prenne pas le \n
    De ce que j'ai vu sur le net, ça cherche un caractère dans une chaîne

    Pour le code que tu m'as envoyé, yavait quelques fautes de syntax mais même comme ça, lorsque je l'exécute il plante.

    Voilà le code que tu m'as envoyé :
    test_fichier.rar

    Et là c'est le code du projet corrigé:
    Projet_gestion_stock.rar

  16. #16
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2012
    Messages : 149
    Points : 112
    Points
    112
    Par défaut
    @kwariz: je viens de capter ce que tu m'as dis avec le fichier texte lol (désolé mon cerveau surchauffe je crois :p)
    oui c'est bien ça sauf que c'est N fois pour les 2 boucles (on les met pas dans la meme boucle car il y a une ligne vide qui les sépare)
    et N vaut le nombre d'article qui est indiqué à la première ligne du fichier texte

  17. #17
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2012
    Messages : 149
    Points : 112
    Points
    112
    Par défaut
    @Sve@r: je viens de voir que tu as mis comment purger dans la réponse que tu m'as envoyé, je vais regardé ça

  18. #18
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2012
    Messages : 149
    Points : 112
    Points
    112
    Par défaut
    Voila, enfet ça plante pas (pour le code que tu m'as envoyé pour tester la lecture de fichier) mais il m'affiche ça : Nom : affiche_err.jpg
Affichages : 75
Taille : 273,2 Ko ??
    et le code est la : test_fichier.rar

  19. #19
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2012
    Messages : 149
    Points : 112
    Points
    112
    Par défaut Taoufik
    J'ai résolu mon problème, j'ai plus d'erreur.
    Yen avait plusieurs mais c'était en général des problèmes d'allocation mémoire et aussi j'ai recréé le fichier texte sur lekel on lit et remis les données dedans car le fichier provenait d'un mac os et les octets n'était donc pas disposé exactement pareil, ça posait donc problème pour le fgets.




    Merci à tous.

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

Discussions similaires

  1. [XL-2007] VBA le code compile mais ne s'exécute pas
    Par daffy85 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 05/05/2014, 11h41
  2. Réponses: 1
    Dernier message: 16/01/2010, 13h44
  3. pas de problème de compil mais ne marche pas!
    Par yvkoe dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 18/09/2007, 15h20
  4. Réponses: 10
    Dernier message: 18/07/2007, 20h15
  5. Réponses: 2
    Dernier message: 23/09/2003, 15h32

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