Help sur ma fonction!!!

Messages postés
42
Date d'inscription
dimanche 2 février 2003
Statut
Membre
Dernière intervention
1 août 2008
-
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
-
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

Messages postés
341
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
17 juin 2008
3
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
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
En C++, ca serait plus lisible ton code :) Pour éviter les plantages, utilises les string et non des char*.
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Intéressant comme conseil, en poussant un peu il pourrait même le faire en VB, non ?

ciao...
BruNews, MVP VC++
Messages postés
42
Date d'inscription
dimanche 2 février 2003
Statut
Membre
Dernière intervention
1 août 2008

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!!
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
Si c'est du C, les cast devant le malloc ne servent a rien