Forum Casio - Autres questions


Index du Forum » Autres questions » Structures et autres plaisanteries en C
HackcellEn ligneMembrePoints: 944 Défis: 6 Message

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…


ItytHors ligneMembrePoints: 200 Défis: 0 Message

Citer : Posté le 14/02/2019 09:42 | #


Salut, pourquoi ne pas simplement faire :
struct Evenement {
  //quelques données
  int nb_enfants;
  struct Evenement **enfants;
};

salut je m'appelle sacha et je viens du bourg-palette et voici mon meilleur ami pikachu
HackcellEn ligneMembrePoints: 944 Défis: 6 Message

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…
I usually spend meow time cosplaying as a diligent student...
So it can get pretty stressful.
That's exactly why PC is such a happy place for meow to be ⭐
ItytHors ligneMembrePoints: 200 Défis: 0 Message

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.
salut je m'appelle sacha et je viens du bourg-palette et voici mon meilleur ami pikachu
HackcellEn ligneMembrePoints: 944 Défis: 6 Message

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;
};


I usually spend meow time cosplaying as a diligent student...
So it can get pretty stressful.
That's exactly why PC is such a happy place for meow to be ⭐
LephenixnoirEn ligneAdministrateurPoints: 13834 Défis: 136 Message

Citer : Posté le 14/02/2019 17:22 | #


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.

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 )
Rise.
HackcellEn ligneMembrePoints: 944 Défis: 6 Message

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 ♥
I usually spend meow time cosplaying as a diligent student...
So it can get pretty stressful.
That's exactly why PC is such a happy place for meow to be ⭐

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2019 | Il y a 36 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd