cerhu > comp.lang.* > comp.lang.c

Michel (24/12/2003, 21h48)
Bonjour,

Personne ne sait me répondre pour mon problème d'exception avec bsearch
2 posts en dessous?
J'ai vérifié et revérifié que les paramètres que je transmet à
VerifierChampsPub soient valides. Alors je pense que c'est la fonction
ComparerChaine qui génère cette exception.
Michel
Pascal (25/12/2003, 19h07)
Michel wrote:

> Bonjour,
> Personne ne sait me répondre pour mon problème d'exception avec bsearch
> 2 posts en dessous?
> J'ai vérifié et revérifié que les paramètres que je transmet à
> VerifierChampsPub soient valides. Alors je pense que c'est la fonction
> ComparerChaine qui génère cette exception.
> Michel


Euh si tu pouvais être plus explicite sur ton erreur. T'as essayé de
debuggé ton truc sous gdb?
Michel (25/12/2003, 22h56)
Pascal a écrit :

> Euh si tu pouvais être plus explicite sur ton erreur.


J'obtiens le message d'erreur suivant en mode pas à pas lorsque j'arrive
à la ligne de bsearch :
"Unhandled exception in TraitementFichierFichierPub.exe : 0xC0000005:
Acces violation".

>T'as essayé de
> debuggé ton truc sous gdb?


Je suis sous VC++.
Mais à partir de l'erreur, VC++ part dans le code assembleur et je ne
connais pas l'assembleur. Donc je ne sais pas avec certitude où se
produit l'erreur. C'est dans bsearch, ça c'est sûr, mais ça peut aussi
être dans la fonction de comparaison 'ComparerChaine' qui est appelée
par bsearch
Michel
Pascal (26/12/2003, 02h04)
Michel wrote:
> J'obtiens le message d'erreur suivant en mode pas à pas lorsque j'arrive
> à la ligne de bsearch :
> "Unhandled exception in TraitementFichierFichierPub.exe : 0xC0000005:
> Acces violation".


arf windows...

> Je suis sous VC++.
> Mais à partir de l'erreur, VC++ part dans le code assembleur et je ne
> connais pas l'assembleur. Donc je ne sais pas avec certitude où se
> produit l'erreur. C'est dans bsearch, ça c'est sûr, mais ça peut aussi
> être dans la fonction de comparaison 'ComparerChaine' qui est appelée
> par bsearch


Je ne connais pas vc++, mais le debuggueur doit etre plus performant que
ce que tu crois : essaye d'afficher les valeurs de tes iterateurs par
exemple pour savoir ce que se passe pas a pas.
Dominique Baldo (26/12/2003, 16h14)
Michel <noSpam> nous disait
> C'est dans bsearch, ça c'est sûr, mais ça peut aussi
> être dans la fonction de comparaison 'ComparerChaine' qui est appelée
> par bsearch


colle un point d'arrêt dans ta fonction ComparerChaine, fait une exec
pas à pas et vérifie le contenu de tes pointeurs .
Ma doc de bsearch n'est pas très claire sur un point: je ne sais pas
s'il faut que le tableau soit préalablement trié ou pas.
après test, il semblerait qu'il faille que cela soit le cas

ci-joint 2 exemples qui fonctionnent (mais qui ne servent à rien en
pratique). compilé avec lcc-win32, executé en ligne de commande sous XP.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int compare1(void *t1,void *t2)
{
return strcmp((char*)t1,(char *)t2);
}

int compare2(void *t1,void *t2)
{
char *s1,*s2;
s1=*(char**)t1;
s2=*(char**)t2;
return strcmp(s1,s2);
}

/* on prend le premier argument de la ligne de commande
et on le cherche dans liste1 puis dans liste2 */

int main(int argc,char **argv)
{
// les 5 premiers mois de l'année, trié.
char liste1[5][20]={"avril","février","janvier","mai","mars"};
char *liste2[5]={"avril","février","janvier","mai","mars"};

char *result1,**result2;
char *key;

if (1>=argc)
return -1;

key=argv[1];

// première recherche
result1=bsearch(key,liste1[0],5,20,compare1);
if (result1)
printf("1 trouve %s\n",result1);
else printf("1 trouve pas\n");

// seconde recherche, logiquement donne
// le meme resultat que la premiere
result2=bsearch(&key,liste2,5,sizeof(char*),compar e2);
if (result2)
printf("2 trouve %s\n",*result2);
else printf("2 trouve pas\n");

return 0;
}
Michel (26/12/2003, 17h33)
Dominique Baldo a écrit :

> colle un point d'arrêt dans ta fonction ComparerChaine, fait une exec
> pas à pas et vérifie le contenu de tes pointeurs .
> Ma doc de bsearch n'est pas très claire sur un point: je ne sais pas
> s'il faut que le tableau soit préalablement trié ou pas.


Oui, il faut que le tableau soit préalablement trié dans l'ordre croissant.

En fait, je viens de résoudre le problème d'exception en allouant
dynamiquement de la mémoire pour stocker la chaine couple_de_lettres et
non plus en la copiant dans une variable locale de type tableau de char.
Ce qui donne le code ci dessous :

#include <stdio.h>
#include <stdlib.h>
#include <search.h>
#include <string.h>
#include <ctype.h>
#include "entete.h"
#include "definition.h"

#define NOM_MODULE "VerifierChampsPub.c"

Booleen VerifierChampsPub(char *pCaractereTrouve, InfosFichier
*pInfosFichierIni_t) {

char *pCoupleLettres = NULL;
Booleen idPub = FAUX;

/* allocation mémoire pour stocker le couple de lettre à comparer */
if((pCoupleLettres = malloc(sizeof(char) * LONGUEUR_COUPLE_LETTRES))
== NULL) {
TraiterErreur(NOM_MODULE, __LINE__ - 1, "\202chec d'allocation
m\202moire par \"malloc\".");
}

if(isdigit(*(pCaractereTrouve + 1)) &&
isdigit(*(pCaractereTrouve + 2)) &&
isalpha(*(pCaractereTrouve + 3)) &&
isalpha(*(pCaractereTrouve + 4)) &&
isdigit(*(pCaractereTrouve + 5)) &&
isdigit(*(pCaractereTrouve + 6))) {

/* copie du couple de lettre dans la zone mémoire allouée
dunamiquement*/
strncpy(pCoupleLettres, pCaractereTrouve + 3,
LONGUEUR_COUPLE_LETTRES);
pCoupleLettres[2] = '\0';

/* recherche du couple de lettres dans le tableau */
if(bsearch(&pCoupleLettres,
pInfosFichierIni_t->pTabIdPub,
pInfosFichierIni_t->nbElement,
sizeof(char*), ComparerChaine) != NULL)
idPub = VRAI;
}

return idPub;
}

Il semblerait donc que je transmettais à bsearch un pointeur sur une
variable locale détruite au moment de l'appel de bsearch ou de la
fonction de comparaison. Cette question fera l'objet d'un post à part
entière.
Merci beaucoup d'avoir cherché!
Michel
Discussions similaires
Personne sait pour mes macros ??????

Personne ne sait ?

Exception avec bsearch

Personne ne sait ??


Fuseau horaire GMT +2. Il est actuellement 12h20. | Privacy Policy