Problème de segmentation
zamen92
Messages postés
2
Date d'inscription
Statut
Membre
Dernière intervention
-
[Dal] Messages postés 6205 Date d'inscription Statut Contributeur Dernière intervention -
[Dal] Messages postés 6205 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Cela fait 3 semaine que je suis bloqué, j'ai besoin d'aide avant le jeudi 28 mars s'il vous plait.
Cela fait 3 semaine que je suis bloqué, j'ai besoin d'aide avant le jeudi 28 mars s'il vous plait.
#include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include "../lib/libgraphique.h" typedef struct connexion { char mois[4]; float janv; float feb; float mar; float avr; float mai; float juin; float juil; float aout; float sep; float oct; float nov; float dec; float total; } connexion_t; void lecture_style() { FILE *fd; char str[1024]; if ((fd = fopen("aecrire.html","r")) == NULL) fprintf(stderr,"ERREUR DE CHARGEMENT DE FICHIER\n"); else { while (!feof(fd)){ fgets(str,1024,fd); printf("%s",str); } fclose(fd); } } void versionweb(float somme,float *tab) { int ta=(int) tab[0]; int tz=(int) tab[1]; int te=(int) tab[2]; int tr=(int) tab[3]; int tt=(int) tab[4]; int ty=(int) tab[5]; int tu=(int) tab[6]; int ti=(int) tab[7]; int to=(int) tab[8]; int tp=(int) tab[9]; int tq=(int) tab[10]; int ts=(int) tab[11]; printf("Content-type: text/html\n\n"); printf("<!doctype html>\n"); printf("<html lang=\"fr\">\n"); printf("<body>\n"); lecture_style(); printf("Depuis le 01/Jan/2018 on a enregistré %f connexions.<br>\n",somme); printf("<div id = \"vertgraph\">\n"); printf(" <ul>\n"); printf(" <li style=\"left: 10px; height: %dpx;\">%d</li>\n",ta*10,ta); printf(" <li style=\"left: 41px; height: %dpx;\">%d</li>\n",tz*10,tz); printf(" <li style=\"left: 72px; height: %dpx;\">%d</li>\n",te*10,te); printf(" <li style=\"left: 103px; height: %dpx;\">%d</li>\n",tr*10,tr); printf(" <li style=\"left: 134px; height: %dpx;\">%d</li>\n",tt*10,tt); printf(" <li style=\"left: 165px; height: %dpx;\">%d</li>\n",ty*10,ty); printf(" <li style=\"left: 196px; height: %dpx;\">%d</li>\n",tu*10,tu); printf(" <li style=\"left: 227px; height: %dpx;\">%d</li> \n",ti*10,ti); printf(" <li style=\"left: 258px; height: %dpx;\">%d</li> \n",to*10,to); printf(" <li style=\"left: 289px; height: %dpx;\">%d</li> \n",tp*10,tp); printf(" <li style=\"left: 320px; height: %dpx;\">%d</li>\n",tq*10,tq); printf(" <li style=\"left: 351px; height: %dpx;\">%d</li> \n",ts*10,ts); printf(" </ul>\n"); printf("</div>\n"); printf("</html>\n"); printf("</body>\n\n"); } void versiongraphique(float somme, float *tab) { int sommes = (int) somme; char stdr[246]; sprintf(stdr,"%d",sommes); int ta=(int) tab[0]; char t0[256]; sprintf(t0,"%d",ta); int tz=(int) tab[1]; char t1[256]; sprintf(t1,"%d",tz); int te=(int) tab[2]; char t2[256]; sprintf(t2,"%d",te); int tr=(int) tab[3]; char t3[256]; sprintf(t3,"%d",tr); int tt=(int) tab[4]; char t4[256]; sprintf(t4,"%d",tt); int ty=(int) tab[5]; char t5[256]; sprintf(t5,"%d",ty); int tu=(int) tab[6]; char t6[256]; sprintf(t6,"%d",tu); int ti=(int) tab[7]; char t7[256]; sprintf(t7,"%d",ti); int to=(int) tab[8]; char t8[256]; sprintf(t8,"%d",to); int tp=(int) tab[9]; char t9[256]; sprintf(t9,"%d",tp); int tq=(int) tab[10]; char t10[256]; sprintf(t10,"%d",tq); int ts=(int) tab[11]; char t11[256]; sprintf(t11,"%d",ts); Point p = {30,50}; ouvrir_fenetre(470,400); dessiner_rectangle((Point){0,0},470,400,blanc); afficher_texte(stdr,12,p,noir); p.y=300; afficher_texte(" Jan Fev Mar Avr Mai Juin Juil Aou Sep Oct Nov Dec",14,p,vert); dessiner_rectangle((Point){30,300-ta*10},30,ta*10,orange); dessiner_rectangle((Point){61,300-tz*10},30,tz*10,orange); dessiner_rectangle((Point){92,300-te*10},30,te*10,orange); dessiner_rectangle((Point){123,300-tr*10},30,tr*10,orange); dessiner_rectangle((Point){154,300-tt*10},30,tt*10,orange); dessiner_rectangle((Point){185,300-ty*10},30,ty*10,orange); dessiner_rectangle((Point){216,300-tu*10},30,tu*10,orange); dessiner_rectangle((Point){247,300-ti*10},30,ti*10,orange); dessiner_rectangle((Point){278,300-to*10},30,to*10,orange); dessiner_rectangle((Point){309,300-tp*10},30,tp*10,orange); dessiner_rectangle((Point){340,300-tq*10},30,tq*10,orange); dessiner_rectangle((Point){371,300-ts*10},30,ts*10,orange); afficher_texte(t0,14,(Point){40,300-ta*9},blanc); afficher_texte(t1,14,(Point){71,300-tz*9},blanc); afficher_texte(t2,14,(Point){102,300-te*9},blanc); afficher_texte(t3,14,(Point){133,300-tr*9},blanc); afficher_texte(t4,14,(Point){164,300-tt*9},blanc); afficher_texte(t5,14,(Point){195,300-ty*9},blanc); afficher_texte(t6,14,(Point){226,300-tu*9},blanc); afficher_texte(t7,14,(Point){257,300-ti*9},blanc); afficher_texte(t8,14,(Point){288,300-to*9},blanc); afficher_texte(t9,14,(Point){319,300-tp*9},blanc); afficher_texte(t10,14,(Point){350,300-tq*9},blanc); afficher_texte(t11,14,(Point){381,300-ts*9},blanc); actualiser(); attendre_clic(); fermer_fenetre(); } void versiontext(float total, float *tab) { printf("Depuis le date on a enregistré %f connexions.\n",total); printf("\tJanvier : %f %%\n", tab[0]); printf("\tFevrier: %f %%\n", tab[1]); printf("\tMars : %f %%\n", tab[2]); printf("\tAvril : %f %%\n", tab[3]); printf("\tMai : %f %%\n", tab[4]); printf("\tJuin: %f %%\n", tab[5]); printf("\tJuillet: %f %%\n", tab[6]); printf("\tAout : %f %%\n", tab[7]); printf("\tSeptembre : %f %%\n", tab[8]); printf("\tOctobre : %f %%\n", tab[9]); printf("\tNovembre : %f %%\n", tab[10]); printf("\tDecembre : %f %%\n", tab[11]); } void decoup(char* array,connexion_t ***u) { int i = 0; int j = 0; for (; array[i]!='/'; i++); i++; for (; array[i] != '/'; i++, j++) (***u).mois[j]=array[i]; (***u).mois[j]='\0'; if(strcmp((***u).mois,"Jan")==0) { (***u).janv++; (***u).total++;} else if(strcmp((***u).mois,"Feb")==0) { (***u).feb++; (***u).total++;} else if(strcmp((***u).mois,"Mar")==0) { (***u).mar++; (***u).total++;} else if(strcmp((***u).mois,"Apr")==0) { (***u).avr++; (***u).total++;} else if(strcmp((***u).mois,"May")==0) { (***u).mai++; (***u).total++;} else if(strcmp((***u).mois,"Jun")==0) { (***u).juin++; (***u).total++;} else if(strcmp((***u).mois,"Jul")==0) { (***u).juil++; (***u).total++;} else if(strcmp((***u).mois,"Aug")==0) { (***u).aout++; (***u).total++;} else if(strcmp((***u).mois,"Sep")==0) { (***u).sep++; (***u).total++;} else if(strcmp((***u).mois,"Oct")==0) { (***u).oct++; (***u).total++;} else if(strcmp((***u).mois,"Nov")==0) { (***u).nov++; (***u).total++;} else if(strcmp((***u).mois,"Dec")==0) { (***u).dec++; (***u).total++;} } void stat(char *av[], connexion_t ***u){ float somme= (***u).total; int sommes= (int) somme; float p[12]; p[0]= (***u).janv; p[1]=(***u).feb; p[2]=(***u).mar; p[3]=(***u).avr; p[4]=(***u).mai; p[5]=(***u).juin; p[6]=(***u).juil; p[7]=(***u).aout; p[8]=(***u).sep; p[9]=(***u).oct; p[10]=(***u).nov; p[11]=(***u).dec; printf("%d\n",sommes); for (int y = 0; y < 13; ++y) { p[y] = (p[y]*100)/somme; } if (strcmp(av[1], "web") == 1) { strcmp(av[1], "web") == 0 ? versionweb(somme,p) : 0; } else{ strcmp(av[1], "-txt") == 0 ? versiontext(somme,p) : 0; strcmp(av[1], "-gr") == 0 ? versiongraphique(somme,p) : 0; } } void par(FILE *fd, char* av[], connexion_t** u) { char st[5000]; while (!feof(fd)){ fgets(st,5000,fd); decoup(st,&u); } stat(av,&u); } int ouv(char* av[],connexion_t* u) { FILE *fd; if ((fd = fopen("/var/log/apache2/access.log","r")) == NULL) { printf("aie"); return (84); } par(fd,av,&u); return (0); } int main(int ac, char* av[]) { if (ac==1){ av[1] = "web"; } connexion_t u; ouv(av,&u); return (0); }
2 réponses
'lut,
avant toute chose, lecture obligatoire concernant les exercices. Préciser une date limite dans le but de donner un sentiment d'urgence cause l'effet inverse sur CCM vu que ça montre juste un manque de travail/préparation de la part de celui qui pose la question.
Ensuite, ton message ne comporte aucune question, et "Problème de segmentation" ne veut rien dire sans contexte supplémentaire.
Il faut expliquer ce que tu cherches à faire, et dire où est-ce que ça pose problème précisément. S'il s'agit d'une erreur du compilateur ou à l'exécution, copies-la précisément dans ton message.
avant toute chose, lecture obligatoire concernant les exercices. Préciser une date limite dans le but de donner un sentiment d'urgence cause l'effet inverse sur CCM vu que ça montre juste un manque de travail/préparation de la part de celui qui pose la question.
Ensuite, ton message ne comporte aucune question, et "Problème de segmentation" ne veut rien dire sans contexte supplémentaire.
Il faut expliquer ce que tu cherches à faire, et dire où est-ce que ça pose problème précisément. S'il s'agit d'une erreur du compilateur ou à l'exécution, copies-la précisément dans ton message.
zamen92
Messages postés
2
Date d'inscription
Statut
Membre
Dernière intervention
Dans mon cas, J'ai seulement une information comme quoi il y a un problème de segmentation sinon mon make file fonctionne avec la partie texte et graphique de mon projet. Merci de me répondre le plus rapidement.
ElementW
Messages postés
4814
Date d'inscription
Statut
Contributeur
Dernière intervention
1 223
>
zamen92
Messages postés
2
Date d'inscription
Statut
Membre
Dernière intervention
Dans ce cas, lance ton programme dans un debugger (
). N'oublie pas de compiler avec l'option pour avoir les infos nécessaires lors du débogage.
Salut zamen92,
ElementW a raison ton message est un peu léger.
J'ajouterai que je n'ai pas lu ton code dans le détail, ni testé ton code, car on ne peut pas tester, en l'absence de données de test et en raison d'une dépendance à une bibliothèque graphique que tu sembles utiliser.
Pour que l'on puisse t'aider, et que tu puisses circonscrire ton problème, tu devrais poster un programme minimal autonome dans lequel ton problème se manifeste et que l'on puisse tester, indiquer ce qui se passe avec quelles données, ce qui devrait se passer selon toi, et pourquoi tu penses que tu as un bogue.
Voilà aussi deux remarques, qui peuvent te guider.
1.
Dans ton code, on voit que tu passes
- tu passes donc un pointeur à la fonction
- lorsque tu es dans la fonction
- si
Au bout de 3 passages, tu as gagné le grade de programmeur 3 étoiles.
Tu n'as pas besoin de rajouter un niveau d'indirection à chaque fois que tu passes un pointeur à une fonction. Tu ajoutes inutilement de la complexité et des chances de mauvaise gestion de ta mémoire (j'ignore si cela est à l'origine de ton bogue, peut-être gères-tu correctement toute cette complexité,... qui me parait cependant inutile).
2.
Je vais supposer que ton problème est que ton code plante avec un message indiquant une erreur de segmentation, et que tu travailles sous Linux, avec
Si tel est le cas, compile avec l'option
Si Valgrind n'est pas installé sur ta machine, installe le.
lance juste :
https://www.valgrind.org/docs/manual/quick-start.html
Dal
ElementW a raison ton message est un peu léger.
J'ajouterai que je n'ai pas lu ton code dans le détail, ni testé ton code, car on ne peut pas tester, en l'absence de données de test et en raison d'une dépendance à une bibliothèque graphique que tu sembles utiliser.
Pour que l'on puisse t'aider, et que tu puisses circonscrire ton problème, tu devrais poster un programme minimal autonome dans lequel ton problème se manifeste et que l'on puisse tester, indiquer ce qui se passe avec quelles données, ce qui devrait se passer selon toi, et pourquoi tu penses que tu as un bogue.
Voilà aussi deux remarques, qui peuvent te guider.
1.
Dans ton code, on voit que tu passes
u, qui est une
structmasquée dans un
typedef, la variable étant déclarée dans main avec
connexion_t u;. Cette
structest visiblement une structure de données où tu veux stocker des choses.
- tu passes donc un pointeur à la fonction
ouv(), qui a pour prototype
int ouv(char* av[],connexion_t* u)...
- lorsque tu es dans la fonction
ouv(),
uest désormais un pointeur sur la
struct, et ce pointeur est tout ce dont on a besoin pour modifier les valeurs de la struct
udans
ouv(), en utilisant la notation
u->janv = 1.0;par exemple
- si
ouv()doit passer ce
uà une autre fonction pour qu'elle puisse accéder aux valeurs de la
structet les modifier, elle peut juste passer
u, qui est déjà un pointeur, et cette autre fonction pourra faire
u->janv = 1.0;exactement de la même façon, etc. ... au lieu de ce que tu fais, qui consiste à passer
&uà chaque fonction dont l'exécution est encapsulée ...
Au bout de 3 passages, tu as gagné le grade de programmeur 3 étoiles.
Tu n'as pas besoin de rajouter un niveau d'indirection à chaque fois que tu passes un pointeur à une fonction. Tu ajoutes inutilement de la complexité et des chances de mauvaise gestion de ta mémoire (j'ignore si cela est à l'origine de ton bogue, peut-être gères-tu correctement toute cette complexité,... qui me parait cependant inutile).
2.
Je vais supposer que ton problème est que ton code plante avec un message indiquant une erreur de segmentation, et que tu travailles sous Linux, avec
gcc.
Si tel est le cas, compile avec l'option
-gpour compiler en incluant des informations de débogage, et exécute ton programme avec Valgrind, qui t'aidera à repérer le code responsable d'une mauvaise manipulation de la mémoire.
Si Valgrind n'est pas installé sur ta machine, installe le.
lance juste :
valgrind nomexecutabledans un premier temps, puis vois si tu as besoin d'options différentes de lancement de Valgrind.
https://www.valgrind.org/docs/manual/quick-start.html
Dal