A voir également:
- [C]Que signifit cette erreur à la compilation
- Erreur 0x80070643 - Accueil - Windows
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
- Erreur 4101 france tv - Forum Lecteurs et supports vidéo
- J'aime par erreur facebook notification - Forum Facebook
- Code erreur f3500-31 ✓ - Forum Bbox Bouygues
17 réponses
Salut,
voici ce que j'obtiens à la compilation
La ligne 10 est celle que j'ai mis en gras.
Je voudrais également savoir si mon programme est bien écrit et à quel moment, il me faut faire des free pour libérer la mémoire.
Merci
voici ce que j'obtiens à la compilation
parse_trace.c:10: erreur: stray ‘\160’ in program parse_trace.c:10: erreur: stray ‘\160’ in program
La ligne 10 est celle que j'ai mis en gras.
Je voudrais également savoir si mon programme est bien écrit et à quel moment, il me faut faire des free pour libérer la mémoire.
Merci
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #define F "fichier" typedef struct{ u_char ip[4]; }t_ip; typedef struct{ t_ip *tabIP;// Tableau des IP size_t nbIP;// Nb d'IP size_t sizeIP;// Taille allouée à "tabIP" }t_route; static void purge(FILE *fp) { int c; while ((c = fgetc(fp)) != '\n' && c != EOF) { } } static void clean (char *s, FILE *fp) { char *p = strchr (s, '\n'); if (p != NULL) { *p = 0; } else { purge (fp); } } int main() { FILE *fp = fopen(F, "r"); int **tab; int i=0; t_route trace; trace.tabIP = NULL; trace.nbIP = 0; trace.sizeIP = 0; int j = 0; /*trace = malloc(size * sizeof(Adresse_ip)); if(tab_ip == NULL){ perror("erreur allocation"); exit(1); }*/ if (fp != NULL) { char line[BUFSIZ]; while (fgets(line, sizeof line, fp) != NULL) { clean(line, fp); char *p = strtok(line, " "); if (p != NULL) { p = strtok(NULL, " "); if (p != NULL) { if(trace.nbIP == trace.sizeIP) { trace.sizeIP += 1; trace.tabIP = realloc(trace.tabIP, (trace.sizeIP) * sizeof(*trace.tabIP)); if (trace.tabIP == NULL) { perror("erreur allocation"); exit(1); } } char ip[4]; sscanf(p, "%d.%d.%d.%d", ip, ip + 1, ip + 2, ip + 3); trace.tabIP[trace.nbIP].ip[0] = ip[0]; trace.tabIP[trace.nbIP].ip[1] = ip[1]; trace.tabIP[trace.nbIP].ip[2] = ip[2]; trace.tabIP[trace.nbIP].ip[3] = ip[3]; trace.nbIP++; } else { printf ("format error\n"); break; } } else { printf ("format error\n"); break; } } fclose (fp), fp = NULL; } else { perror (F); } for(j=0; j<trace.sizeIP; j++) { printf("%d.%d.%d.%d ",trace.tabIP[j].ip[0],trace.tabIP[j].ip[1], trace.tabIP[j].ip[2],trace.tabIP[j].ip[3]); printf("\n"); } return 0; }
le u_char est apparement pas un type qui existe toujours est til que mon compilo l'aime pas.
la de suite j'ai pas trop le temps de regarder mais je fais ca ce soir en rentrant.
la de suite j'ai pas trop le temps de regarder mais je fais ca ce soir en rentrant.
Je pense que c'est plutôt uchar, non ? Tu peux aussi écrire unsigned char ou encore définir un type personnalisé :
Bonne chance
typedef unsigned char u_char;
Bonne chance
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Même avec uniquement char ip[4], j'obtiens ce message:
parse_trace.c:10: erreur: stray ‘\160’ in program parse_trace.c:10: erreur: stray ‘\160’ in program
Zut je suis pas sous linux mais en fait je commence a me demander si tu n'as pas des caractères foireux, typiquement ce qui arrive quand tu compiles un fichier windowsien sous linux... En général on s'en sort avec un dos2unix... Mais si ça se trouve ça n'a rien à voir....
Bonne chance
dos2unix lefichier
Bonne chance
Salut,
je ne me suis pas posé la question concernant ton code mais j'ai essayé de le compile sur un FC4 et voilà le résultat de la compilation
je ne me suis pas posé la question concernant ton code mais j'ai essayé de le compile sur un FC4 et voilà le résultat de la compilation
[lamitest@localhost trash]$ uname -a Linux localhost 2.6.16-1.2108_FC4 #1 Thu May 4 23:52:01 EDT 2006 i686 athlon i386 GNU/Linux [lamitest@localhost trash]$ gcc --version gcc (GCC) 4.0.2 20051125 (Red Hat 4.0.2-8) Copyright © 2005 Free Software Foundation, Inc. Ce logiciel est libre; voir les sources pour les conditions de copie. Il n'y a PAS GARANTIE; ni implicite pour le MARCHANDAGE ou pour un BUT PARTICULIER. [lamitest@localhost trash]$ gcc -o krilin krilin.c [lamitest@localhost trash]$ file krilin krilin: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped [lamitest@localhost trash]$lami20j
Tu es sous linux ? Si oui as tu fais un dos2unix sur chacun de tes fichiers ?
Car si ton fichier est écrit en mode dos, tu as parfois ce genre d'erreur...
Bonne chance
dos2unix *cpp
Car si ton fichier est écrit en mode dos, tu as parfois ce genre d'erreur...
Bonne chance
Salut,
alors j'ai effacé la structure qui me causait une erreur et je l'ai réécrite, le problème a disparu.
Maintenant j'obtiens une erreur de segmentation à l'execution.
ESt-ce que quelqu'un voit dans mon code ou ça pourrait causer cette erreur ?
Merci
alors j'ai effacé la structure qui me causait une erreur et je l'ai réécrite, le problème a disparu.
Maintenant j'obtiens une erreur de segmentation à l'execution.
ESt-ce que quelqu'un voit dans mon code ou ça pourrait causer cette erreur ?
Merci
Si le problème s'est résolu après réecriture, c'était probablement dû comme je le soupçonnais à des caractères bizarres (invisibles dans ton éditeur) qui faisait planter le compilateur.
Si tu utilises gcc, compile avec l'option -g, et lance gdb :
Une fois dans gdb, lance le programme pour le faire planter, et affiche la pile d'exécution :
puis copie-colle le résultat ici. Tu auras la ligne exacte du plantage.
Si tu ne t'en sors pas, essaye avec un autre debugger (par exemple ddd est un debugger graphique peut être plus intuitif que gdb). Pense à nous donner la dernière version du code (à moins qu'elle n'ait pas évolué depuis le post <2>)
Bonne chance
Si tu utilises gcc, compile avec l'option -g, et lance gdb :
gcc -W -Wall -g -o plop.exe plop.c gdb plop.exe
Une fois dans gdb, lance le programme pour le faire planter, et affiche la pile d'exécution :
r bt
puis copie-colle le résultat ici. Tu auras la ligne exacte du plantage.
Si tu ne t'en sors pas, essaye avec un autre debugger (par exemple ddd est un debugger graphique peut être plus intuitif que gdb). Pense à nous donner la dernière version du code (à moins qu'elle n'ait pas évolué depuis le post <2>)
Bonne chance
Salut,
j'obtiens ceci :
Avec le programme suivant :
j'obtiens ceci :
Program received signal SIGSEGV, Segmentation fault. 0x080487b3 in main () at parse_trace.c:67 67 trace.tabIP[trace.nbIP].ip[0] = ip[0];
Avec le programme suivant :
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #define F "fichier" typedef struct{ unsigned char ip[4]; }t_ip; typedef struct{ t_ip *tabIP; size_t nbIP; size_t sizeIP; }t_route; static void purge(FILE *fp){ int c; while((c = fgetc(fp)) != '\n' && c != EOF){} } static void clean(char *s, FILE *fp){ char *p = strchr(s, '\n'); if(p != NULL){ *p = 0; } else{ purge(fp); } } int main(){ FILE *fp = fopen(F, "r"); t_route trace; trace.tabIP = NULL; trace.nbIP = 0; trace.sizeIP = 0; int j = 0; if (fp != NULL) { char line[BUFSIZ]; while (fgets(line, sizeof line, fp) != NULL) { clean(line, fp);char *p = strtok(line, " "); if (p != NULL) { p = strtok(NULL, " "); if (p != NULL) { if(trace.nbIP == trace.sizeIP) { trace.sizeIP += 1; trace.tabIP = realloc(trace.tabIP, (trace.sizeIP) * sizeof(*trace.tabIP)); if (trace.tabIP == NULL) { perror("erreur allocation"); exit(1); } } char ip[4]; sscanf(p, "%d.%d.%d.%d", ip, ip + 1, ip + 2, ip + 3); trace.tabIP[trace.nbIP].ip[0] = ip[0]; trace.tabIP[trace.nbIP].ip[1] = ip[1]; trace.tabIP[trace.nbIP].ip[2] = ip[2]; trace.tabIP[trace.nbIP].ip[3] = ip[3]; trace.nbIP++; } else { printf ("format error\n"); break; } } else { printf ("format error\n"); break; } } fclose (fp), fp = NULL; } else { perror (F); } for(j=0; j<trace.sizeIP; j++) { printf("%d.%d.%d.%d ",trace.tabIP[j].ip[0],trace.tabIP[j].ip[1], trace.tabIP[j].ip[2],trace.tabIP[j].ip[3]); printf("\n"); } return 0; }
Ah oui en effet ça m'etonne pas que ça fasse segfault, car tu n'as jamais alloué de zone mémoire pour l'adresse tabIP
Il faut un moment allouer la zone de tabIP avec un malloc ou un calloc, car sinon le
Pour faire le travail proprement, pense à libérer cette zone quand elle ne sera plus utilisée avec la fonction free
Bonne chance
typedef struct{ t_ip *tabIP; size_t nbIP; size_t sizeIP; }t_route;
Il faut un moment allouer la zone de tabIP avec un malloc ou un calloc, car sinon le
trace.tabIP[trace.nbIP]déclenchera une erreur de segmentation.
Pour faire le travail proprement, pense à libérer cette zone quand elle ne sera plus utilisée avec la fonction free
//Allocation de n cases d'élements de type plop plop *p=(plop *)malloc(sizeof(plop)*n); //Libération de cette plage mémoire free(plop);
Bonne chance
Salut,
j'ai rajouté l'allocation du tableau mais l'erreur de segmentation persiste.
j'ai rajouté l'allocation du tableau mais l'erreur de segmentation persiste.
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #define F "fichier" typedef struct{ unsigned char ip[4]; }t_ip; typedef struct{ t_ip *tabIP; size_t nbIP; size_t sizeIP; }t_route; static void purge(FILE *fp){ int c; while((c = fgetc(fp)) != '\n' && c != EOF){} } static void clean(char *s, FILE *fp){ char *p = strchr(s, '\n'); if(p != NULL){ *p = 0; } else{ purge(fp); } } int main(){ FILE *fp = fopen(F, "r"); t_route trace; trace.nbIP = 0; trace.sizeIP = 1; size_t j; trace.tabIP = (t_ip *)malloc(sizeof(t_ip) * (trace.sizeIP)); if(trace.tabIP == NULL) { perror("erreur allocation\n"); exit(1); } if (fp != NULL) { char line[BUFSIZ]; while (fgets(line, sizeof line, fp) != NULL) { clean(line, fp);char *p = strtok(line, " "); if (p != NULL) { p = strtok(NULL, " "); if (p != NULL) { if(trace.nbIP == trace.sizeIP) { trace.sizeIP *= 2; trace.tabIP = realloc(trace.tabIP, (trace.sizeIP) * sizeof(*trace.tabIP)); if (trace.tabIP == NULL) { perror("erreur allocation\n"); exit(1); } } char ip[4]; sscanf(p, "%d.%d.%d.%d", ip, ip + 1, ip + 2, ip + 3); trace.tabIP[trace.nbIP].ip[0] = ip[0]; trace.tabIP[trace.nbIP].ip[1] = ip[1]; trace.tabIP[trace.nbIP].ip[2] = ip[2]; trace.tabIP[trace.nbIP].ip[3] = ip[3]; trace.nbIP++; } else { printf ("format error\n"); break; } } else { printf ("format error\n"); break; } } fclose (fp), fp = NULL; } else { perror (F); } for(j=0; j<trace.nbIP; j++) { printf("%d.%d.%d.%d ",trace.tabIP[j].ip[0],trace.tabIP[j].ip[1], trace.tabIP[j].ip[2],trace.tabIP[j].ip[3]); printf("\n"); } free(trace.tabIP); return 0; }
La ligne que tu a écrite avec le malloc n'alloue qu'une seule case de taille pouvant accueillir une adresse ip.
Si j'ai bien compris ce que tu fais ce tableau devrait reserver "trace.nbIP" cases. De plus le fais d'incrémenter cette valeur ne corrige pas la plage allouée, qui ne pourra accueillir toujours qu'une seule ip. Le mieux serait d'utiliser une liste qui stockerait chacune des ip, car on ne connaît pas la longueur du chemin a priori.
Pour l'implémentation de la liste ut peux jeter un oeil ici :
https://forums.commentcamarche.net/forum/affich-2242401-c-arbre-n-aire
Je n'ai pas testé le prgramme mais ca te donne une idée de comment faire...
Bonne chance
Si j'ai bien compris ce que tu fais ce tableau devrait reserver "trace.nbIP" cases. De plus le fais d'incrémenter cette valeur ne corrige pas la plage allouée, qui ne pourra accueillir toujours qu'une seule ip. Le mieux serait d'utiliser une liste qui stockerait chacune des ip, car on ne connaît pas la longueur du chemin a priori.
Pour l'implémentation de la liste ut peux jeter un oeil ici :
https://forums.commentcamarche.net/forum/affich-2242401-c-arbre-n-aire
Je n'ai pas testé le prgramme mais ca te donne une idée de comment faire...
Bonne chance