[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
Bonjour,

à la compilation d'un programme, j'ai obtenu ce message d'erreur:

erreur: stray ‘\160’ in program


Qu'est-ce que ça signifit ?

Merci

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
Colle ton programme ici ce sera plus simple.
0
Salut,

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;
}

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
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.
0
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
Je pense que c'est plutôt uchar, non ? Tu peux aussi écrire unsigned char ou encore définir un type personnalisé :
typedef unsigned char u_char;


Bonne chance
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Salut,

j'ai essayé les 2 façons que tu proposes mais il y a toujours le même message d'erreur
0
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
Le message d'erreur s'il te plait... Essaye de mettre juste char sinon.
0
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
0
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
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....
dos2unix lefichier

Bonne chance
0
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
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

[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
0
Bonjour,

est-ce que quelqu'un a une idée car l'erreur persiste?

Merci
0
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
Tu es sous linux ? Si oui as tu fais un dos2unix sur chacun de tes fichiers ?
dos2unix *cpp

Car si ton fichier est écrit en mode dos, tu as parfois ce genre d'erreur...

Bonne chance
0
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
0
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
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 :
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
0
Salut,

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;
}
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
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
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
0
Salut,

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;
}
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
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
0