[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,j"ai un probleme dans ma focntion :
l'idée de base c'est que j'ai une liste chainée seq2 et une autre seq , je vais parcourir les 2 tout en faisant la comparaison pour chaque element de la liste si le dernier mot =au 1er .
si c'est le cas je vais creer un nouvelle liste qui va contenir la concatenation des 2 mots (des 2 liste).
voila le code :
/* permettra d'utiliser partout la meme valeur:*/
#define C_TAILLE_MOT 50
typedef struct L
{
	int freq;
	char mot[C_TAILLE_MOT];
 
	struct L *suivant;
} Liste;
 
/* Prototypes des fonctions pour que ce soit plus clair */
/* Assymetrie dans les arguments pour montrer que le premier,
est const et on y touche pas alors que le second est le buffer temporaire
*/
char* GetFirstWord(const char* sentence, char* buffer);
char* GetLastWord(const char* sentence, char* buffer);
 
Liste * GenNseq(Liste *seq2, Liste *seq);
 
Liste * GenNseq(Liste *seq2, Liste *seq)
{
   Liste *p;
   Liste *q;
   char * mot;
   char * mot1;
   char *first;
   char *last;
   char buff1[C_TAILLE_MOT];/* pas besoin de malloc car 50 est une petite taille et ca s'ajuste avec Liste::mot */
   char buff2[C_TAILLE_MOT];/* deux buffer temporaire: un pour chaque liste!*/
   Liste *pNouvelleListe;/* pour creer la liste*/
   Liste *pCourant;
 
   pNouvelleListe=NULL;
   for(p=seq2; p!=NULL; p=p->suivant)
   {
      mot=p->mot;
      if(mot){
         first=GetFirstWord(mot, buff1);
         for(q=seq; q!=NULL; q=q->suivant)
         {
            mot1 =q->mot;
            if(mot1){
               last=GetLastWord(mot1, buff2);
               if(strncmp(first, last,C_TAILLE_MOT)==0)
               { 
                  printf("similaires!!!!");
                  pCourant = malloc(sizeof(Liste));
                  pCourant->freq = 1;
                  strncpy(pCourant->mot,first,C_TAILLE_MOT);
                  pCourant->suivant = pNouvelleListe;
                  pNouvelleListe = pCourant;
               }
            }
         }
      }
   }
 
   return pNouvelleListe;
}
 
char* GetFirstWord(const char* sentence, char* buffer)
{
  char* pch;
 
  strncpy(buffer, sentence,C_TAILLE_MOT);
 
  pch = strtok(buffer," ,.-");
  /* si (pch==NULL) ca veut dire que le premier mot est le total de sentence */
  return buffer;
}
 
char* GetLastWord(const char* sentence, char* buffer)
{
  char* res;
  char* pch;
 
  strncpy(buffer, sentence,C_TAILLE_MOT);
 
  res = NULL;
  pch = strtok(buffer," ,.-");
  while (pch != NULL)
  {
    res = pch;
    pch = strtok (NULL, " ,.-");
  }
 
  if (res == NULL)
  {/* C'est qu'on n'est pas rentre dans la boucle while -> donc le premier mot = l'ensemble de sentence */
    res = buffer;
  }
  return res;
}
 

merci à vous
j'attends vos reponses

47 réponses

stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
ok
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Je n'ai pas dit

GenNseq(seq[i], seq2);


mais
GenNseq(seq, seq2);

0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
dacc,
voila il affiche : similaires!!!!
et se plante apres
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Affiche ta fonction
InsertionEnTete
0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
voila
Liste *InsertionEnTete(Liste *L, int freq, char *mot){
        Liste *nouveau;
    	nouveau = (Liste *) malloc (sizeof(Liste));

                  nouveau->freq = freq;


    	strcpy(nouveau->mot,mot);
    	nouveau->suivant = L;

    	return nouveau;
    }

mais je pense qu'elle fonction nikel
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
C'est quoi ça??

seq[0]=seq2;

Pourquoi tu fait pointer le 1er élément de ton tableau sur la liste seq2?

D'après ta fonction InsertionEnTete, seq[0] ....... contient des chaines donc si tu fait pointer seq[0] sur seq2 alors tu as perdu le 1ère chaîne (celle sur laquelle seq[0] pointais avant cette affectation bizarre)
0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
oui , mais je voulais faire que
seq[0] recoit seq 2
cet a dire copier seq2 dans seq [0]
oula quelle connerien jai fait!!
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
 
Je ne vois pas où et comment tu remplis ton tableau de listes **seq
0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
je pensais qu'avec ca : seq[0]=seq2;
simplement qu'on rempli un tableau
oh!!!!!!!la honte!!!!!!!!!!
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  
 
donc il faut tout d'abord rempli ton tableau de listes **seq

et ensuite faire les comparaisons que tu veux
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
seq[0]=seq2;
simplement qu'on rempli un tableau


tu remplis tout simplement le 1er élément du tableau avec le liste que tu veux comparer (pas très logique)
il te reste 19999 cases alloués mais non utilisés
0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
non , ils vont etre rempls au fur et au mesure.
0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
au debut remplir seulement la 1ere case qui va contenir la liste seq2
et puis on compare at on remple seq[1] et puis seq[2], ...
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
au debut remplir seulement la 1ere case qui va contenir la liste seq2
pourquoi faire la comparaison avec elle même.
je ne comprends pas du tout.


Comment ça remplir au fur à mesure?!

Remplis d'abord ton tableau et ensuite tu pourras faire tes comparaisons.

Ton algo n'est pas claire du tout.
0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
seq2: ab, ac,ad,bc, bd
seq[0]: ab, ac, ad, bc, bd
on a ces 2 liste , on compare element par element , on trouve
ab et bc(drniermot(seq)==premier mot(seq2))->donc on creer une nouvelle liste "abc" qu'on va la stocker dans seq[1]
ab et bd (derniermot(seq)==premier mot(seq2))->donc on creer une nouvelle liste "abd" qu'on va la stocker dans seq[1]

sachant que a, b,c,d sont des mots
voila


donc seq [1] va contenir la liste chaine : abc, abd
là on s'arrete
car drniermot(abc)<>"a" et"b"
aussi (abd)<>"a" et "b""
voilà
je pense que c'est clair avec ce mini exemple ^^
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
donc comme je te l'ai dit ton algo n'est pas bon

je parle de ta fonction.
et attention, pour concaténer ce n'est pas strcpy mais strcat, tu dois t'assurer que la nouvelle chaine (celle obtenu par concaténation) a la taille de s1 + s2

Si tu crées ton tableau à la volée alors je ne vois pas pourquoi tu alloues 20000 cases au début. Juste pour gaspiller de la mémoire?!

tu peux créer une fonction qui alloue le tableau de façon dynamique


ab et bc(drniermot(seq)==premier mot(seq2))->donc on creer une nouvelle liste "abc" qu'on va la stocker dans seq[1]
ab et bd (derniermot(seq)==premier mot(seq2))->donc on creer une nouvelle liste "abd" qu'on va la stocker dans seq[1]
*

t'en est sûre?!
ce n'est pas plutôt
ab et bc(drniermot(seq)==premier mot(seq2))->donc on creer une nouvelle liste "abc" qu'on va la stocker dans seq[1]
ab et bd (derniermot(seq)==premier mot(seq2))->donc on creer une nouvelle liste "abd" qu'on va la stocker dans seq[2]
?

Donc dans ta fonction on essaie de parcourir un tableau qui a les cases vides et qui doit être rempli à la volée.

Avant d'écrire ton code vaut mieux de penser à un algo pour réaliser ce que tu veux.


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  
 
abc cest la phrase d'une seule cellule
on va mettre abc et abc (2cellule) dans la meme case,
et cncernant l'allocation dynamique je connais pas comment faire :(
ca devient de plus en plus compliqué le projet:'(
0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
c'est pas de cete facon qu'on rempli un tableau par la liste seq2?
seq[0]=seq2;
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Je t'ai déjà répondu ICI
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
abc cest la phrase d'une seule cellule
on va mettre abc et abc (2cellule) dans la meme case,


je ne comprends pas
et n'oublie pas quand tu parles des cases en fait tu parles des listes (vu que une case c'est une liste)

