[C]erreur de segmentation dans une fonction

Fermé
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 - 12 oct. 2008 à 20:06
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 12 oct. 2008 à 22:49
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
A voir également:

41 réponses

stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
12 oct. 2008 à 21:09
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
12 oct. 2008 à 21:12
Cet appel de fonction AfficherListe(seq[i]);
affiche le résultat désiré?!
0
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
12 oct. 2008 à 21:14
elle afiche la liste qui est dans la cese i du tableau seq
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
12 oct. 2008 à 21:16
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 mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
12 oct. 2008 à 21:17
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
12 oct. 2008 à 21:20
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 samedi 11 octobre 2008 Statut Membre Dernière intervention 29 juillet 2010 378
12 oct. 2008 à 21:22
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 mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
12 oct. 2008 à 21:26
regarde la fonction GenNseq: c'est là que je construit mes listes chainees
0
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
12 oct. 2008 à 21:28
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569 > stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009
12 oct. 2008 à 21:28
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 mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2 > lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
12 oct. 2008 à 21:30
oui il fonctionne nikel
0
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2 > lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
12 oct. 2008 à 21:32
je vois bien mes liste chianee: en fait mes phrases
0
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
12 oct. 2008 à 21:22
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
12 oct. 2008 à 21:33
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 mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
12 oct. 2008 à 21:40
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
12 oct. 2008 à 21:46
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 mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
12 oct. 2008 à 21:51
ya rien
la liste des sequence :
ca plante
il naffiche rien
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
12 oct. 2008 à 21:57
Alors affiche le résultat de
 AfficherListe(seq[0]);
 AfficherListe(seq[1]);

0
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
12 oct. 2008 à 22:03
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
12 oct. 2008 à 22:05
Alors, fait
AfficherOrigineListe(seq[4]->mot, seq[8], res);
0
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
12 oct. 2008 à 22:13
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
12 oct. 2008 à 22:18
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 mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
12 oct. 2008 à 22:21
d'accord bonne nuit
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
12 oct. 2008 à 22:26
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 mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
12 oct. 2008 à 22:31
merci, mais le meme problem persiste encore
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
12 oct. 2008 à 22:34
Affiche
printf("%p\n",seq[0]);
0
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
12 oct. 2008 à 22:36
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
12 oct. 2008 à 22:40
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 mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
12 oct. 2008 à 22:48
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569 > stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009
12 oct. 2008 à 22:49
Envoi le code complet et le fichier de test.
Je verrai ça demain ;-)

La réponse tu l'auras ici.
0