Précédent   Forum du club des développeurs et IT Pro > C et C++ > C++ > Débuter
Débuter Forum d'entraide pour débuter en langage de programmation C++. Avant de poster : cours d'initiation au C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 10/12/2012, 20h49   #1
KosenHitatchi
Invité régulier
 
Inscription : juin 2010
Messages : 33
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 33
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
KosenHitatchi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 22h06   #2
Trademark
Membre émérite
 
Avatar de Trademark
 
Inscription : février 2009
Messages : 568
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 568
Points : 818
Points : 818
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
Trademark est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 01h40   #3
KosenHitatchi
Invité régulier
 
Inscription : juin 2010
Messages : 33
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 33
Points : 5
Points : 5
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
KosenHitatchi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 07h03   #4
Trademark
Membre émérite
 
Avatar de Trademark
 
Inscription : février 2009
Messages : 568
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 568
Points : 818
Points : 818
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.
Trademark est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 10h39   #5
leternel
Expert Confirmé
 
Homme Pierre
Ingénieur développement logiciels
Inscription : juin 2007
Messages : 1 360
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 360
Points : 2 876
Points : 2 876
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.
leternel est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 10h50   #6
r0d
Expert Confirmé Sénior
 
Inscription : août 2004
Messages : 3 700
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : août 2004
Messages : 3 700
Points : 4 525
Points : 4 525
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.
};
r0d est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 22h01   #7
KosenHitatchi
Invité régulier
 
Inscription : juin 2010
Messages : 33
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 33
Points : 5
Points : 5
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
KosenHitatchi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2012, 10h57   #8
koala01
Modérateur
 
Avatar de koala01
 
Philippe Dunski
Inscription : octobre 2004
Messages : 8 752
Détails du profil
Informations personnelles :
Nom : Philippe Dunski
Âge : 41

Informations forums :
Inscription : octobre 2004
Messages : 8 752
Points : 13 725
Points : 13 725
Envoyer un message via MSN à koala01 Envoyer un message via Skype™ à koala01
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
je ne répondrai à aucune question technique par E-mail, message visiteur ou message privé
Vous avez obtenu votre réponse pensez au bouton en bas de page
koala01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 15h01   #9
KosenHitatchi
Invité régulier
 
Inscription : juin 2010
Messages : 33
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 33
Points : 5
Points : 5
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
KosenHitatchi est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 17h06.


 
 
 
 
Partenaires

Hébergement Web