et cncernant l'allocation dynamique je connais pas comment faire :(

Tu l'as déjà fait.
Voir la fonction InsertionEnTete qui à chaque nouveau élément alloue un nouveau espace

Voir aussi la fonction qui crée ta Table de Hash.
D'après toi, c'est quoi une table table de hash?

Je vais te dire.
C'est un tableau de listes chaînée dans ton cas, avec l'insertion en utilisant une fonction de hash
La seule différence entre ta table de listes et ta Table de hash, c'est que pour l'insertion tu n'utiliseras pas une fonction de hash, bref tu ne vas pas gérer les collisions.

ca devient de plus en plus compliqué le projet:'(
Je le sais.
Mais le pire c'est que tu as éparpillé tes messages au lieu de rester sur un seul fil avec peut être des liens vers la suite.

Donc c'est seulement toi qui sait exactement l'évolution de ton projet ;-(
0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
merci LAmi
0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
comme ca on fait l'allocation dynamique du tableau ;
seq=(liste**)malloc(sizeof(liste*));
?
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Re,

si tu ne connais pas d'avance le nombre d'éléments du tableau alors tu es obligé de choisir une taille assez grande assez grande comme tu l'as déjà fait avec 20000
seq=(liste**)malloc(20000 * sizeof(liste*)); 


mais il faut voir si tu as vraiment besoin de ça

pourquoi ne fait tu d'abord un algo et ensuite commencer écrire le code?
analyse bien ton problème :
- ce que tu as en entrée
- ce que tu veux obtenir

ça te permettra de choisir la structure de données mieux adapter pour tes besoins

Je ne parle qu'au mode général, vu que je ne connais pas l'évolution de ton projet ni ce que tu veux obtenir à la fin

0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
merci Lami,
concernant l'algo, je pense qu'il a bien oris son temps: depuis le mois d'avril !!
donc je pense que c'est le temps d'implementer non? ^^
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 ne parle pas de l'algo de ton projet, qui évolue toujours selon ce que tu as dit, donc ce n'est pas un algo stable

Mais pour le moment je ne parle pas de l'algo de ton projet mais de l'algo de ta fonction
N'oublie pas que tu viens toujours avec une nouvelle fonction ce qui me fait penser à deux choses :

- tu construis ton projet au fur à mesure => il n'y a pas vraiment un algo mais des p'tits bout qu'on ajout à l'algo initial
- les nouvelles fonctions peuvent toujours poser des problèmes vu que la construction de projet n'a pas prévu depuis le début l'existence de la fonction, et donc, peut être qu'il n'est pas prêt de recevoir la fonction dans la manière dont tu le penses

En ce cas, il faut toujours revenir en arrière et reprendre tout, pour réintégrer les nouvelles fonctionnalités.

Tu vois ce que je veux dire?!

P.S. N'oublie pas qu'on a commené avec une pauvre Table de hachage.
Rappel
http://www.commentcamarche.net/forum/affich 6912011 table de hachage
Tu n'a pas parlé au début de l'ampleur de ton projet

C'est pour ça que je dis que ce n'est que toi qui sait exactement comment ton projet a évolué
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  
 
J'arrive pas elliminer le plantage :aie
:(
je sais pas pourquoi il se plante
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  
 
salut
faut que j'optimise cette fonction , car je l'ai testé sur un fichier de 1GO, ca resté plus qu'une heure bloqué ladessus.
idée Lami svp?
merci
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Re,

ça veut dire que le programme fonctionne?!
c'est déjà un pas en avant, vu qu'au début il plantais

0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
oui,
mais jai elliminet la boucle
regarde
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
/* permettra d'utiliser partout la meme valeur:*/
#define C_TAILLE_MOT 100
#define BUFFSIZE 64
#define FNAME "d:\\out.txt"
#define TAILLEHASH 300
#define C_TAILLE_MAX_PHRASE 100
#define Seuil 0.0000001

typedef struct L
{
	int freq;
	char mot[C_TAILLE_MOT];


	struct L *suivant;
} Liste;

/* Prototypes des fonctions pour que ce soit plus clair */
/* Assymetrie dans les arguments pour montrer que le premier,
est const et on y touche pas alors que le second est le buffer temporaire
*/
char* GetFirstWord(const char* sentence, char* buffer);
char* GetLastWord(const char* sentence, char* buffer);
Liste * GenNseq(Liste *seq2, Liste **seq);

char* get_word(FILE *fdesc, char *buff, size_t size)
{
	char *ret=NULL;

	if( fdesc!=NULL && buff!=NULL && size>0 )
	{
		int c;
		size_t i=0;
		while( ret==NULL && i<size && (c=fgetc(fdesc))!=EOF )
		{
			if( isalpha(c))
			{
				buff[i]=c;
				i++;
			}
			else if( i>0 )
			{	/* mot */
				buff[i]='\0';
				ret=buff;
			}
		}
	}
	return ret;
}
unsigned int hash_cle(const char * mot)
{
	unsigned int val = 0;
	for(; *mot != '\0'; ++mot)
	{
		val = *mot + 31 * val;
	}
	return val % TAILLEHASH;
}

void insere_th(Liste **TableHash, const char *mot)
{
	unsigned int idx = hash_cle(mot);


	Liste *p = TableHash[idx];
	while(p != NULL)
	{
		if(strcmp(p->mot, mot) == 0)
		{
			/* le mot est trouve */
			break;
		}
		p =p->suivant;
	}

	if(p == NULL)
	{
		/* le mot n'existe pas, insertion de celui ci */
		p = (Liste *)malloc(sizeof(Liste));
		if(p == NULL)
		{
			/* erreur d'allocation de memoire */
			printf("Erreur d'allocation mémoire\n");
			exit(0);
		}

		/* initialisation de la structure */

		p->freq = 0;
		strncpy(p->mot, mot, sizeof(p->mot));

		/* creation des coordonnees */


		/* mise a jour des liens, insertion en debut de liste */
		p->suivant = TableHash[idx];
		TableHash[idx] = p;
		//return;
	}
	p->freq++;
}

void dump_table(Liste **TableHash)
{
	int boucle;
	for( boucle = 0; boucle != TAILLEHASH; boucle++)
	{
		Liste *p = TableHash[boucle];
		if(p != NULL)
		{
			printf("hash=%d\n", boucle);
			while(p != NULL)
			{
				printf("\t(%s : %d)\n", p->mot, p->freq);

				p = p->suivant;
			}
		}
	}
}

int numligne (FILE *F)
{
    int res=0;

		F = fopen (FNAME, "r");


   if (F != NULL)
   {

      char buffer[BUFSIZ];
      int nb_read;

      while ((nb_read = fread (buffer, 1, sizeof buffer, F)) > 0)
      {
         int i;

         for (i = 0; i < nb_read; i++)
         {
            if (buffer[i] == '\n')
            {
               res++;
            }
         }
      }
      fclose (F);
    //  printf ("%i\n", res);
   }
   else
   {
      perror (FNAME);
   }
   return res;

}

void clean_table(Liste **TableHash, int NombreLigne )
{
	int boucle;
	float suup;

	for( boucle = 0; boucle != TAILLEHASH; boucle++)
	{
		Liste *premier_valide = NULL;
		Liste *q = TableHash[boucle];
		while(q != NULL)
		{
			 suup = (float)(q->freq) / (float)(NombreLigne);
			if(suup < Seuil)
			{
				/* supprime l'element */
				Liste *tmp = q->suivant;
				/* -mo- libere(q); n'est pas déclarée */
				q = tmp;
			}
			else
			{
				if(premier_valide == NULL)
				{
					premier_valide = q;
				}
				q = q->suivant;
			}
		}
		TableHash[boucle] = premier_valide;
	}
}
Liste *InsertionEnTete(Liste *L, int freq, char *mot){
        Liste *nouveau;
    	nouveau = (Liste *) malloc (sizeof(Liste));

                  nouveau->freq = freq;


    	strcpy(nouveau->mot,mot);
    	nouveau->suivant = L;

    	return nouveau;
    }
     void AfficherListe(Liste *L){
    	Liste *p;
    	for(p=L;p!=NULL;p=p->suivant){
    		printf("%s \n",p->mot);
    		printf("%d : ",p->freq);

    	}
    }


char* GetFirstWord(const char* sentence, char* buffer)
{
  {
  char* pch;

  strcpy(buffer, sentence);

  pch = strtok(buffer," ,.-");
  if (pch == NULL)
  {
    buffer[0] = 0;
    pch = buffer;
  }
  return pch;
}
}

char* GetLastWord(const char* sentence, char* buffer)
{
  char* res;
  char* pch;

  strncpy(buffer, sentence,C_TAILLE_MOT);

  res = NULL;
  pch = strtok(buffer," ,.-");
  while (pch != NULL)
  {
    res = pch;
    pch = strtok (NULL, " ,.-");
  }

  if (res == NULL)
  {/* C'est qu'on n'est pas rentre dans la boucle while -> donc le premier mot = l'ensemble de sentence */
    res = buffer;
  }
  return res;
}



Liste * GenNseq(Liste *seq2, Liste **seq)
{
   Liste *p;
   Liste *q;
   int i;
   char * mot;
   char * mot1;
   char *first;
   char *last;
   char buff1[C_TAILLE_MOT];/* pas besoin de malloc car 50 est une petite taille et ca s'ajuste avec Liste::mot */
   char buff2[C_TAILLE_MOT];/* deux buffer temporaire: un pour chaque liste!*/
   Liste *pNouvelleListe;/* pour creer la liste*/
   Liste *pCourant;

   pNouvelleListe=NULL;
   for(p=seq2; p!=NULL; p=p->suivant){
      mot=p->mot;
      if(mot){
         first=GetFirstWord(mot, buff1);
         //for(i=0;i<39;++i){ // pour chaque élément (liste) de seq
           for(q=seq; q!=NULL; q=q->suivant){ // seq[i] - element(liste) de seq
             mot1 =q->mot;
             if(mot1){
                 //printf("%s", mot1);
               last=GetLastWord(mot1, buff2);
               if(strncmp(first, last,C_TAILLE_MOT)==0){
                //printf("similaires!!!!");
                 pCourant = malloc(sizeof(Liste));
                 pCourant->freq = 1;
                 strncpy(pCourant->mot,first,C_TAILLE_MOT);
                 pCourant->suivant = pNouvelleListe;
                 pNouvelleListe = pCourant;
               }
             }
           }

      }
   }
   return pNouvelleListe;
}


//void Affiche_L(Liste **seq2, Liste **seq)
//{
//   Liste *p;
//   Liste *q;
//   for(p=*seq2; p!=NULL; p=p->suivant)
//      printf("%s\n",p->mot);
//
//   for(q=*seq; q!=NULL; q=q->suivant)
//      printf("%s\n",q->mot);
//}





















int main(void)
{
    Liste **seq;
    Liste *seq2=NULL;
	int res;
	FILE *fdesc=fopen(FNAME,"r");

	Liste *TableHash[TAILLEHASH];
	Liste *p1;
	int i;
	int n=400000;

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

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

		if( get_word(fdesc,prec,BUFFSIZE) )
		{
			while( get_word(fdesc, buff, BUFFSIZE) )
			{
				//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);
			}
		}
		}
		dump_table(TableHash);

		res = numligne(fdesc);
		printf("%d\n", res);
		//printf("aaaaaaaaaaaaaaaaaaaaaaaa");


		clean_table(TableHash, res);
		printf("la liste filtrée\n");


	dump_table(TableHash);

	seq =(Liste **) malloc ( n *sizeof(Liste *)); // les tableau des toutes les Nseq
    seq[0]=NULL;


    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[0]=seq2;
    AfficherListe(seq[0]);
    printf ("fin d'affichage de la liste des 2 seq\n");
//    for(i=0; i<n-1; i++)
//    {

       seq[i+1]=GenNseq( seq2, seq[0]);

   // }

AfficherListe(seq[1]);
printf("----------------the end-----------------------");
 //



//Affiche_L(seq2, seq);



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
 
oui

mais jai elliminet la boucle


donc tu devais commencer par dire que ton problème est résolu à ce niveau
donc c'était une histoire de déclaration de prototype de la fonction qui plantait au niveau de l'erreur de segmentation
0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
hummm, je 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  
 
je ne pense pas, je suis certain

regarde ton message initial
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Ta fonction ne teste que le 1er élément du tableau.
0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
oi je sais , je faits ca expres, pour voir les resultat,
mais ca donné rien, il se bloque : le curseur clignote et c'est tout.
0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
lami, vous pensez qu'il ya une boucle infinie dans la fonction.
jai rappelé mon encadreur maintenant, il ma dit verifie bien s'il ya une boucle infinie ladedans
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Ton appelle de fonction n'est pas correct

seq[i+1]=GenNseq( seq2, seq[0]);

regarde ton prototype de la fonction
Liste * GenNseq(Liste *seq2, Liste **seq)
donc le deuxième paramètre c'est un pointeur de pointeurs

Dans ton appelle le deuxième paramètre est un pointeur

En plus i n'est pas initialisé.

Comme je te l'ai déjà dit dans ta fonction tu ne traite que le 1er terme du tableau

Même si tu fais une affectation à i+1 tu ne le traite jamais dans la fonction.

écrit l'algo de la fonction pour voir

0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
j'ai testé simplement avec cette instruction : seq[1]=GenNseq( seq2, seq[0]);
voila l'algo:

pour i de 0 à n faire //parcourir le tableau
{
parcourir la liste de la case i
parcourir la liste de seq2
verifier pour chaque element de seq et pour chaque element de seq2
si premier mot de seq2 == dernier mot de seq
si sont egaux alors
concatene (mot des seq avec premier mot de seq2 )=>C
copier C dans une nouvelle liste chainne
mettre liste chainne dans seq[i+1]
finci
finsi
fin pour
voila l'algo
0