Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.

Forum Casio - Autres questions


Index du Forum » Autres questions » Structures et autres plaisanteries en C
Hackcell Hors ligne Membre Points: 1413 Défis: 11 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…


Ityt Hors ligne Membre Points: 216 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
Hackcell Hors ligne Membre Points: 1413 Défis: 11 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…
Ityt Hors ligne Membre Points: 216 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
Hackcell Hors ligne Membre Points: 1413 Défis: 11 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;
};

Lephenixnoir Hors ligne Administrateur Points: 21010 Défis: 143 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 )
Hackcell Hors ligne Membre Points: 1413 Défis: 11 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 ♥

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2021 | Il y a 77 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