[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
Je pense que tu n'as pas lu mon message précédent
j'ai testé simplement avec cette instruction : seq[1]=GenNseq( seq2, seq[0]);
ce n'est pas bon ça
j'ai testé simplement avec cette instruction : seq[1]=GenNseq( seq2, seq[0]);
ce n'est pas bon ça
Si je prends ton algo en fait ça donne ça
Le 1er élément de seq pointe sur seq2
Pour chaque élément de seq2
Pour chaque élément de seq (il n'y a que le 1er qui pointe sur quelque chose les autres 19999 point sur n'importe quoi)
...........................
Si jamais dans main tu fait
Pour i=0 jusqu'au 20000 en fait ta boucle dans la fonction se fera dans la manière suivante
La 1ère fois elle passe une fois pour le 1er élément (et pour les autres 19999 ?!)
La 2ème fois elle passera 2 fois .............
La 3ème fois elle passera 3 fois ..................
.............;
La 20000 elle passera 20000 fois .................
Je te laisse calculer combien des fois ta boucle s'exécutera
Ton algo n'es pas bon je pense
Le 1er élément de seq pointe sur seq2
Pour chaque élément de seq2
Pour chaque élément de seq (il n'y a que le 1er qui pointe sur quelque chose les autres 19999 point sur n'importe quoi)
...........................
Si jamais dans main tu fait
Pour i=0 jusqu'au 20000 en fait ta boucle dans la fonction se fera dans la manière suivante
La 1ère fois elle passe une fois pour le 1er élément (et pour les autres 19999 ?!)
La 2ème fois elle passera 2 fois .............
La 3ème fois elle passera 3 fois ..................
.............;
La 20000 elle passera 20000 fois .................
Je te laisse calculer combien des fois ta boucle s'exécutera
Ton algo n'es pas bon je pense
je pense pas:
comme ca ca marche pas
#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:\\test.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[1]=GenNseq( seq2, seq); // } printf("fin de la generation des seq1"); //AfficherListe(seq[1]); printf("----------------the end-----------------------"); // //Affiche_L(seq2, seq); free(seq); free(TableHash); return 0; }
comme ca ca marche pas
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Je vois que tu ne comprends pas
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;
}
Cette partie de code ne teste que le 1er élément de ton tableau de liste dont le seq[0] c'est tout
seq étant l'adresse du 1er élément du tableau de pointeurs
vraiment tordu ta façon de vouloir créer le **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;
}
Cette partie de code ne teste que le 1er élément de ton tableau de liste dont le seq[0] c'est tout
seq étant l'adresse du 1er élément du tableau de pointeurs
vraiment tordu ta façon de vouloir créer le **seq
ta une idée plus optimiseé pour parcourir les 2 liste en comparant les elements ?
moi je vois , je vois seulement cette methode :(
moi je vois , je vois seulement cette methode :(
apres 1heure de run il se plante :(
je sais pas pourquoi
je sais pas pourquoi