[C]Que signifit cette erreur à la compilation
Fermé
Krilin
-
19 mai 2006 à 18:09
mamiemando Messages postés 33304 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 octobre 2024 - 22 mai 2006 à 20:09
mamiemando Messages postés 33304 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 octobre 2024 - 22 mai 2006 à 20:09
A voir également:
- [C]Que signifit cette erreur à la compilation
- Erreur 0x80070643 - Guide
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Guide
- Que signifie le point vert sur snap ✓ - Forum Snapchat
- Erreur 38 free ✓ - Forum Mobile
- Erreur 1001 outlook - Guide
17 réponses
arth
Messages postés
9374
Date d'inscription
mardi 27 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2016
1 291
19 mai 2006 à 19:53
19 mai 2006 à 19:53
Colle ton programme ici ce sera plus simple.
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; }
arth
Messages postés
9374
Date d'inscription
mardi 27 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2016
1 291
19 mai 2006 à 20:08
19 mai 2006 à 20:08
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.
mamiemando
Messages postés
33304
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
4 octobre 2024
7 794
19 mai 2006 à 21:10
19 mai 2006 à 21:10
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
mamiemando
Messages postés
33304
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
4 octobre 2024
7 794
19 mai 2006 à 21:43
19 mai 2006 à 21:43
Le message d'erreur s'il te plait... Essaye de mettre juste char sinon.
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
mamiemando
Messages postés
33304
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
4 octobre 2024
7 794
20 mai 2006 à 00:01
20 mai 2006 à 00:01
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
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 567
20 mai 2006 à 00:32
20 mai 2006 à 00:32
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
mamiemando
Messages postés
33304
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
4 octobre 2024
7 794
21 mai 2006 à 12:35
21 mai 2006 à 12:35
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
mamiemando
Messages postés
33304
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
4 octobre 2024
7 794
21 mai 2006 à 20:17
21 mai 2006 à 20:17
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; }
mamiemando
Messages postés
33304
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
4 octobre 2024
7 794
22 mai 2006 à 00:32
22 mai 2006 à 00:32
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; }
mamiemando
Messages postés
33304
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
4 octobre 2024
7 794
22 mai 2006 à 20:09
22 mai 2006 à 20:09
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