probleme d' analyse syntaxique - C - Programmation
Marsh Posté le 11-11-2004 à 15:26:41
changement de la constante MAX dans mbdd.c
#define MAX 255
plus de warning a la compilation :
Citation : D:\programmation\mbdd>make |
Marsh Posté le 11-11-2004 à 16:15:57
problème de parenthèsage
l'opérateur = a une priorité moindre que ==
p = (char *)realloc(val_critere, strlen(val_critere) +1) == NULL)
p vaut donc 0 ou 1
Marsh Posté le 11-11-2004 à 16:30:00
ha, merci, je n'avais pas fait attention :|
J'ai ajouter des parenthèses sur l'expression, ce qui donne :
Code :
|
Le probleme doit venir de mon affectation :
Code :
|
j'ai ajouter un puts avant, et un apres, j'ai le premier qui s'affiche pas mais le suivant =/
Je n'ai jamais utiliser les concaténations en C, je dois mal m'y prendre =/
Marsh Posté le 11-11-2004 à 21:55:17
Y'a des exemples ici : http://www.courtesan.com/todd/papers/strlcpy.html
Marsh Posté le 11-11-2004 à 22:58:44
J'ai lu un peu ce que tu me proposes, mais j'ai un peu de mal a comprendre le tout :/
Mon probleme doit probablement venir de l'utilisation de pointeur.
J'ai ajouté une ligne a mon code, car en fait ma variable val_critere était un pointeur non initialisé, donc de comportement inconnu.
J'ai donc ajouter :
Code :
|
Maintenant, il execute bien la partie de code se trouvant en dessous (il rentre dans le while)
Mais j'ai une erreur sur le realloc.
Citation : MBDD v0.0 |
je met a jour la source du post de tete.
Au fait, je ne sais pas si le lien que tu me suggerais était dans le but de me faire utiliser strlcpy() plutot que strncpy, mais dans tous les cas, c'est impossible, je dois faire du code standard pour qu'il puisse etre compilé sous windows, et sur les machines de l'iut (linux red hat 9). Merci quand meme de ton aide ;) (d'ailleur si tu pouvais expliquer en une ligne ou deux l'interet de strlcpy (si ce n'est la rapidité d'execution qui d'apres le tableau de fin est bien meilleure que les autres), merci :)
Marsh Posté le 11-11-2004 à 23:21:32
Ton val_critere il est trop court après ton premier malloc pour y copier la chaîne c avec le caractère nul, c'est moyen.
strncmp renvoie 0 si les chaînes sont égales, donc ça va pas.
Pour strlcpy, c'est sensé être plus pratique (meilleur comportement et différence dans la valeur de retour), mais dans le document il y a un exemple qui utilise strncpy (exemple 1)b)). Le reste c'est pour la culture générale Les fonctions strl* sont pas encore adoptées sous Linux, elles viennent d'OpenBSD.
Marsh Posté le 11-11-2004 à 23:28:18
Ligne 36:
Code :
|
Tu voulais en fait faire:
Code :
|
et
Code :
|
serait encore plus simple
A+,
Marsh Posté le 11-11-2004 à 23:43:42
blurk a écrit : Ton val_critere il est trop court après ton premier malloc pour y copier la chaîne c avec le caractère nul, c'est moyen. |
Bah en fait, quand j'affecte dans val_critere, je ne veux que le premier caractere, donc je ne compte meme pas le caractere nul normalement =/ (j'veux concatener caractere par caractere jusqu'a ce que je trouve un espace ou le '\0') Par contre, je viens de penser que je devrais l'ajouter moi meme a la fin de caractere nul non ?
pour le strncmp qui renvoie 0, j'ai corrigé (j'ai ajouter un test du resultat dans mon if (si c'est == 0 alors ...)
gilou a écrit : Ligne 36:
serait encore plus simple |
corrigé, merci bien
( par contre, je préfère la 2eme écriture que je trouve plus lisible pour moi ^^" )
Marsh Posté le 12-11-2004 à 20:43:08
yeah yeah !
j'ai reussi a resoudre le probleme
( j'ai revu mes mallocs etc... )
Comme quoi, inutile de forcer dans un code si on a pas les idées claires, du repos permet de prendre du recul et apres, on debug bien mieux
Je vous poste la version actuelle du code (encore des trucs a ajouter pour faire faire a la fonction les choses demandées, mais ca ne devrait pas poser probleme
Code :
|
Marsh Posté le 11-11-2004 à 15:22:13
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 :) )
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 :
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 :
le main :
merci de votre aide :hello:
Message édité par c0wb0y le 11-11-2004 à 23:03:33