[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 -
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 :
merci à vous
j'attends vos reponses
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
A voir également:
- [C ]erreur de segmentation dans une fonction
- Fonction si et - Guide
- Excel remplir automatiquement une cellule en fonction d'une autre ✓ - Forum Excel
- Excel : Remplir une cellule en fonction d'une autre ✓ - Forum Excel
- Erreur 3000 france tv - Forum Lecteurs et supports vidéo
- Une erreur de communication est détectée dans le module de sécurité ✓ - Forum TNT / Satellite / Réception
47 réponses
Affiche ta fonction
InsertionEnTete
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)
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)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Je ne vois pas où et comment tu remplis ton tableau de listes **seq
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
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
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], ...
et puis on compare at on remple seq[1] et puis seq[2], ...
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.
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.
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 ^^
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 ^^
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
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.
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.
c'est pas de cete facon qu'on rempli un tableau par la liste seq2?
seq[0]=seq2;
seq[0]=seq2;
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 ;-(
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 ;-(
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
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
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
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é
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é
Re,
ça veut dire que le programme fonctionne?!
c'est déjà un pas en avant, vu qu'au début il plantais
ça veut dire que le programme fonctionne?!
c'est déjà un pas en avant, vu qu'au début il plantais
oui,
mais jai elliminet la boucle
regarde
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; }
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
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
Ton appelle de fonction n'est pas correct
seq[i+1]=GenNseq( seq2, seq[0]);
regarde ton prototype de la fonction
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
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
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
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