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 :

problème de fifo et de goto


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Par défaut problème de fifo et de goto
    Bonjour,
    j'ai un problème les amis.
    je dois déveloper un code qui permet de lire une commande dans une fifo, va chercher la reponse qui corrspond à cette commande et puis ecrire la réponse dans la fifo.
    voila mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    /* fonction permettant d'extraire un mot dans un fichier texte*/
    string read_line (FILE * f)
    {
    	string s;
    	char c;
     
    	fread(&c, 1, 1, f);
    	while ((c != '\n') && (!feof(f)))
    	{
    		s += c;
    		fread(&c, 1, 1, f);
    	}
     
    	return s;
    }
     
    /* on fonction qui cherche un mot dans une ligne*/
    bool est_present (string & line, string & cmd)
    {
    	return line.find(cmd) != string::npos;
    }
     
    char getChar(string & line, string & cmd)
    {
    	int pos = line.find(cmd);
    	const char * c = line.c_str() + pos + cmd.length();
    	return (c);
    }
    /* fonction qui extrait la réponse*/
    string getData (char * input_file, string & cmd)
    {
    	FILE * finput;
     
    	finput = fopen(input_file, "r");i
    	if (finput == NULL)
    		return -1;
     
    	string line;
    	string output = 0;
     
    	while (!feof(finput))
    	{
    		line = read_line (finput);
    		if (est_present(line, cmd))
    		output += getChar(line, cmd);
    	}
     
    	fclose(finput);
     
    	return output;
    }
     
    /* la fonction d'entrée de mon programme qui fait appel aux autres fonctions*/
    /* my function "entry point" */
     
    test: void Test(vTtyName)
     
    while (1)
    {  
        /*did the fifo already exist? */
     
        test: if ((mkfifo(vTtyName, 0666) < 0) && (errno!= EEXIT))
    	{
    	    printf("the fifo already exists");
    	}
     
        /* Read the Tty */
     
        if (open(vTtyName,O_RDWR | O_NDELAY)!=-1)
    	{ 
    	      if (read(fd,vMsg, strlen(vMsg)) != 0)
    	      { 
    		    string answer = getData(fifo.txt, vMsg);// the answer extracted from the text file
    		    write(vTtyName, &answer, strlen(answer));//write in the fifo
    	      }
     
    	      else vTtyName++ && goto test;
    	}
    }
    alors mes questions sont les suivantes:

    1- une fifo est elle bidirectionnelle??
    2- ce que j'ai nommé " vTtyName est une énumération, est ce que j'ai le droit de faire vTtyName++?
    3- et je ne sais pas si le "goto test" que j'ai mis est just, je ne c'est pas parquoi je peut le remplacer??

    merci d'avance pour votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Il me semble que j'ai déjà vu ce code, mais je ne sais plus si le problème a été résolu .
    Dabord, dans la fonction read_line, s est un string et c est un caractère. Je ne suis pas sûr que l'on puisse écrire s += c;
    Si oui, tout va bien, mais à mon avis, il faut rajouter un 0 terminal avant le return.

    Est-ce que une fifo est bi-directionnelle.
    Vous vous demander si fifo => dernier entré - dernier sorti, ou
    fifo => premier entre dernier sorti, ou je ne sais quoi.
    Fifo implique un sens, un ordre je n'imagine pas qu'il puise être bi-directionnel, en ce cas, que ferait lifo?

    Si vTtyName est une variable, OUI, sinon NON.
    Cette valeur est un paramètre de la fonction open(), donc, c'est un char*.
    Je remarque (dans mon bouquin) que la portabilité de cette fonction n'est pas très grande. Il vaut mieux utiliser fopen().
    Si vTtyName contient "abcdefgh" alors après avoir fait ++ cette variable contiendra "bcdefgh". C'est à dire que vous aurez supprimé le 'a'.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	      else vTtyName++ && goto test;
    J'ai un peu de mal à comprendre cette ligne et le compilateur aussi, je suppose.
    l'opérateur && est binaire. Il prend de chaque côté deux conditions à tester.
    Celle de gauche vTtyName++ (post-incrémenté ?) qui sera vrai si on n'a pas atteint la fin de chaine, mais ce n'a aucun sens dans le cas présent.
    Celle de droite est goto test; ce n'est pas une condition, mais un ordre de branchement, qu'il vaut mieux éviter.
    Je ne connais pas la fonction mkfifo().

    Vous savez, le but de la programmation, quelque soit la langage n'est pas d'écrire du code le plus illisible possible.
    D'autre part, les commentaires sont autorisés dans le code.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Par défaut
    D'abord merci pierre pour ta réponse,

    lce que j'ai appelé vTtyName sont des tubes des fifos (ils sont 7 en tout), je les ai declaré en enumération, et je voudrais que mon code lie dans la premiere fifo, chercher le mot qui a lu dans un fichier texte, extraire le la reponse correspondante et l'envoyé ( si la fifo n'est pas bidirectionnelle, il faudra que je crée une autre dans le sens contraire), et aprés je veux incrémenter pour que le code passe à la prochaine fifo ( la fifo numero 2) et refaire le même travail.

    le fichier texte est sous cette forme:
    cmd1 reponse1
    cmd2 reponse2
    cmd3 reponse3

    je ne sais pas si je suis clair?!!

  4. #4
    Invité
    Invité(e)
    Par défaut
    Non, c'est pas vraiment clair.
    Je vais essayer de la reformuler, vous me direz où je me trompe.
    1- on a un fichier texte contenant par ligne un nom de commande et une réponse.
    2- les lignes sont ordonnées mais chaque ligne est indépendante des autres (VRAI ou FAUX)
    3- suivant la commande la réponse sera interprétée de telle ou telle façon, ce qui sous-entent que le nombre de commandes est limité et que on connait la liste de commandes possibles, ce qui provoque l'action correspondante.

    Question : le même couple cmd + réponse doit-il être traité plusieurs fois, par exemple à cause d'une autre commande lue plus loin dans le fichier. Si non, pourquoi vouloir stocker commande + réponse dans une liste?

    Je ne connais pas la fonction MKfifo(). Que fait-elle? Qu'appelez-vous tube de fifos?

    Ca fait beaucoup de questions, commençons par là.

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Ce code est un mélange de C et de C++.

    Concernant le goto, il n'est absolument pas justifié ici.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour jeroman,
    L'expression "mélange de C et de C++" n'a pas de sens. Si c'est du C++, c'est forcément aussi du C.
    Par contre, effectivement se sujet n'est peut-être pas dans le bon forum, mais c'est plutôt le boulot des modérateurs.
    Naturellement le goto n'est pas justifié ici, mais pourquoi ne pas indiquer aussi les autres fautes de logique?

  7. #7
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    Bonjour jeroman,
    L'expression "mélange de C et de C++" n'a pas de sens. Si c'est du C++, c'est forcément aussi du C....
    Tu voulais sans doute dire l'inverse : "Si c'est du C, c'est forcément aussi du C++".

    En tout cas, les deux propositions sont fausses : Les incompatibilités entre le C et le C++

  8. #8
    Invité
    Invité(e)
    Par défaut
    Oui, pardon pour mon inversion, mais je constate que vous avez compris.
    En fait j'ai vraiment l'impression qu'il y a un problème de langage. Je ne parle pas de langage informatique, mais de langage français.
    Il est vrai que le C++ a corrigé certaines imprécisions du C.
    Mais de là à dire que du code est soit du C soit du C++, ou parler de mélange de C et de C++, ou parler de saupoudrage de C++ dans du C, il y a un monde.
    Je viens de lire dans un autre sujet une longue réponse concernant les tableaux de chaine, et j'ai lu des comparaisons entre tableaux à une dimension et tableaux à deux dimensions. Pas plus en C++ qu'en C, les tableaux multidimensionnels n'existent pas.
    Une chaine de caractères est un tableau ( à une dimension). Une liste de chaines peut être écrite, ou stockées, comme vous voudrez, en tableaux de tableau (expression à éviter m'a-t-on dit), ou tableau à 2 dimensions.
    Fin de remarque.

  9. #9
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    Je viens de lire dans un autre sujet une longue réponse concernant les tableaux de chaine, et j'ai lu des comparaisons entre tableaux à une dimension et tableaux à deux dimensions. Pas plus en C++ qu'en C, les tableaux multidimensionnels n'existent pas.
    Une chaine de caractères est un tableau ( à une dimension). Une liste de chaines peut être écrite, ou stockées, comme vous voudrez, en tableaux de tableau (expression à éviter m'a-t-on dit), ou tableau à 2 dimensions.
    Ces deux paragraphes se contredisent. Tu ecris que les tableaux multidimensionnels n'existent pas, pour parler de tableaux a 2 dimensions deux phrases plus loin.
    Ceci dit, il ne faut pas confondre l'organisation en memoire (ou tous les tableaux sont "plats" quelque soit le nombre de dimensions) et le langage. Les tableaux multi-dimensionnels existent bien en C (voir 6.5.2.1 de ISO/IEC 9899:TC3 ou l'on parle de "multidimensional array object").

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour DaZumba,
    L'expression préférée "tableau à deux dimension" remplace l'expression mal vue "tableau de tableaux".
    Par ailleurs, ça m'intéresserait de lire le détail de
    voir 6.5.2.1 de ISO/IEC 9899:TC3 ou l'on parle de "multidimensional array object"
    Où puis-je le trouver ?
    Merci

  11. #11
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Le draft est ici: http://www.open-std.org/JTC1/sc22/wg...docs/n1256.pdf (la norme du C est payante, mais le draft est aussi bien.)

  12. #12
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par Pierre Dolez
    ...Il est vrai que le C++ a corrigé certaines imprécisions du C...
    À quoi penses-tu en particulier ?

  13. #13
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Autant le dire tout de suite, je n'ai pas lu toutes les interventions, mais:
    1. il est largement préférable d'éviter l'utilisation de goto... Bien souvent, une analyse correcte de ce qui doit être fait permet de s'en passer, et d'éviter la création d'un "code spaghetti".
    2. Le principe même d'un système "FIFO" est... de faire sortir en premier le... premier objet inséré (FIFO: First In, First Out: le premier entré est le premier sorti). Il n'y a donc aucun intérêt à essayer de parcourir ta collection de données autrement que... du premier introduit au dernier introduit.
    3. On ne peut, normalement, pas incrémenter une valeur présentée sous la forme d'une énumération... Il faudrait, normalement, convertir la valeur énumérée en valeur numérique entière, l'incrémenter et, enfin, reconvertir le résultat en valeur énumérée.
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  14. #14
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par koala01 Voir le message
    [On ne peut, normalement, pas incrémenter une valeur présentée sous la forme d'une énumération...
    C'est effectivement, à mon avis, contre l'esprit des types énumérations.
    Il faudrait, normalement, convertir la valeur énumérée en valeur numérique entière, l'incrémenter et, enfin, reconvertir le résultat en valeur énumérée.
    C'est C++ qui interdit la conversion implicite enum <-> entier.

Discussions similaires

  1. Problèmes de FIFO
    Par cycloop dans le forum Linux
    Réponses: 13
    Dernier message: 19/08/2011, 13h58
  2. problème de fifo bloquant sous linux
    Par Fonzy007 dans le forum POSIX
    Réponses: 6
    Dernier message: 20/05/2009, 09h44
  3. Linux - problème avec fifos (communication IPC)
    Par wiliwiliwili dans le forum Linux
    Réponses: 4
    Dernier message: 27/08/2007, 22h18
  4. Problème de Queue FIFO
    Par Armando dans le forum C++
    Réponses: 3
    Dernier message: 05/12/2006, 00h01
  5. Problème avec Goto pour un bouton de menu
    Par Klotian dans le forum Flash
    Réponses: 3
    Dernier message: 26/05/2006, 17h49

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