Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9
  1. #1
    Invité régulier
    Inscrit en
    juin 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : juin 2010
    Messages : 34
    Points : 5
    Points
    5

    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 :
    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 Expert Avatar de Trademark
    Inscrit en
    février 2009
    Messages
    762
    Détails du profil
    Informations forums :
    Inscription : février 2009
    Messages : 762
    Points : 1 205
    Points
    1 205

    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 :
    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
    Invité régulier
    Inscrit en
    juin 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : juin 2010
    Messages : 34
    Points : 5
    Points
    5

    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 Expert Avatar de Trademark
    Inscrit en
    février 2009
    Messages
    762
    Détails du profil
    Informations forums :
    Inscription : février 2009
    Messages : 762
    Points : 1 205
    Points
    1 205

    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 :
    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 Confirmé Sénior
    Homme Profil pro Pierre
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Nom : Homme Pierre
    Localisation : France

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

    Informations forums :
    Inscription : juin 2007
    Messages : 1 958
    Points : 4 124
    Points
    4 124

    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.
    • La plus sotte des questions est celle qu'on ne pose pas.

    Pour faire des graphes, essayez yEd.

  6. #6
    r0d
    r0d est déconnecté
    Expert Confirmé Sénior

    Profil pro
    Inscrit en
    août 2004
    Messages
    4 088
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : août 2004
    Messages : 4 088
    Points : 5 128
    Points
    5 128

    Par défaut

    Citation Envoyé par Trademark Voir le message
    Code :
    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 :
    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.
    };

  7. #7
    Invité régulier
    Inscrit en
    juin 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : juin 2010
    Messages : 34
    Points : 5
    Points
    5

    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
    Modérateur
    Avatar de koala01
    Profil pro Philippe Dunski
    Inscrit en
    octobre 2004
    Messages
    9 688
    Détails du profil
    Informations personnelles :
    Nom : Philippe Dunski
    Âge : 42

    Informations forums :
    Inscription : octobre 2004
    Messages : 9 688
    Points : 15 752
    Points
    15 752

    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
    Invité régulier
    Inscrit en
    juin 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : juin 2010
    Messages : 34
    Points : 5
    Points
    5

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •