[C] probleme pour un reseau de petri

probleme pour un reseau de petri [C] - C - Programmation

Marsh Posté le 17-05-2015 à 17:02:31    

Salut tout le monde je suis débutante en C et je pène à construire un reseau de petri.
 
Je vous explique mon probleme, tout d'abord j'ai un fichier qui contient ceci:
Places 2
P1 1
P2 0
Transitions  
T1
Arcs 2
P1 T1
T1 P2
 
Pour le moment j'arrive à stocker P1 et P2 ainsi que leur nombre de places respectives dans des tableaux liées à Places et 2 la taille du nombre de places.
Les transitions aussi j'arrive à les avoir mais par contre pour les arcs je n'arrive pas à dire à mon programme s'il lit quelque chose qui appartient à Places ou Transitions. Si j'arrive à faire en sorte que mon programme sais s'il a lu P1  ou T1 je voudrais ensuite faire pointer ce P1 vers T1 puis T1 vers P2. Il faudra aussi que je puisse faire un sorte que P1 puisse pointer vers T1 T2 T3 (s'il existent dans le fichier) et vice versa.
Voici mon programme pour le moment :
 
 

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. typedef struct type_places type_places;
  5. typedef struct type_transition type_transition;
  6. /*On commence par définir le type de places tout d'abord. On a donc le nom de la place avec le nombre de jetons qu'il contient puis vers quelle transition il va pointer "succede" et quelle transition va pointer vers cette place "precede" puis on prend en compte aussi le nombre de transitions qui precede la place et la succede. */
  7. struct type_places
  8. {
  9.     char nom_de_la_place[60];
  10.     int nombre_jetons;
  11.     int nombre_succede_p;
  12.     int nombre_precede_p;
  13.     type_transition **succede_p;
  14.     type_transition **precede_p;
  15. };
  16. /* De la meme maniere que le type de places on cree le type transition qui lui va prendre un nom, ce qui lui precede et ce qui lui succede aussi.*/
  17. struct type_transition
  18. {
  19.     char nom[60];
  20.     int nombre_succede_t;
  21.     int nombre_precede_t;
  22.     type_places **succede_t;
  23.     type_places **precede_t;
  24.    
  25. };
  26. /*On definit par la suite une structure qui va nous etre utile pour connaitre: Le nombre de places , leurs noms, le nombre de transitions, leur nom, le nombre d'arc et leur noms. */
  27. typedef struct
  28. {
  29.     char place[60];
  30.     int nombre_places;
  31.    
  32.     char transtions[60];
  33.     int nombre_transitions;
  34.    
  35.     char arcs[60];
  36.     int nbarcs;
  37. } type_taille;
  38. int main(int argc, char *argv[])
  39. {
  40.     /*On commence le main par ouvrir le fichier*/
  41.     FILE *f = fopen("/Users/Neptune/Desktop/TP4/TP4/Testtp4.txt", "r" );
  42.    
  43.     /*S'il y a erreur dans l'ouverture du fichier, cas ou le programme ne reconnait pas le fichier on indique qu'il y a une erreur*/
  44.     if (f == NULL)
  45.     {
  46.         printf("Impossible d'ouvrir le fichier \n" );
  47.         fclose(f);
  48.         return -1;
  49.     }
  50.    
  51.     int i; /*Va nous servir pour l'itaration dans la lecture du fichier*/
  52.    
  53.     type_taille *TABLEAU = malloc(sizeof(type_taille));
  54.    
  55.     /*Maintenant que le fichier on peut l'ouvrir on creer un tableau qui va contenir le nom de la place et le nombre de places dans celui si, tout ceci à l'aide de la commande fscanf qui va lire le nom puis la variable qui suis ce nom dans le fichier.*/
  56.    
  57.     fscanf(f, "%s %d", TABLEAU[1].place, &TABLEAU[1].nombre_places);
  58.    
  59.     /*On prend "TABLEAU[1].place" en faisant un tableau de taille "&TABLEAU[1].nombre_places"*/
  60.    
  61.     type_places *TABLEAU_DES_PLACES = malloc(TABLEAU[1].nombre_places*sizeof(type_places));
  62.    
  63.    
  64.     printf("%s %d\n", TABLEAU[1].place, TABLEAU[1].nombre_places);
  65.    
  66.     /*De maniere iterative on lit toutes les places (leurs noms) suivi du nombre de jetons qu'il contient*/
  67.     for(i = 1; i <= TABLEAU[1].nombre_places; i++)
  68.     {
  69.         fscanf(f, "%s %d", TABLEAU_DES_PLACES[i].nom_de_la_place, &TABLEAU_DES_PLACES[i].nombre_jetons);
  70.         printf("%s %d\n", TABLEAU_DES_PLACES[i].nom_de_la_place, TABLEAU_DES_PLACES[i].nombre_jetons);
  71.         TABLEAU_DES_PLACES[i].nombre_succede_p = 0;
  72.         TABLEAU_DES_PLACES[i].succede_p = NULL;
  73.         TABLEAU_DES_PLACES[i].nombre_precede_p = 0;
  74.         TABLEAU_DES_PLACES[i].precede_p = NULL;
  75.     }
  76.    
  77.     /*Dans notre fichier il vient donc qu'il faut qu'on lise les transitons, alors on effectue la meme chose que pour les places avec une iteration sur une taille de " &TABLEAU[1].nombre_transitions"*/
  78.    
  79.     fscanf(f, "%s %d", TABLEAU[1].transtions, &TABLEAU[1].nombre_transitions);
  80.    
  81.     type_transition *TABLEAU_DES_TRANSITIONS = malloc(TABLEAU[1].nombre_transitions*sizeof(type_transition));
  82.    
  83.     printf("%s %d\n", TABLEAU[1].transtions, TABLEAU[1].nombre_transitions);
  84.    
  85.    
  86.    
  87.     for(i = 1; i <= TABLEAU[1].nombre_transitions; i++)
  88.     {
  89.         fscanf(f, "%s", TABLEAU_DES_TRANSITIONS[i].nom);
  90.         printf("%s\n", TABLEAU_DES_TRANSITIONS[i].nom);
  91.         TABLEAU_DES_TRANSITIONS[i].nombre_succede_t = 0;
  92.         TABLEAU_DES_TRANSITIONS[i].succede_t = NULL;
  93.         TABLEAU_DES_TRANSITIONS[i].nombre_precede_t = 0;
  94.         TABLEAU_DES_TRANSITIONS[i].precede_t = NULL;
  95.     }
  96.    
  97.     /*On obtient le nombre d'arcs qui va delimiter la taille du tableau des arcs de taille "&TABLEAU[1].nbarcs"*/
  98.     fscanf(f, "%s %d", TABLEAU[1].arcs, &TABLEAU[1].nbarcs);
  99.     printf("%s %d\n", TABLEAU[1].arcs, TABLEAU[1].nbarcs);
  100.    
  101.     /*Desormais vient la partie ou il faut relier par les arcs les transtions ainsi que les places a l'aide des tableaux definit plus tot. Pour cela on va d'abord voir si ce qu'on lit est un nom de place ou de transition.*/
  102.    
  103.     int j;
  104.     char str[60];
  105.    
  106.     fscanf(f, "%s %d", str, &j);
  107.    
  108.     fclose(f);
  109. }

Reply

Marsh Posté le 17-05-2015 à 17:02:31   

Reply

Marsh Posté le 18-05-2015 à 16:51:06    

Question bête : pourquoi tu n'utilises pas la représentation matricielle classique de PRE et POST. Ca serait pas plus simple :??:
 
http://homepages.laas.fr/robert/en [...] V17MAC.pdf
 
Pour info, dans mon soft Astres (cf ma signature), j'utilise un réseau de Pétri pour gérer le cycle de vie d'un ticket. Fichier /Astres/Common/WorkflowLibrary.php
 
Et merci de faire un effort sur l'orthographe, pas facile de te comprendre :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed