[C]erreur de segmentation dans une fonction

stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   -  
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
bonjour à tous
j'ai une erreur de segmentation dans une focntion
voilà l'idée de base ; on creer une fonction du genre : afficheOrigineavecListe(element de ta liste (genre ab), et une liste avec lekel il faut tout afficher)
{ tant que ta liste nest pas vide si lelement de ta liste que tu parcours et different de Origine, alors tu afifche Origine->element et j'appel cette fonction genre avec : ab, et tab[0] pui ab et tab[1], etc...
seq =(Liste **) malloc (NBRSEQ * sizeof(Liste *)); // les tableau des toutes les Nseq
for(i=0; i<NBRSEQ; i++)
{
//GenRA(seq[i], res);
p=seq[i];
while (p!=NULL)
    {
    printf("%s", p->mot);
    for(j=0; j<NBRSEQ; j++)
    {
    AfficherOrigineListe(p->mot, seq[j]);

    }
}




void AfficherOrigineListe(char mot [150], Liste *p)
{
    while (p!=NULL)
    {
       // printf("%s", p->mot);
         if(strcmp(p->mot, mot)!=0)_____________________ici l'erreur_____________________

        {
            printf("%s", p->mot);
            printf("->");
            printf("%s", mot);
//
        }
         p=p->suivant;


    }


}

j'attends vos reponse

41 réponses

stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
voila
je les rempli a laide de la fonction GenNseq
int main(int argc, char *argv[])
{

    Liste *seq2=NULL;
    Liste **seq=NULL;
    Liste *p;
int j;
    int res=0;
    FILE *fdesc=fopen(FNAME,"r");

    Liste *TableHash[TAILLEHASH];
    Liste *p1;
    int i;

    for (i = 0; i < TAILLEHASH; ++i)
    {
        TableHash[i] = NULL;
    }

    if ( fdesc )
    {
        char buff[BUFFSIZE];
        char prec[BUFFSIZE];

        printf("Parsing file");
        while ( get_word(fdesc,prec,BUFFSIZE) )
        {
            printf(".");
            while ( get_word(fdesc, buff, BUFFSIZE) )
            {
                //printf("b2");
                //printf("%s %s\n",prec,buff);
                char s3[BUFFSIZE * 2];
                sprintf(s3, "%s %s", prec, buff);
                puts(s3);
                strncpy( prec,buff,BUFFSIZE);
                insere_th(TableHash,s3);
            }
            fseek(fdesc, 1, SEEK_CUR);
        }
    }
    printf("la table de hachage avant le filtrage");
    dump_table(TableHash);
    res = numligne(fdesc);
    printf("%d\n", res);
    //printf("%d\n", res);
    //printf("aaaaaaaaaaaaaaaaaaaaaaaa");


    clean_table(TableHash, res);
    printf("la table de hachage filtrée\n");
    dump_table(TableHash);

     for (i=0;i<TAILLEHASH;++i)
    {

        if (TableHash[i] != NULL)
        {
            for (p1=TableHash[i];p1!=NULL;p1=p1->suivant)
            {
                seq2=InsertionEnTete(seq2, p1->freq, p1->mot);

            }


        }
    }




seq =(Liste **) malloc (NBRSEQ * sizeof(Liste *)); // les tableau des toutes les Nseq
for(i =0;i<NBRSEQ-1; i++)
{
    seq[i]=NULL;


}

    seq[0]=seq2;
    for(i=1; i<NBRSEQ-1; i++)
{
seq[i]=GenNseq(seq[i-1], seq2);
AfficherListe(seq[i]);
seq[i]=filtrer_liste(seq[i]);
AfficherListe(seq[i]);
if (TailleListe(seq[i]) == 0) // si on arrive plus a generer on sort de boucle
 break;

//elagage(seq[i], &(seq[i-1]));
}

for (j=1; j <= i; j++){
    		printf("\nla liste des %d seq elagues:\n----------------------------------\n",(j+1));
    		//AfficherListe(seq[j]);

    	elagage(seq[j], &(seq[j-1]));
    	AfficherListe(seq[j-1]);
}

 AfficherListe(seq[i]);






for(i=0; i<NBRSEQ; i++){
//GenRA(seq[i], res);
  p=seq[i];
  while (p!=NULL){
    printf("%s", p->mot);
   for(j=0; j<NBRSEQ - 1; j++)

      AfficherOrigineListe(p->mot, seq[j], res);
    p=p->suivant;
  }
}
//


free(seq);

free(TableHash);

    return 0;
}
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Cet appel de fonction AfficherListe(seq[i]);
affiche le résultat désiré?!
0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
elle afiche la liste qui est dans la cese i du tableau seq
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Je ne comprends plus rien

Dans ton message initial tu as la fonction avec 2 paramètres
void AfficherOrigineListe(char mot [150], Liste *p)
et dans ton dernier code je vois que tu lui passe 3 arguments

AfficherOrigineListe(p->mot, seq[j], res);

Décide toi.
0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
AfficherOrigineListe(p->mot, seq[j], res);
comme ca car je vais calculer le support qui va utiliser res : nombre de ligne
mais le mem probleme dans les 2 cas lami
0

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

Posez votre question
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Mais ta fonction est conçue avec 2 paramètres seulement.
Tu ne peux pas passer 3 arguments.
0
chuka Messages postés 965 Date d'inscription   Statut Membre Dernière intervention   378
 
Si tu as déclaré :
liste *a;
a=(list*)mallac(1*sizeof(list));
a->freq=ta_valeur;
a->mot="ton_mot";
a->suivant=? //la je sais pas comment tu fais....
normalement si tu as declaré
liste* tab[NBRSEQ];
int i=0;
tab[i]=a; //ca devrait marcher....
Comment tu remplis les valeur de liste??
0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
regarde la fonction GenNseq: c'est là que je construit mes listes chainees
0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
voilà
snprintf(pCourant->mot, C_TAILLE_MOT, "%s%s", seq->mot, strpbrk(seq2->mot, " ,.-;"));



                         printf("%s", pCourant->mot);


                         pCourant->freq = frequence(pCourant->mot);

                         //printf("%d",   pCourant->freq);
                        pCourant->suivant = pNouvelleListe;
                        pNouvelleListe = pCourant;
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570 > stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention  
 
Je t'ai demander si l'appel pour la fonction qui affiche ton tableau de liste fonctionne
Oui ou non?

Affiche ici le résultat
0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2 > lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
 
oui il fonctionne nikel
0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2 > lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
 
je vois bien mes liste chianee: en fait mes phrases
0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
oui mais jai réparé ca
voila
void AfficherOrigineListe(char mot [150], Liste *p,int res)
{
    char s3[150];
    float support;
	float confiance;
    while (p!=NULL)
    {
        printf("les mots");
       // printf("%s\n", p->mot);
            printf("%s\n",mot);
         if(strcmp(p->mot, mot)!=0)

        {
            printf("%s", p->mot);
            printf("->");
            printf("%s\n", mot);
            sprintf(s3, "%s %s", p->mot, mot);
  	        printf("%s\n",s3);

                   printf("%d\n", res);
        			printf("%d", frequence(s3));
        			support=frequence(s3)/(float)(res);     //ça serait pas n+1 le nbre ligne
        			confiance =(float)(support)/(float)((float)(p->freq)/(float)(res));
        			//printf(" / %i ",p->freq);
        			printf("\tsupport : %f\n", support);
        			printf("\tConfiance : %f\n",  confiance );







        }
         p=p->suivant;


    }
}
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Alors, essaie juste un seule appel, sans boucle

AfficherOrigineListe(p->mot, seq[0], res);

et affiche ici ce que tu obtiens (il ne suffit pas de dire que ça fonctionne nikel, comme je suis un peu parano ;-) j'ai besoin d'interpréter moi même le résultat )
0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
comme ca il se plante
printf("voila la liste \n");
while (p!=NULL){
 AfficherOrigineListe(p->mot, seq[0], res);
 p=p->suivant;
}

bizarre non?
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Essaie juste ça
printf("%s, %s\n",seq[0]->mot,seq[1]->mot);

et affiche le résultat (il ne suffit pas de me dire qu'il plante)

0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
ya rien
la liste des sequence :
ca plante
il naffiche rien
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Alors affiche le résultat de
 AfficherListe(seq[0]);
 AfficherListe(seq[1]);

0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
seq[0]et seq[1] sont vides donc rien à afficher mais des [4] et seq [8] sont pas vide donc l'affichage donne:
<il est beau he is nice ,3>
<bonjour les amis du monde good morning friends of world, 3>
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Alors, fait
AfficherOrigineListe(seq[4]->mot, seq[8], res);
0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
voila les listes:
il est beau he is nice
bonjour les mais du monde good morning friends of world->il est beau he is nice
bonjour les mais du monde good morning friends of world il est beau he is nice
support: 0.1427
confiance : 0.333
voila
pas d'erreur de segmentation ^^
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Ok, donc il faut écrire la fonction d'une manière qu'il ne traite que les éléments du tableau seq qui pointe vers quelque chose.
Tu as en fait l'erreur de segmentation puisque seq[0] par exemple est NULL depuis le début.

Au moins on a localisé le problème ;-)
Je ne peux plus rester.

A demain si jamais il n'y a pas d'autre personne pour prendre le relais ;-)
0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
d'accord bonne nuit
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
En fait je pense que tu dois écrire

for(i=0; i<NBRSEQ; i++){
  if(seq[i] != NULL){
    p=seq[i];
    while (p!=NULL){
      printf("%s", p->mot);
      for(j=0; j<NBRSEQ - 1; j++)
        if(seq[j] != NULL)
          AfficherOrigineListe(p->mot, seq[j], res);
      p=p->suivant;
    }
  }
}


0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
merci, mais le meme problem persiste encore
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Affiche
printf("%p\n",seq[0]);
0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
00000000
le probleme Lami n'ets pas dans la 1ere case qui est vide, mais je pense la derniere ou bien au milieu mais certainement pas la 1ere
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Les conditions if que j'ai mis c'est justement pour agir seulement pour les listes valides.

Utilise la fonction sans res pour voir.
Donc modifie le prototype et l'appel
0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
peut etre le probleme au sein de la liste meme dans la meme case .
tu pense?
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570 > stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention  
 
Envoi le code complet et le fichier de test.
Je verrai ça demain ;-)

La réponse tu l'auras ici.
0