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 :

problème définition structure


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 19
    Points : 9
    Points
    9
    Par défaut problème définition structure
    Bonjour a tous ,
    je suis en train de travailler sur un projet d'une gestion d'un stock crée avec une liste chainée.
    le soucie est que lorsque je compile ,des messages d'erreurs s'affichent dans un fichier.h devant contenir les structures de mon projet ITEM,STOCKITEM
    le message d'erreur est "conflicting type for ITEM" merci de bien vouloir m'aiguiller vers la solution.

    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
     
    typedef struct
    {
    	int id;
    	char *name;
    	char *category;
    	float price;
    }ITEM;
     
     
     
    typedef struct
    {
    	ITEM *item;
    	int quantity;
    	char *expirationDate;
    }STOCKITEM;
     
    ITEM *buildItem (int id, char *name, char *category, float price);
    void printItem (ITEM *item);
     
    STOCKITEM *buildStockItem (ITEM *item, int quantity, char *expirationDate);
    void printStockItem (STOCKITEM *stockItem);

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Es-tu sûr qu'il n'y a pas déjà quelque part une définition de ITEM?
    Que se passe-t-il si tu donnes un autre nom à ta structure?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Non du tout la seule déclaration de ITEM et de STOCKITEM sont dans mon fichier data.h et si je change le nom il va m'afficher un message d'erreur pour la variable ITEM *item situer dans ma structure STOCKITEM si je change aussi celle ci il va retourner dans ma structure ou j'ai changé de nom et m'afficher le même problème.

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,
    Tes structures sont des typedef vers des anonymes, ce qui peut poser un problème d'édition des liens.
    N'y a-t-il pas des inclusions multiples de ton fichier .h? Ou invesement, il manque peut-être des includes.

    Essaie avec :
    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
    #ifndef STOCKITEM_H
    #define STOCKITEM_H
     
    typedef struct ITEMtag
    {
    	int id;
    	char *name;
    	char *category;
    	float price;
    } ITEM;
     
    typedef struct STOCKITEMtag
    {
    	ITEM *item;
    	int quantity;
    	char *expirationDate;
    } STOCKITEM;
     
    ITEM *buildItem(int id, char *name, char *category, float price);
    void printItem(ITEM *item);
     
    STOCKITEM *buildStockItem( ITEM *item, int quantity, char *expirationDate);
    void printStockItem(STOCKITEM *stockItem);
    #endif

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Merci je pense que le soucie venais des librairies je ne sais pas comment vous avez fait mais cela marche pourriez vous m'expliquez le #endif svp

  6. #6
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Le #ifndef permet ici d'empêcher d'inclure 2 fois le même fichier.
    La première fois, le fichier est lu et traité. Le #define a défini un symbole correspondant au fichier.
    La seconde fois, le #ifndef détecte que le symbole existe et évite de lire à nouveau les définitions du fichier jusqu'au #endif
    Ainsi le compilateur ne verra qu'une unique définition des données du fichier.
    En vertu du 'one definition rule', le fait de revoir une seconde définition qui serait une erreur est ainsi évité.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    merci a tous pour votre aide en tout cas
    j'ai un autre soucie qui est apparue dans mon main lorsque j'apelle une fonction loadstock qui retourne un stock un message d'erreur apparait en me disant undefined reference to 'loadstock'
    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    // stock.c
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "stock.h"
     
    STOCK *newStock(int nbitem)// fonction mapile voir feuille
    {
        int i;
        STOCK* stock = (STOCK*)malloc(sizeof(STOCK));
        stock->nbitem = nbitem;
        stock->items = malloc(nbitem * sizeof(ITEM*));
        for(i = 0; i < nbitem; i++)
        {
            stock->items[i] = malloc(sizeof(ITEM*));
        }
        stock->size = 0;
        stock->first = malloc(sizeof(STOCKNODE));
        return stock;
    }
     
    char *lecture(FILE *fichier,char *buffer)
    {
        fgets(buffer,256,fichier);
        buffer[strlen(buffer)-1] = '\0';//pour nous débarasser du \n;
        fgets(buffer,256,fichier);//pour sauter une ligne
        return buffer;
    }
     
     
     
    STOCK *loadStock (char *path)
    {
        STOCK *monstock;
        int i=0,id;
        double price;
        int nbitem,quantity;
        FILE *fichier=NULL;
        fichier=fopen("stock.txt","a+");
        char *name=malloc(256*sizeof(char));
        char *category=malloc(256*sizeof(char));
        char *expirationDate=malloc(256*sizeof(char));
        char *chaine=malloc(256*sizeof(char));
        char *buffer=malloc(256*sizeof(char));
        fgets(chaine,256,fichier);
        chaine[strlen(chaine)-1] = '\0';//pour nous débarasser du \n;
        nbitem=atoi(chaine);
        while(i<nbitem)
        {
            category=lecture(fichier,buffer);
            printf("%s",category);
            name =lecture(fichier,buffer);
            printf("%s",name);
            price=atof(lecture(fichier,buffer));
            printf("%f\n",price);
            i++;
            monstock->items[i] = buildItem(i,name,category,price);
        }
        stockNode*currenTNode=monstock->first;
        fgets(buffer,256,fichier);//passe les deux lignes!
        fgets(buffer,256,fichier);
     
        while (!feof(fichier))
        {
     
            id = atoi(lecture(fichier,buffer));  // l'id
            quantity = atoi(lecture(fichier,buffer)); // la quantitée
            expirationDate =(lecture(fichier,buffer)); // la date d'expiration
            printf("%d\n",id);
            printf("%d\n",quantity);
            printf("%s\n",expirationDate);
     
            currentStockNode->item = buildStockItem(stock->items[id], quantity, expirationDate); // on fait pointer le champ item de notre node item vers un stockitem que l'on construit avec les données que l'on a lut ds le fichier
            stock->size ++;
     
            if(!feof(file))  // si on est pas en fin de fichier, on creer un nouveau stocknode vers lequel next pointera  et notre nouveau pointeur de travail deviendra le noeud novellement creer
            {
                currentNode->next = malloc(sizeof(STOCKNODE));
                currentNode = currentNode->next;
            }
            else  // sinon le next du dernier noeud est null;
                currentNode->next = NULL;
     
     
     
     
        }
     
        fclose(file);
        free(cursor);
     
        return stock;
    }


    et dans mon main

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     	int main
     {
           STOCK *stock = loadStock ("stock.txt");
     
     
     
          return 0;
    };

  8. #8
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    La copie du main est incomplète. Si c'est ça ton main(), ça ne compilera certainement pas.

    L'erreur est une erreur du linker :
    • un des fichiers n'a pas été mis dans le projet à compiler
    • ou il manque des includes
    • ou la déclaration de la fonction dans l'include n'est pas le même que la définition de la fonction (tous les types des paramètres doivent être identiques)
    • ou ?

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Pourquoi tu t'embêtes à allouer à chaque fois 256 caractères pour tes name, category, expiration etc ? T'as qu'à définir directement des char[256] dans ta structure !!!

    Ensuite il y a une erreur ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    stock->items = malloc(nbitem * sizeof(ITEM*));
        for(i = 0; i < nbitem; i++)
        { 
            stock->items[i] = malloc(sizeof(ITEM*));     // Si stock->items est un ITEM étoille alors stock->items[i] est un ITEM !!!
        }
    Ensuite on n'utilise pas feof() pour détecter la fin d'un fichier. feof sert juste à indiquer, une fois que le fichier n'est plus lu par les fonctions de lecture, si l'arrêt de la lecture est dû ) une "fin de fichier" ou bien autre chose.
    Il en résulte que faire une boucle sur feof() entraine un traitement de plus que ce qu'il y a d'infos réelles
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (!feof(fp))
    {
         fgets(truc)
         traitement truc
    }
    Si ton fichier contient 3 lignes, feof renverra 3 fois "faux". A la 4° itération feof ne sait pas encore qu'on a tout lu. Il renvoie donc une fois de plus "faux" et tu fais une 4° lecture et un 4° traitement. Mais un traitement de quoi...?

    Une première méthode serait alors de vérifier que la lecture a réussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (!feof(fp))
    {
         if (fgets(truc) != NULL) traitement truc
    }
    Mais dans ce cas, autant mettre directement le test dans le while
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (fgets(truc) != NULL)
    {
         traitement truc
    }
    Et enfin je ne comprends absolument pas du tout cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    char *lecture(FILE *fichier,char *buffer)
    {
        fgets(buffer,256,fichier);
        buffer[strlen(buffer)-1] = '\0';//pour nous débarasser du \n;
        fgets(buffer,256,fichier);//pour sauter une ligne
        return buffer;
    }
    Pourquoi modifier buffer et lui supprimer un '\n' pour ensuite l'écraser avec le second fgets() ??? C'est aussi idiot que d'écrire a=5;a=6. Autant écrire directement a=6 !!!
    sinon ta façon de supprimer le '\n' est bancale. Tu n'es pas certain d'avoir toujours un '\n' à supprimer après fgets(). Si par exemple la ligne est plus grande que le nb de caractères permis, fgets() s'arrête alors et la continue à l'itération suivante.
    Donc remplacer buffer[strlen(buffer)]par '\0' peut t'amener à perdre de l'info utile.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char *lecture(FILE *fichier,char *buffer)
    {
        char *pt;
        fgets(buffer,256,fichier);
        if ((pt=strchr(buffer, '\n') != NULL) *pt='\0'; //pour nous débarrasser (avec deux "r") du \n;
        ...
    Et sinon tu voudrais pas devenir standard et nommer tes types "t_item" plutôt que "ITEM" ???
    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]

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Bonjour
    Merci pour vos conseils en ce qui concerne mon problème de base est que lorsque je met mes fonction loadstock et les structures concernant cette fonction dans mon main celui ci s’exécute mais lorsque je l'ai appelle avec un #include de leur pages respectifs data.h et stock.h ceux ci ne sont pas pris en considération comme si ils n'existaient pas.
    Par rapport aux remarques de sve@r je vais tenter de changés mes standards , la fonction lecture celle ci doit lire une ligne de ma base de donnée retiré le \n et la retourné afin que je puisse directement la mettre dans un name,category ou price en fonction d’où je me situe dans la BSD
    en ce qui concerne ma fonction newstock celle ci doit juste crée mon stock à partir des éléments lue dans ma BSD et je ne voit pas trop l'erreur commise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    stock->items = malloc(nbitem * sizeof(ITEM*));
        for(i = 0; i < nbitem; i++)
        { 
            stock->items[i] = malloc(sizeof(ITEM*));     // Si stock->items est un ITEM étoile alors stock->items[i] est un ITEM !!!
        }
    et pour la fonction !feof c'est une directives du professeur d’utiliser celle ci, je vais mettre en pièces jointes un fichier vous permettant de mieux comprendre ce que je veut faire
    Images attachées Images attachées

  11. #11
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    En ce cas, invite ton professeur à revoir sa position sur feof. Au besoin, montres-lui cette conversation.

    Si tu le fais humblement, il devrait être heureux de ton attention, de ta réflexion, et de corriger son erreur.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  12. #12
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par JEAN-GREGOIRE Voir le message
    et je ne voit pas trop l'erreur commise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    stock->items = malloc(nbitem * sizeof(ITEM*));
        for(i = 0; i < nbitem; i++)
        { 
            stock->items[i] = malloc(sizeof(ITEM*));     // Si stock->items est un ITEM étoile alors stock->items[i] est un ITEM !!!
        }
    ...je vais mettre en pièces jointes un fichier vous permettant de mieux comprendre ce que je veut faire
    Pourtant même cette doc te permettrais, si tu la lisais, de comprendre ton erreur (qui est inscrite en rouge dans mon post précédent)...
    Si stock->items est un "ITEM étoile" alors stock->items[i] ne peut pas lui-aussi être un "ITEM étoile". Donc tu ne peux pas lui allouer une taille de "ITEM étoile" !!!!

    Et concernant feof() t'as le droit de l'utiliser mais faut alors "bien" l'utiliser. Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (fgets(truc), !feof(fp))
    {
         traitement truc
    }
    Ben oui, pour pouvoir détecter la fin il faut d'abord lire. Toi, par exemple, tant que tu n'as pas atteint la dernière page d'un livre puis tourné cette page pour tenter de lire derrière tu ne peux pas savoir que tu es sur la dernière page => pour un ordi c'est pareil.
    Ceci dit, c'est dommage d'utiliser 2 fonctions là où la première suffit. Si tu veux, pour montrer à ton prof, tu crées un fichier contenant
    1
    2
    3
    4
    5
    Puis tu lui montres ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (!feof(fp))
    {
        fgets(buffer, 10, fp);
        printf("traitement: %s", buffer);
    }
    Et vous constaterez tous deux que vous avez deux fois la dernière ligne à l'écran (la 6° lecture n'ayant pas modifié le buffer mais cette 6° lecture n'ayant pas été testée donc le printf() affiché quand-même).

    Ensuite tu lui expliques et tu lui montres cet autre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while (fgets(buffer, 10, fp) != NULL)
        printf("traitement: %s", buffer);
    Et là il comprendra...
    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]

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ensuite tu lui expliques et tu lui montres cet autre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while (fgets(buffer, 10, fp) != NULL)
        printf("traitement: %s", buffer);
    Et là il comprendra...
    Je dirais même un truc du genre:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while(fgets(buffer, 10, fp) != NULL)
        printf("traitement: %s\n", buffer);
     
    if(feof(fp))
        puts("Fin du fichier, traitement terminé avec succès.");
    else
        puts("Erreur en lecture.");
    qui montre à quoi sert réellement feof().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Bonjou
    Mon professeur vous remercie pour cette remarques pertinente,et ma encourager à continue à utiliser ce site .
    quelqu'un aurais une idée du problème des includes qui ne prennent pas en considération les fonctions se situant dans un autre fichier malgré que ceux ci sont situer dans mon projets.il m'affiche undefined reference to "buildstockitem"
    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
    76
    77
    STOCK *loadStock (char *path)
    {
       stockNode*currenTNode;
        STOCK *monstock;
        int i=0,id;
        double price;
        int nbitem,quantity;
        FILE *fichier=NULL;
        fichier=fopen("stock.txt","a+");
        char *name=malloc(256*sizeof(char));
        char *category=malloc(256*sizeof(char));
        char *expirationDate=malloc(256*sizeof(char));
        char *chaine=malloc(256*sizeof(char));
        char *buffer=malloc(256*sizeof(char));
        fgets(chaine,256,fichier);
        chaine[strlen(chaine)-1] = '\0';//pour nous débarasser du \n;
        nbitem=atoi(chaine);
        while(i<nbitem)
        {
            category=lecture(fichier,buffer);
            printf("%s",category);
            name =lecture(fichier,buffer);
            printf("%s",name);
            price=atof(lecture(fichier,buffer));
            printf("%f\n",price);
            i++;
            monstock->items[i] = buildItem(i,name,category,price);
        }
        currenTNode=monstock->first;
        fgets(buffer,256,fichier);//passe les deux lignes!
        fgets(buffer,256,fichier);
    
        while (!feof(fichier))
        {
    
            id = atoi(lecture(fichier,buffer));  // l'id
            quantity = atoi(lecture(fichier,buffer)); // la quantitée
            expirationDate =(lecture(fichier,buffer)); // la date d'expiration
            printf("%d\n",id);
            printf("%d\n",quantity);
            printf("%s\n",expirationDate);
    
            currenTNode->item = buildStockItem(monstock->items[id], quantity, expirationDate); // on fait pointer le champ item de notre node item vers un stockitem que l'on construit avec les données que l'on a lut ds le fichier// ma fonction loadstock utilise une fonction buildstockitem situer dans un fichier data.h malgré que les includes soient bon il ne la lit pas
            monstock->size ++;
    
            if(!feof(fichier))  // si on est pas en fin de fichier, on crée un nouveau stocknode vers lequel next pointera  et notre nouveau pointeur de travail deviendra le noeud novellement creer
            {
               currenTNode->next = malloc(sizeof(stockNode));
               currenTNode = currenTNode->next;
            }
            else  // sinon le next du dernier noeud est null;
                currenTNode->next = NULL;
    
    
    
    
        }
    
        fclose(fichier);
        free(buffer);
    
        return monstock;
    }
    
    
    
    
    
    int main()
    {
    
    
             STOCK *stock =loadStock ("stock.txt");
          
    
        return 0;
    }



    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
    #include <stdio.h>#include <stdlib.h>
    #include <string.h>
    #include "data.h"//mon ficheir data.c
    
    
    ITEM *buildItem(int id, char *category,char *name, float prise);//AJOUTE UN PRODUIT
    {
        Item *a=malloc(sizeof(Item));
        a->id=id;
        a->name=name;
        a->category=category;
        a->prise=prise;
        return a;
    }
    STOCKITEM *buildStockItem(ITEM *item, int quantity, char *expirationDate);//AJOUT UN PRODUIT MAIS SEULEMENT QUANTITE DATE EXIPRATION
    {
        STOCKITEM *a1=malloc(sizeof(STOCKITEM));
        a1->item=item;
        a1->quantity=quantity;
        a1->expirationDate=expirationDate;
        return a1;
    }

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Bonjour,
    1. Je ne connais pas ta fonction "lecture()", mais sans la connaître, je peux voir que ça c'est mauvais:
      Code C mauvais : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
          char *name=malloc(256*sizeof(char));
          char *category=malloc(256*sizeof(char));
          char *expirationDate=malloc(256*sizeof(char));
       
          ...
       
          while(i<nbitem)
          {
              category=lecture(fichier,buffer);
              printf("%s",category);
              name =lecture(fichier,buffer);
      La perte du pointeur retourné par malloc() est une fuite de mémoire, et en plus on se demande pourquoi tu fais des allocations de taille fixe alors que tu fais tes lectures vers un autre buffer.
    2. "Undefined reference" n'est pas une erreur de compilation, mais d'édition de liens.
      Utilises-tu un Environnement de Développement Intégré ou compiles-tu directement en ligne de commande?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    j'utilise codeblocks 13.12

Discussions similaires

  1. Problème de structures
    Par Zikas-r dans le forum C
    Réponses: 6
    Dernier message: 27/12/2006, 00h01
  2. problème définition alias
    Par julien.63 dans le forum Apache
    Réponses: 2
    Dernier message: 26/10/2006, 17h41
  3. Réponses: 16
    Dernier message: 21/08/2006, 14h12
  4. [Structures]Problème sur structures
    Par kendras dans le forum C++
    Réponses: 5
    Dernier message: 07/06/2006, 10h20
  5. [OCaml] Problème de structure/parser
    Par marv1 dans le forum Caml
    Réponses: 4
    Dernier message: 09/05/2005, 12h16

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