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 :

Méthode pour traiter des commandes


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Octobre 2005
    Messages : 141
    Par défaut Méthode pour traiter des commandes
    Bonjour !

    Je réalise un programme et il doit traiter des commandes, il demande à l'utilisateur ce qu'il veut faire, l'utilisateur tape sa commande et le programme la traite (help pour afficher la fonction display_help par exemple).

    J'ai pensé à strcmp mais je voulais savoir s'il y avait d'autres méthodes plus "élégantes" que plusieurs if (strcmp(machin, machin2 == 0)...

    Merci beaucoup.

    Kr00pS

  2. #2
    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 Kr00pS
    J'ai pensé à strcmp mais je voulais savoir s'il y avait d'autres méthodes plus "élégantes" que plusieurs if (strcmp(machin, machin2 == 0)...
    Oui, tu boucles sur un tableau de chaine de caracteres tant que strcmp() ne renvoit pas 0 (et que l'on ne depasse pas les limites du tableau).
    Tu peux aussi faire un tableau de structures qui regroupent le nom de la commande et un pointeur vers la fonction associee a cette commande.

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Octobre 2005
    Messages : 141
    Par défaut
    Merci pour la réponse mais ce sont les trucs que je maîtrise le moins en C (pointeurs de fonctions et tableaux de structures, tableaux de chaînes).

    Encore une méthode pour un simple débutant comme moi ?

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ben la plus simple c'est les IF.
    Je ne crois pas qu'il y ait de méthode "entre les deux".
    Par contre, on peut t'aider pour apprendre le reste.
    Déjà, les pointeurs de fonction:

    La plus grande erreur avec les pointeurs de fonction consiste à ne pas utiliser de typedef, ce qui rend leur déclaration longue et fastidieuse (il n'y a qu'à voir le prototype de la fonction standard signal() : tout simplement horrible).
    Cela peut être facilement corrigé:
    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
    /* Une fonction qui recopie une chaîne de caractères dans un espace plus grand.
     * Peut être utile pour faire un strcat ensuite,
     * mais j'ai choisi cette fonction pour avoir un prototype intéressant
     */
    char *AllocStringAdd(char const *chnOrig, size_t ajout)
    {
    	size_t taille = strlen(chnOrig) + ajout + 1;
    	char *chnRetour = malloc(taille);
    	if(chnRetour != NULL)
    	{
    		/* Recopie la chaine, et le \0 avec */
    		memcpy(chnRetour, chnOrig, taille+1);
    	}
    	return chnRetour;
    }
    Pour utiliser un pointeur capable d'appeler cette fonction, le typedef correspondant est ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef char * (*PT_FONCTION)(char const *, size_t);
    Ici, PT_FONCTION est le type "pointeur de fonction" : C'est un pointeur vers une fonction prenant un char const * et un size_t en paramètre et retournant un char *
    Et à présent, c'est facile à utiliser:
    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
    void UneFonction(int a)
    {
    	PT_FONCTION pFonc = NULL;
    	char *chn = NULL;
     
    	if(a == 0)
    		pFonc = AllocStringAdd;
    	else
    		pFonc = UneAutreFonctionAvecLeMemePrototype;
     
    	/* On utilise la fonction pointee */
    	chn = pFonc("blabla", 8);
    	puts(chn);
    	free(chn);
    }
    Si après ceci tu arrives à utiliser des pointeurs de fonctions, tu devrais réussir à faire marcher le tableau de structures.
    Dans chaque structure, il faut une chaîne et un pointeur de fonction.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Octobre 2005
    Messages : 141
    Par défaut
    Merci bien pour ce petit cours.

    Je vais essayer de faire ça proprement.

    Kr00pS

  6. #6
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Octobre 2005
    Messages : 141
    Par défaut
    Bon, j'ai essayé, mais je ne trouve vraiment pas l'erreur, faut dire que c'est pointu aussi ton truc, des tableaux de structures avec des pointeurs de fonctions dedans, ça fait beaucoup de trucs à assimiler.

    C'est un peu en désoudre car je veux m'assurer que mon programme marche avant de répartir les fonctions et structures dans plusieurs fichiers.

    Beaucoup d'erreurs, pourtant je vois pas pourquoi :
    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
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    /* ---------------------------------------------------------------------
       (c) TE 2006
       Project      : BINDSASSEMBLER
       Function     : A binds creator for Counter-Strike 1.5 .
       Module       : MAIN
       File         : main.c
       Created      : 14-06-2006
       Modified     : 14-06-2006
       --------------------------------------------------------------------- */
     
    /* ---------------------------------------------------------------------
       Log
     
       0.0 -> 14-06-2006 Created.
       --------------------------------------------------------------------- */
     
    #ifdef __cplusplus
    #error This code works only with C, not C++.
    #endif
     
    #include <stdio.h>
    #include <stdlib.h>
    /* Library for neatly data capture. */
    #include "KLIB/datacapture/datacapture.h"
     
    #define DGB 0
     
    typedef struct
    {
        FILE* file;
    } bindsAssembler_s;
     
    typedef struct
    {
        char* commande;
        typedef void (p_command)(void);
    } command_s;
     
    static void init_struct_main(bindsAssembler_s *this)
    {
        const char* fname = "autoexec.cfg";
     
        this->file = fopen(fname, "w+"); 
     
        if (this->file == NULL)
        {
    	ferror(this->file);
    	exit(EXIT_FAILURE);
        }
    }
     
    static void add_binds(void)
    {
        /* ... */
    }
     
    static void display_help(void)
    {
        printf("Help :\n\n"
    	   "Keywords*  : (pistols) usp glock deagle p228 fiveseven beretta\n"
    	   "           : (smg) mp5 tmp p90 mac10 ump\n"
    	   "           : (rifles) ak47 sg552 m4a1 aug\n"
    	   "           : (snipers) awp scout sg1 sg550\n"
    	   "           : (machine gun) m249\n"
    	   "*Warning : Type keywords in small characters only.\n\n");
    }
     
    static void ask_work(bindsAssembler_s *this)
    {
        char data[20];
     
        printf("Welcome to BindsAssembler (first version) !\n");
        printf("What do you want to do (type help for display the help) ? ");
        K_datacapture(data, sizeof data, stdin);
     
        command_s command[2] = 
        {
    	{"help", command[0]->p_command = display_help},
    	{"add binds", command[1]->p_command = add_binds}
        };
     
        /* Call display_help. */
        command[0];
    }
     
     
    static void do_process(void)
    {
        bindsAssembler_s user;
     
        init_struct(&user);
     
        ask_work(&user);
    }
     
    int main (int argc, char** argv)
    {
        do_process();
     
        return 0;
    }
    Erreurs en compilant :
    main.c:38: erreur: syntax error before «typedef»
    main.c:38: attention : pas de point virgule à la fin de la structure ou de l'union
    main.c:39: attention : type defaults to «int» in declaration of «command_s»
    main.c:39: attention : la définition de données n'a pas de type ni de classe de stockage
    main.c: Dans la fonction «ask_work» :
    main.c:63: erreur: syntax error before «command»
    main.c:54: attention : unused parameter «this»
    main.c: Dans la fonction «do_process» :
    main.c:91: attention : implicit declaration of function «init_struct»
    main.c: Dans la fonction «main» :
    main.c:96: attention : unused parameter «argc»
    main.c:96: attention : unused parameter «argv»
    main.c:38: erreur: syntax error before «typedef»
    main.c:38: attention : pas de point virgule à la fin de la structure ou de l'union
    main.c:39: attention : type defaults to «int» in declaration of «command_s»
    main.c:39: attention : la définition de données n'a pas de type ni de classe de stockage
    main.c: Dans la fonction «ask_work» :
    main.c:63: erreur: syntax error before «command»
    main.c:54: attention : unused parameter «this»
    main.c: Dans la fonction «do_process» :
    main.c:91: attention : implicit declaration of function «init_struct»
    main.c: Dans la fonction «main» :
    main.c:96: attention : unused parameter «argc»
    main.c:96: attention : unused parameter «argv»
    PS : il peut y avoir des fautes énormes vu que c'est en Anglais et j'ai un peu de mal avec.

    Merci.

    Kr00pS

  7. #7
    Expert éminent
    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
    Par défaut
    Citation Envoyé par Kr00pS
    Merci pour la réponse mais ce sont les trucs que je maîtrise le moins en C (pointeurs de fonctions et tableaux de structures, tableaux de chaînes).
    Alors c'est le moment de t'y mettre. Commence par t'entraîner avec les pointeurs de fonctions.

  8. #8
    Expert éminent
    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
    Par défaut
    Citation Envoyé par Kr00pS
    Je réalise un programme et il doit traiter des commandes, il demande à l'utilisateur ce qu'il veut faire, l'utilisateur tape sa commande et le programme la traite (help pour afficher la fonction display_help par exemple).

    J'ai pensé à strcmp mais je voulais savoir s'il y avait d'autres méthodes plus "élégantes" que plusieurs if (strcmp(machin, machin2 == 0)...
    http://emmanuel-delahaye.developpez.com/clib.htm
    Module CI (Command Interpretor)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/09/2009, 17h07
  2. Quelle API pour traiter des paramètres d'un programme en ligne de commande ?
    Par Pierre8r dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 19/12/2008, 11h36
  3. Meilleure méthode pour faire des coins arrondis
    Par kodokan dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 17/09/2006, 15h08
  4. Réponses: 4
    Dernier message: 08/06/2005, 23h28
  5. Réponses: 3
    Dernier message: 02/09/2002, 18h49

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