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 :

[C] request for member ". . ." in


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Webmaster
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Points : 5
    Points
    5
    Par défaut [C] request for member ". . ." in
    Bonjour à tous. Je vous expose mon problème : je suis sur un projet en programmation et il me reste une erreur a la compilation, je cherche désespérément depuis quelques temps mais en vain.
    Voici mon code :

    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
    /*fichier.c*/
    struct objet{
       int id;
       int poids;
       int valeur;
       float rapport;
    };
     
    struct table{
       objet *tab;
       int nb_elemt;
    };
     
    static int nb_elemt(table t){
       return t.nb_elemt;
    }
    static
    int compare(const void* a, const void* b){
       struct objet const *pa=a;
       struct objet const *pb=b;
       return pb.rapport - pa.rapport;
    } 
     
    /************************************/
    /*fichier.h*/
    typedef struct objet * objet;
    typedef struct table * table;
    Et voici les erreurs à la compilation, au niveau des return des deux fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fichier.c:11: erreur: request for member «nb_elemt» in something not a structure or union
    fichier.c:17: erreur: request for member «rapport» in something not a structure or union
    Merci pour vos réponses futures.

  2. #2
    Membre régulier Avatar de krieg
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 75
    Points : 92
    Points
    92
    Par défaut
    Salut,
    j'ai modifier ton code en :
    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
    /*fichier.c*/
    struct objet{
      int id;
      int poids;
      int valeur;
      float rapport;
    };
     
    struct table{
      objet *tab;
      int nb_elemt;
    };
     
    static int nb_elemt(table t){
      return t.nb_elemt;
    }
    static
    int compare(const void* a, const void* b){
      struct objet const *pa=(struct objet*)a;
      struct objet const *pb=(struct objet*)b;
      return pb->rapport - pa->rapport;
    }
    tes variables pa et pb sont des pointeurs, pour accéder à leur attributs il faut utiliser ->.
    bye (chez moi sa compile)

  3. #3
    Futur Membre du Club
    Profil pro
    Webmaster
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Merci pour ta réponse rapide, mais une autre question subsiste au niveau de la fonction nb_elemt(table t), pourquoi n'accède-t-il pas au champ ?

    J'ai essayé ta modification ça ne marche toujours pas, d'autant que pour la fonction compare() j'ai l'erreur suivante : déréférencement d'un pointeur de type incomplet pour la ligne au niveau du return.

  4. #4
    Membre régulier Avatar de krieg
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 75
    Points : 92
    Points
    92
    Par défaut
    je n'avait pas vu ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef struct table * table;
    ceci n'est pas une bonne idée met plutot:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef struct table * p_table;

  5. #5
    Futur Membre du Club
    Profil pro
    Webmaster
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Ca aurait pu causer quelques soucis mais après modification du nom j'ai toujours les mêmes erreurs...
    J'ai eu beau modifier les '.' en '->' et vice-versa, rien n'a changé...

  6. #6
    Membre régulier Avatar de krieg
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 75
    Points : 92
    Points
    92
    Par défaut
    je changerai la fonction
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    nb_elemt(struct table t)
    Maintenant si ça ne marche toujours pas pourrai tu passer le reste du code et tes options de compilation car chez moi cela compile.

  7. #7
    Futur Membre du Club
    Profil pro
    Webmaster
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Ca ne marche tjs pas, je vais donc devoir te passer le reste du code.
    En tout cas, merci pour ta patience !!

    L'implémentation :
    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
     
    /*sad.c*/
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
    #include "sad.h"
     
    #define POIDS_MAX 30
     
    static int nb_elemt(table t){
      return t.nb_elemt;
    }
     
    static
    int compare(const void* a, const void* b){
      struct objet const *pa=(struct objet *)a;
      struct objet const *pb=(struct objet *)b;
      return pb->rapport - pa->rapport;
    }
     
    struct objet{
      int id;
      int poids;
      int valeur;
      float rapport;
    };
     
    struct table{
      objet* tab;
      int nb_elemt;
    };
     
    table CreerTable(){
      table t=malloc(sizeof(struct table));
      t->nb_elemt=0;
      return t;
    }
     
    table CreerObjet(int id, int poids, int valeur, table t){
      objet o=malloc(sizeof(struct objet));
      t=realloc(t->tab,sizeof(t->tab)+1);
      assert(o!=NULL);
      o->id=id;
      o->poids=poids;
      o->valeur=valeur;
      o->rapport=valeur/poids;
      t->tab[nb_elemt(t)]=o;
      t->nb_elemt++;
      return t;
    }
     
    void TableTrie(table t){
        qsort(t->tab,t->nb_elemt,sizeof(t->tab),compare);
     
    }
     
    int tableauID(table t){
      int tableauId[t->nb_elemt];
      int poidsReel=0;
      int valeurSac=0;
      for (int i=0 ; i<t->nb_elemt ; i++){
        if(poidsReel+(t->tab[i]->poids)<=POIDS_MAX){
          tableauId[i]=t->tab[i]->id;
          valeurSac+=t->tab[i]->valeur;
          poidsReel+=t->tab[i]->poids;
        }
      }
      return tableauId;
    }
    Et les entêtes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    /*sad.h*/
    #ifndef SAD_H_
    #define SAD_H_
     
    typedef struct objet* objet;
    typedef struct table* table;
     
    table CreerTable();
    table CreerObjet(int, int ,int, table);
    void TableTrie(table);
    int tableauID(table t);
     
    #endif
    Enfin, les options de compilations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -std=c99 -Wall -Werror sad.h sad.c -o test


    (et Krieg est un putain de bon musicos !)

  8. #8
    Membre régulier Avatar de krieg
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 75
    Points : 92
    Points
    92
    Par défaut
    En C, les structure doivent etre defini avant de les utilisées.
    Déplace les en début de fichier (après les includes) tu auras d'autres
    erreurs. (et ajoute bien le struct à la fonction nb_element)

    Je pense qu'il est bon pour toi que je ne te corrige pas ton code comme ça.
    Donc réfléchi aux autres erreurs et reviens nous voir en cas de problème.


    Citation Envoyé par Meri Nose Voir le message
    (et Krieg est un putain de bon musicos !)
    C'est pour quoi ça? (j'ai pas compris).

  9. #9
    Futur Membre du Club
    Profil pro
    Webmaster
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    J'ai donc mis les structures au début (ich bin gros naze parce que d'habitude je les mets toujours au début, c'est la fatigue...) et comme de par hasard ça m'a viré pas mal d'erreurs.
    J'ai également modifié la fonction int tableauID(table t) en int * tableauID(table t) ce qui paraissait évidemment plus logique (et dans le .h aussi).

    Néanmoins il subsiste une dernière erreur qui est en fait un warning :
    attention: cette fonction retourne l'adresse d'une variable locale
    au niveau du return de la fonction tableauID.

    Je cherche, je cherche...

    Encore une fois, merci à toi (vous ?) pour tes (vos) réponses et quelle patience !

    C'est pour quoi ça? (j'ai pas compris).
    Pour Morning Moon de Edward Krieg

  10. #10
    Membre régulier Avatar de krieg
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 75
    Points : 92
    Points
    92
    Par défaut
    Tu crées un tableau de int la:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int tableauId[t->nb_elemt];
    ce tableau n'est valable que dans la fonction.
    voila,

  11. #11
    Futur Membre du Club
    Profil pro
    Webmaster
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Effectivement, j'ai remplacé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int* tableauId=malloc(sizeof(int *)*t->nb_elmt);
    Maintenant à la compilation ça passe mais j'ai une erreur à l'exécution, le magnifique et très attendu Erreur de segmentation (je l'adore).
    D'après mes essais, cela viendrait certainement de la fonction CreerTable() (malgré un gdb qui me dit que ça vient de CreerObjet()).
    Youpla, jcontinue à chercher.
    Et toujours merci !

  12. #12
    Membre régulier Avatar de krieg
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 75
    Points : 92
    Points
    92
    Par défaut
    utilise gdb pour le seg fault

Discussions similaires

  1. Réponses: 6
    Dernier message: 25/02/2013, 16h18
  2. Réponses: 2
    Dernier message: 17/02/2013, 20h59
  3. Réponses: 29
    Dernier message: 23/08/2010, 09h24
  4. request for member
    Par annesophiedecar dans le forum C++
    Réponses: 2
    Dernier message: 11/10/2009, 21h20
  5. Réponses: 14
    Dernier message: 14/09/2007, 17h28

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