Help sur ma fonction!!!

benthebest Messages postés 42 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 1 août 2008 - 5 juin 2005 à 05:33
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 - 5 juin 2005 à 18:43
hello a tous

Voila je taffe depuis plus d'une semaine sur ma fonction et je vais m'arracher la tete...

Elle marche sous Visual C++ et pas sur Dev c++ et je dois absolument la faire marcher sous Dev c++..

Je vous explique brievement, c'une fonction qui sert a recuperer dans un tableau remplit dynamiquement plusieurs mots à partir d'un arbre binaire (ces mots constituent des suffixes, par exemple , si dans mon fichier jai le mot "allo" et que l'utilisateur tape "a" , et bien ma fonction est sense remplir mon tableau avec le suffixe "llo" !).

voici ma fonction :

void rech_suffixes(noeud* n,char*** tab_suffixe, char *mot,int i,int j, int k, int l,int m)//parcours ordre prefixe pr trouver la completion, a partir dun noeud determine
{
char** t=NULL,** temp=NULL;



if(n!=NULL)
{
if(n->index_autre_mot!=-1) //si il existe un marqueur sur ce noeud, donc je le recupere et mot continuera a partir de cet indice
{
i=n->index_autre_mot;
//je reinitilise a 0 la suite de mot
memset ( mot+i, 0, 30-i );
}
if(n->frere!=NULL && n->frere->index_autre_mot==-1)
{
//n->c;
//je marque le frere de lindice de mot[] ou je
//devrai reprendre pr continuer la completion
n->frere->index_autre_mot=i;
}


if(isalpha(n->c) || n->c =='\0')
{
mot[i]=n->c;
i++;
}

//si j'arrive a une fin de caractere ET qu'il y a bien un VRAI suffixe de trouvé
//(et pas seulement un '\0' pour suffixe):
//if((n->c=='\0')&&(i!=1))
if(n->c=='\0')
{


//Procedure d'allocation dynamique:


//si t est completement vide:
if ((j==0) && (*tab_suffixe==NULL))
{
//j'en alloue un de plus pr ke le dernier puisse etre initialiser a NULL
/****QD JE MET ICI UN SYSTEM("pause"); CA PLANTE ET JE C VRT PAS PKOI!!****/
if((temp=(char**)malloc(2*sizeof(char*)))==NULL) printf("Erreur 1");
}
else
{
t=*tab_suffixe;

//je trouve le dernier indice libre pr enregistrer ce suffixe ds tab
while(t[j]!=NULL)
{
j++;
}


if((temp=(char**)malloc((j+2) * sizeof(char*)))==NULL) printf("Erreur 2");
for(k=0;k<j;k++)
temp[k]=t[k];


t=NULL;

}


//jalloue une nvelle ligne pour tab afin dy mettre le nouveau suffixe:
if((temp[j]=(char*)malloc(i * sizeof(char)))==NULL) printf("Erreur 4");

//je copie
strcpy(temp[j],mot);

//je met null pr la prochaine ligne
temp[j+1]=NULL;


//le triple pointeur tab_suffixe pointe sur t et t sur NULL:
*tab_suffixe=temp;
temp=NULL;


/* for(l=0;l<(j+1);l++)
{ printf(" *tab_suffixe[%d] = %s ",l,*tab_suffixe[l]);}*/


}


rech_suffixes(n->fils_gauche, tab_suffixe, mot, i, j, k, l, m);
rech_suffixes(n->frere, tab_suffixe, mot, i, j, k, l, m);
}
}

Voila si vous pouvier me trouver mon bug , je vous en serai sincermeent reocnnaissant...

Merci a vous.

5 réponses

Pamaury Messages postés 341 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 17 juin 2008 3
5 juin 2005 à 09:35
Pour nous aider faudrait:

->à quoi correspond 'n','i','j','k','l','m'

->comment est rangé 'tab_suffix'

->la structure 'noeud'

parce que là on, comprend rien avec des i,j,k,l,m qui me paraisse bien suspect avec des noms pareils !!

A m a u r y
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
5 juin 2005 à 10:03
En C++, ca serait plus lisible ton code :) Pour éviter les plantages, utilises les string et non des char*.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
5 juin 2005 à 10:53
Intéressant comme conseil, en poussant un peu il pourrait même le faire en VB, non ?

