Problème de segmentation

Fermé
zamen92 Messages postés 2 Date d'inscription mardi 26 mars 2019 Statut Membre Dernière intervention 26 mars 2019 - Modifié le 26 mars 2019 à 14:05
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 26 mars 2019 à 16:36
Bonjour,

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

ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
26 mars 2019 à 14:17
'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.
0
zamen92 Messages postés 2 Date d'inscription mardi 26 mars 2019 Statut Membre Dernière intervention 26 mars 2019
26 mars 2019 à 16:22
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.
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225 > zamen92 Messages postés 2 Date d'inscription mardi 26 mars 2019 Statut Membre Dernière intervention 26 mars 2019
Modifié le 26 mars 2019 à 16:31
Dans ce cas, lance ton programme dans un debugger (
gdb
). N'oublie pas de compiler avec l'option
-g
pour avoir les infos nécessaires lors du débogage.
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 26 mars 2019 à 16:39
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
u
, qui est une
struct
masquée dans un
typedef
, la variable étant déclarée dans main avec
connexion_t u;
. Cette
struct
est 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()
,
u
est désormais un pointeur sur la
struct
, et ce pointeur est tout ce dont on a besoin pour modifier les valeurs de la struct
u
dans
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
struct
et 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
-g
pour 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 nomexecutable
dans 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
0