Structures et autres plaisanteries en C
Posté le 14/02/2019 09:22
Nya~, j'aimerais solliciter votre opinion sur un programme en C que je suis en train d'écrire. Plus précisément sur meow structure de donnée…
Donc j'avais dans l'idée de créer une sorte de roman interactif (pour plus d'informations, voir les RDP futures
)
Où l'on à des évènements qui amène donc sur d'autres éléments selon le choix du lecteur. Après réflexion, je me suis dis que ça ressemblait beaucoup à un graphe avec des noeuds et des arcs.
Donc pour l'implantation, comme j'ai plusieurs histoires, j'ai créé une structure qui contient des métadonnées de l'histoire (titre, description…), et un pointeur sur le premier événement.
struct Histoire {
//quelques données;
struct Evenement *premier_evenement;
};
Puis j'ai créé une structure Evenement, mais comme je ne connais pas le nombre d'événements enfants à l'avance (mais je le connais à la compilation), j'ai créé une structure Enfants qui contient le nombre d'enfants et un pointeur sur un tableau de pointeurs d'Evenement (ou une liste chaîné si j'ai pas le droit… J'en suis qu'au test pour l'instant)
struct Evenement{
//quelques données ;
struct Enfants enfants;
};
struct Enfants{
int nombre_enfants;
struct Evenement *(*evenements_enfants)[];
//ou un struct Chaine_enfant *chaine_enfant;
};
Ainsi j'aurais juste besoin d'un pointeurs sur l'événement actuelle pour me déplacer dans l'histoire.
Et techniquement ça devrais marcher, sauf que c'est "légèrement" complexe (mais suffisamment souple pour tout mes caprices futures), je voulais savoir si vous aviez une idée pour une implémentation différente…
Citer : Posté le 14/02/2019 09:42 | #
Salut, pourquoi ne pas simplement faire :
//quelques données
int nb_enfants;
struct Evenement **enfants;
};
Citer : Posté le 14/02/2019 09:54 | #
Parceque d'après ma compréhension du C, struct Evenement **enfants; créé un pointeur vers un pointeur d'Evenement, donc je ne peux pas avoir plusieurs Événements ainsi…
Citer : Posté le 14/02/2019 10:15 | #
Sachant qu'avec char *c on peut faire un tableau de char, alors avec un struct Evenement **e on peut faire un tableau de pointeurs de struct Evenement. Après pour mon précédent poste, c'était plus pour questionner l'utilité de struct Enfants.
Citer : Posté le 14/02/2019 13:56 | #
C'est qu'en fait, j'ai oublié un détails, je veux nommées mes arcs, donc il y a une structure supplémentaires
struct Evenement{
//quelques données ;
struct Enfants enfants;
};
struct Enfants{
int nombre_enfants;
struct Named_Arc *(*nammed_arcs)[];
};
struct Named_Arc{
char name[10];
struct Evenement *evenements;
};
Citer : Posté le 14/02/2019 17:22 | #
Oui, Oui, OUI. <3
C'est même un DAG, sauf si tu as des boucles temporelles dans ton histoire.
Ta structure est typiquement un graphe par liste d'adjacence : dans chaque noeud on a la liste des voisins.
Tu as aussi la matrice d'adjacence : il y a autant de lignes et de colonnes que d'événements, et chaque case indique si on peut passer de l'événement qui est sa ligne à celui qui est sa colonne.
Sinon, comme tu es sur ordinateur, tu peux aussi travailler avec le graphe complet comme développeur... et ensuite générer quelque chose de plus compact et plus puissant (comme un tableau d'événements, et chaque pointeur vers un événement est remplacé par sa position dans le tableau) avant de compiler.
Tu peux aussi donner un nom à tous les événements, représenter les destinations des arcs par le nom de l'événement en sortie, et utiliser un radix tree pour retrouver très rapidement les événements par leur nom.
Ou alors, une variante sur la précédente consisterait à trier les événements par nom avant de compiler, et ensuite faire une recherche binaire pour trouver les événements.
Mais tu peux également... (j'arrête )
Citer : Posté le 15/02/2019 08:10 | #
Nop, j'ai pas de boucle temporel
Pour l'instant le graphe par liste adjacent est ce qui me convient le mieux, parce que j'ai dans les 50 événement, mais ils ne pointent au plus que vers 3 ou 4 événement, donc une matrice 50 par 50 pour mettre seulement quelques 1 dedans (ou quelque chaîne de caractères), ça me semble un peu de lourd…
Pour les autres options, je verrai
Merci Senpai ♥