ciao...
BruNews, MVP VC++
0
benthebest Messages postés 42 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 1 août 2008
5 juin 2005 à 15:23
Desole c vrai ke ils servent a rien c variable i,j,k,m

voici la bonne fonction :

void rech_suffixes(noeud* n,char*** tab_suffixe, char *mot,int i,int j, int k)//parcours ordre prefixe pr trouver la completion, a partir dun noeud determine
{
char** t=NULL,** temp=NULL;



if(n!=NULL)
{
if(n->index_autre_mot!=-1) //si il existe un marqueur sur ce noeud, donc je le recupere et mot continuera a partir de cet indice
{
i=n->index_autre_mot;
//je reinitilise a 0 la suite de mot
memset ( mot+i, 0, 30-i );
}
if(n->frere!=NULL && n->frere->index_autre_mot==-1)
{
//n->c;
//je marque le frere de lindice de mot[] ou je
//devrai reprendre pr continuer la completion
n->frere->index_autre_mot=i;
}


if(isalpha(n->c) || n->c =='\0')
{
mot[i]=n->c;
i++;
}

//si j'arrive a une fin de caractere ET qu'il y a bien un VRAI suffixe de trouvé
//(et pas seulement un '\0' pour suffixe):
if(n->c=='\0')
{


//Procedure d'allocation dynamique:


//si t est completement vide:
if ((j==0) && (*tab_suffixe==NULL))
{
/*************************************************************************/
/******CA BUG ICI QD ON FAIT UN system("pause"); et je c vrt pas pkoi!!! *******/
/****************************************************************************/


//j'en alloue un de plus pr ke le dernier puisse etre initialiser a NULL
if((temp=(char**)malloc(2*sizeof(char*)))==NULL) printf("Erreur 1");

}
else
{
t=*tab_suffixe;

//je trouve le dernier indice libre pr enregistrer ce suffixe ds tab
while(t[j]!=NULL)
{
j++;
}


if((temp=(char**)malloc((j+2) * sizeof(char*)))==NULL) printf("Erreur 2");
for(k=0;k<j;k++)
temp[k]=t[k];


t=NULL;

}


//jalloue une nvelle ligne pour tab afin dy mettre le nouveau suffixe:
if((temp[j]=(char*)malloc(i * sizeof(char)))==NULL) printf("Erreur 4");

//je copie
strcpy(temp[j],mot);

//je met null pr la prochaine ligne
temp[j+1]=NULL;


//le triple pointeur tab_suffixe pointe sur t et t sur NULL:
*tab_suffixe=temp;
temp=NULL;


}


rech_suffixes(n->fils_gauche, tab_suffixe, mot, i, j, k);
rech_suffixes(n->frere, tab_suffixe, mot, i, j, k);
}
}

Qd j'appel la fonction, ca donne :

rech_suffixes(n,&tab_suffixe,suffixe,0,0,0);

Avec, comme declaration au debut :

char*** tab_suffixe=NULL, suffixe[30];
noeud* n;

voici la structure noeud :

typedef struct noeud{
char c;//le caractere
struct noeud* fils_gauche;//fils, continuite du mot
struct noeud* frere;//frere, autre mot
int index_autre_mot;//a cette index, il y a un autre mot ,si -1, le frere=null
}noeud;

Le n de rech_suffixe() designe le noeud qui contient la lettre suivant le prefixe tapé, exemple:
si ds mon fichier jai le mot "allo" et ke l'utilisateur" a tape "a" et bien n renverra le noeud suivant le "a" cad , le noeud pointant sur "l" ...

Et au fait c'est pas du C++ mais c'est du C !!!

Merci à vous!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
5 juin 2005 à 18:43
Si c'est du C, les cast devant le malloc ne servent a rien
0
Rejoignez-nous