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 :

Petit probleme lors de la declaration de structure (pointeurs)


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 34
    Points : 20
    Points
    20
    Par défaut Petit probleme lors de la declaration de structure (pointeurs)
    Bonsoir a tous,
    je galère un peu a comprendre comment resoudre ce probleme.
    J'ai un souci lors de ma declaration de structure.
    L'idee d'algo est la suivante, ma première structure(etat d'un graphe) pointe vers une seconde(tableaux de transition) qui pointe vers un troisième(maillonTransition). Jusque la pas de problème.
    Par contre j'ai besoin que la troisième structure pointe vers un objet du type de la premiere, dans mon cas le maillon doit pointer vers un etat suivant du graphe.

    Lors de la compilation il m'est dit que l'un des type utilisé n'est pas définis, logique, par contre du fait de cet appel dans la troisième structure sa plante.

    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
    typedef struct etat{
        int info ;
        *structTransition transition;
    }
     
    typedef struct structTransition{
        maillonTransition* tabTransition[];
    }
     
    typedef struct maillonTransition{
        *etat etatFinal;
        int valeurTransition;
    }
    Pourriez vous m'aider a resoudre ce probleme.

    Merci

  2. #2
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Salut,

    Sans parler de ta structure de données bancale, tu peux facilement résoudre ton problème avec les forward declaration :

    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
    // Forward declaration.
    struct B;
     
    struct A
    {
      B* b;
    };
     
    struct B
    {
      A* a;
    };
     
    int main(int argc, char** argv)
    {
    }
    Tu fais pareil pour ton code

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 34
    Points : 20
    Points
    20
    Par défaut
    Merci je vais tester cella.
    Je ne savais pas qu'il était possible de déclarer une structure sans son contenus
    Tu me dit que mon choix de structure de données est bancale, peux tu m'expliquer pourquoi.
    Je cherche a stocker un graphe. Apres une petite réflexion j'ai rapidement écarté les matrice (adjacence et incidence) car trop gourmande en mémoire.
    Quel est la meilleur structure a choisir dans ce cas.

    Cordiallement

  4. #4
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Salut,

    Je disais qu'elle était un peu bancal simplement parce qu'il y a une indirection inutile, à savoir struct transition.

    J'aurais fait comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef struct graph_type
    {
      node_type starting_node; // Noeud de départ
     // Noeud de fin si besoin, …
    };
     
    typedef struct node_type
    {
       data_type *data; // Donnée de type data_type.
       node_type* adjacent_node; // Tableau dynamique de noeud adjacents.
    };
    Après ici, tu es dans la section C++, j'ai continué dans le même style de programmation que toi, c'est à dire plutôt du C. En ayant accès à la STL, ca change du tout au tout.

    Bonne chance.

  5. #5
    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
    Citation Envoyé par KosenHitatchi
    Je ne savais pas qu'il était possible de déclarer une structure sans son contenu
    Justement, struct structure; est une déclaration de type, souvent appelée déclaration anticipée, (ou forward declaration) parce qu'elle ne suffit pas à définir un type.
    Cette déclaration définit un type incomplet, utilisable uniquement pour déclarer des pointeurs et références.

    struct structure {int value}; est au contraire une définition de type.

    Tenant compte de la Règle de la Définition Unique, tu vois qu'il ne peut y avoir qu'une seule définition de type, mais autant de déclaration que voulu.
    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

  6. #6
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Trademark Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef struct graph_type
    {
      node_type starting_node; // Noeud de départ
     // Noeud de fin si besoin, …
    };
     
    typedef struct node_type
    {
       data_type *data; // Donnée de type data_type.
       node_type* adjacent_node; // Tableau dynamique de noeud adjacents.
    };
    Que l'on peut simplement écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct graph_type
    {
      node_type starting_node; // Noeud de départ
     // Noeud de fin si besoin, …
    };
     
    struct node_type
    {
       data_type *data; // Donnée de type data_type.
       node_type* adjacent_node; // Tableau dynamique de noeud adjacents.
    };
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 34
    Points : 20
    Points
    20
    Par défaut
    Désole pour la réponse en retard.
    Je vais tester tout cella. Etant un nouveau en c++, je penses mettre de côté la partie STL pour l'instant.

    Merci

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par KosenHitatchi Voir le message
    Désole pour la réponse en retard.
    Je vais tester tout cella. Etant un nouveau en c++, je penses mettre de côté la partie STL pour l'instant.

    Merci
    Tu aurais bien tord...

    La STL est "la bibliothèque fournie par le standard", qui te fournit un tas de choses qui te permettent de coder "facilement" et de manière sécurisante.

    Parmi ces choses, on trouve entre autre:
    1. des chaines de caractères
    2. des flux de conversion (de chaine de caractères vers et de "n'importe quoi")
    3. des flux vers des fichiers
    4. des collections "de tous types" (allant du tableau à la multi map, en passant par les piles file, liste, etc)
    5. une série d'algorithmes d'utilisation courante
    6. ...
    Le résultat de tout cela, c'est que tu ne devrais pour ainsi dire plus avoir besoin de l'allocation dynamique (des pointeurs, de new et de delete) avant de commencer à t'intéresser au polymorphisme.

    De cette manière, quand tu commenceras à en avoir besoin, tu ne seras en tout cas plus embêté par les principes "simples" qui sont plus ou moins communs à tous les langages impératifs
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 34
    Points : 20
    Points
    20
    Par défaut
    Réponse un peut tardive.
    Merci beaucoup,grace au forward déclaration j'ai réussi a résoudre mon problème.
    Je passe le post en résolus

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 16/11/2009, 01h02
  2. [debutant]petit probleme lors de la creation du VG (LVM)
    Par pierrot10 dans le forum Administration système
    Réponses: 0
    Dernier message: 06/08/2009, 13h31
  3. petit probleme de structure je pense
    Par masterix59 dans le forum C
    Réponses: 5
    Dernier message: 17/12/2007, 16h06
  4. Petit probleme avec les Border lors d'une sauvegarde
    Par Mike888 dans le forum Interfaces Graphiques en Java
    Réponses: 7
    Dernier message: 06/06/2006, 09h33
  5. Réponses: 6
    Dernier message: 29/04/2006, 20h37

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