c0wb0y :d | Bonjour, je suis en train de travailler sur mon projet de C, et je me heurte depuis un moment a un probleme d'analyse syntaxique.
J'expose le contexte : Le programme est une mini base de données. L'utilisateur entre (en console) des commandes de la forme : &3irouge //creation d'un objet dont le 3eme champ vaut "rouge"
&1i1 //creation d'un objet dont le premier champ vaut 1
&3mvert //modifier le dernier objet selectioner, son 3eme champ vaut "vert"
save //savegarde la base
...etc
Je ne parviens pas a recuperer la valeur du champ =/
Je travaille actuellement sous winxp, mais j'utilise le compilateur gcc : ( Rq : le projet est a rendre sous linux, mais comme mon environement linux n'est que peu utilisable, je me force a faire du code standard afin qu'il n'y ai pas de soucis de portage. Si vous voyez des choses non standard qui peuvent poser probleme sous linux, faite m'en part, merci :) )
Citation :
Reading specs from C:/Dev-Cpp/bin/../lib/gcc-lib/mingw32/3.3.1/specs
Configured with: ../gcc/configure --with-gcc --with-gnu-ld --with-gnu-as --host=mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --enable-languages=c,c++,f77,objc,ada,java --disable-win32-registry --disable-shared --enable-sjlj-exceptions --enable-libgcj --disable-java-awt --without-x --enable-java-gc=boehm --disable-libgcj-debug --enable-interpreter --enable-hash-synchronization
Thread model: win32
gcc version 3.3.1 (mingw special 20030804-1)
D:\programmation\mbdd>
|
Le resultat de la compilation :
Citation :
D:\programmation\mbdd>make
gcc.exe -c mbdd.c -o mbdd.o -I"C:/Prgram Files/Dev-Cpp/include" -ansi -traditional-cpp
gcc.exe -c decode.c -o decode.o -I"C:/Prgram Files/Dev-Cpp/include" -ansi -traditional-cpp
gcc.exe mbdd.o decode.o -o "mbdd.exe" -L"C:/Prgram Files/Dev-Cpp/lib"
|
Le code :
Code :
- /*! \file decode.c
- * \brief module permettant de decoder une fonction entrée par l'utilisateur.
- * \author : Ansel Guillaume && Alexandre Aurelie
- * \version : 0.2
- * \bug : ne recupere pas la valeur du critere
- * \date : 11 Nov 2004
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include "type_objet.h"
- #define OK 0 /*!<La commande n'a pas retourné d'erreur*/
- #define ERREUR -1 /*!<La commande n'était pas valide*/
- /*-------------------------------*/
- int decode(char *nom_cde){
- /*! Cette fonction alanyse la commande entrée par l'utilisateur et effectur l'action
- * correspondante si cette commande est valide (si elle correspond a une commande
- * valide du projet)
- *
- * \param nom_cde : chaine de caractere contenant la commande à analyser
- * \retval <int> retourne une constante OK ou ERREUR (type int). OK : 0, ERREUR : -1. Une erreur est
- * retournée si la commande entrée n'est pas valide (non présente dans le projet).
- */
- char *c, *val_critere;
- int num_critere=0;
-
- c =(char *)malloc(sizeof(char) * strlen(nom_cde) +1);
- strcpy(c,nom_cde);
- while(c!='\0'){ /* <== traitement recursif? si oui, pas de boucle */
- if(*c == '&'){ /* On doit traiter une commande de selection/creation/maj */
- c++;
- if(isdigit(*c)){
- num_critere= *c - '0'; /*Le caractere c est le numero d'un critere.*/
- c++;
- switch (*c) {
- /* a implementer : variable / pointeur memorisant la primitive */
- case '<' : printf("primitive S : <\n" ); break;
- case '=' : printf("primitive S : =\n" ); break;
- case '>' : printf("primitive S : >\n" ); break;
- case 'i' : printf( "primitive C : creation\n" ); break;
- case 'm' :printf("primitive MAJ : modification\n" ); break;
- default : printf("primitive non connue (%c)",*c); return ERREUR; break;
- }
- }
- val_critere = (char *)malloc(sizeof(char));
- strncpy(val_critere,c,1);
- c++;
- while(isalpha(*c) || *c != '\0' || !isspace(*c)){
- /* concatener la valeur du critere caractere par caractere dans la variable val_critere */
- if((val_critere = (char *)realloc(val_critere, strlen(val_critere) +1)) == NULL){
- puts("ERREUR lors de l'allocation memoire" );
- return ERREUR;
- }
- strcat(val_critere, c);
- c++;
- }
- printf("val_critere : %s\n", val_critere);
- }else{ /* Si le '&' n'était pas présent en début de ligne */
- if (strncmp(c,"save",4))
- puts("primitive save" );
- if (strncmp(c,"load",4))
- puts("primitive load" );
- if (strncmp(c,"quit",4)){
- puts("exit" );
- return OK;
- }
- }
- /* appeler la fonction deduite (pointeur de fonction?) */
- /* traitement recursif ? */
- }
- }
|
le main :
Code :
- /*!\file mbdd.c
- * \brief module principal du programme, ne contient que la fonction main(). Saisie de la commande et appelle la fonction decode().
- * \author : Ansel Guillaume && Alexandre Aurelie
- * \version : 0.2
- * \bug : unknown
- * \date : 11 Nov 2004
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include "decode.h"
- #include "type_objet.h"
- #define MAX 10
- /*-------------------------------*/
- int main(void){
- /*! Fonction principale du programme, sert a saisir une commande par l'utilisateur
- * et appelle la fonction decode() afin de l'analyser et executer l'action en consequence.
- *
- * \param void
- * \retval <int> : Pour compatibilité C ANSI (valeur de retour constante : 1)
- */
- char cmd[MAX];
- puts("MBDD v0.0" );
- fgets(cmd,MAX+1,stdin);
- if(decode(cmd)==ERREUR)
- puts("impossible d'executer la commande" );
- system("pause" );
- return EXIT_SUCCESS;
- }
|
merci de votre aide :hello: Message édité par c0wb0y le 11-11-2004 à 23:03:33
|