IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Projet de Programmation


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 12
    Points : 2
    Points
    2
    Par défaut Projet de Programmation
    Bonjour à tous,

    je travaille sur un projet de programmation pour mes études pour créer un serveur "vocal" (entre guillemets car les messages s'afficheront sur l'écran).

    J'ai donc dû créer des structures de données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    typedef struct
    { char msgLong[100];
      char msgCourt[300];
    }Etat;
     
    typedef struct
    { char M[MAX_ETATS][MAX_ETATS];
      Etat E[MAX_ETATS];
    } Automate;
    L'automate est composé de plusieurs états. Les états sont numérotés de 0 à MAX_ETATS-1 maximum, l'état 0 correspond à l'état d'entrée. Chaque état peut contenir : une chaîne de caractère correspondant à un message court, et/ou un message long enregistré dans un fichier texte.
    On considérera que le message long (s'il existe) est toujours annoncer avant le message court. Les messages courts (sur l'exemple du serveur vocal de la météo) correspondent à l'énoncé des choix possibles de l'état. Les messages longs correspondent par exemple aux prévisions. Le texte des prévisions à annoncer est enregistré dans un fichier texte.

    Le format d'un fichier d'automate est le suivant :
    * la première ligne contient le nombre d'états de l'automate
    * pour chaque état :
    - numéro de l'état
    - nom du fichier du message long s'il existe sinon ligne vide
    - message court sur une ligne
    - suite de lignes contenant les couples touche/état destination à partir de cet état. Cette suite est terminée par le caractère '>' sur une ligne.

    Je crée d'abord une procédure qui me permet de charger un fichier extérieur comportant des données spécifique à un "numéro de téléphone". L'utilisateur devra d'abord taper le numéro, j'ouvre le fichier, lis et stocke au bon endroit les infos.

    Mon souci se trouve au moment où je récupère le message court si le message long n'existe pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    if (nbEtat<=MAX_ETATS)
    	{ while (fscanf(f,"%d",&numeroEtat)!=EOF)
    		{ printf("Le numero de l'etat est : %d \n",numeroEtat);
    /* Lecture de la ligne */
    		car=getc(f);	
    		fgets(message,299,f);
    /* Vérification de la ligne vide */
    		if (message[0]=='\n')
    /* Mémorisation du message court */
    			{ fgets((*aut).E[numeroEtat].msgCourt,299,f);
    			printf("MESSAGE COURT DE L'ETAT %d : %s \n",numeroEtat,(*aut).E[numeroEtat].msgCourt);
    			}
    C'est le dernier "fgets" qui pose problème.

    Mais comment résoudre ce souci ?

    PS : je travaille sous Dev C++ chez moi, mais sur linux au bahut.

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par mystix5987
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /* Mémorisation du message court */
    			{ fgets((*aut).E[numeroEtat].msgCourt,299,f);
    			printf("MESSAGE COURT DE L'ETAT %d : %s \n",numeroEtat,(*aut).E[numeroEtat].msgCourt);
    			}
    C'est le dernier "fgets" qui pose problème.

    Mais comment résoudre ce souci ?

    PS : je travaille sous Dev C++ chez moi, mais sur linux au bahut.
    fgets() attend l'adresse d'un char. C'est quoi ce (aut*) ? Si msgCourt est un simple tableau de char :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       fgets (E[numeroEtat].msgCourt, sizeof E[numeroEtat].msgCourt, f);

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    "aut" représente mon automate comme déclaré dans mes structures de données.

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Salut,

    Afin de nous permettre de t'aider à démasquer l'endroit où se trouve le problème, la meilleure stratégie est toujours de fournir un code compilable minimal permettant de reproduire l'erreur et l'avertissement. Ici, nous ne savons pas où aut est déclaré, si l'espace pour la structure Automate corresponpndante à été alloué, si le fichier f a été ouvert correctement, etc.

    L'utilisation de fgets semble à première vue correcte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fgets((*aut).E[numeroEtat].msgCourt, 299, f);
    même si (*aut).E[numeroEtat].msgCourt peut s'écrire plus simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    aut->E[numeroEtat].msgCourt
    msgCourt est déclaré comme un tableau de caractères d'une longueur de 300 caractères. Pourquoi fgets reçoit-il 299 et pas 300? fgets s'occupe de mettre le caractère nul... Mais ce n'est pas cela qui te cause du soucis.

    Thierry

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    je vous remercie de vos conseils, j'ai fini par découvrir ce qui n'allait pas, mais j'ai du appeler une variable qui ne sert pas à grand chose. Merci tout de même.

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par mystix5987
    "aut" représente mon automate comme déclaré dans mes structures de données.
    Ah, OK, j'ai cru à un infâme cast, je n'avais pas vu le point. Désolaid.

    Utilise plutôt ->, c'est beaucoup plus clair.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    Très bien, je le ferai. Merci beaucoup.

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/01/2009, 18h42
  2. Projet de Programmation 2008 (ISG)
    Par Ghost-Rider dans le forum Visual C++
    Réponses: 2
    Dernier message: 01/12/2008, 21h23
  3. Projet de programme
    Par fallais dans le forum C++
    Réponses: 6
    Dernier message: 15/04/2008, 00h07
  4. Aide pour projet de programmation Lycée
    Par Supervince dans le forum C
    Réponses: 26
    Dernier message: 21/05/2006, 16h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo