[C]Que signifit cette erreur à la compilation

Krilin -  
mamiemando Messages postés 33769 Date d'inscription   Statut Modérateur Dernière intervention   -
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   Statut Contributeur Dernière intervention   1 293
 
Colle ton programme ici ce sera plus simple.
0
Krilin
 
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   Statut Contributeur Dernière intervention   1 293
 
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 33769 Date d'inscription   Statut Modérateur Dernière intervention   7 879
 
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
Krilin
 
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 33769 Date d'inscription   Statut Modérateur Dernière intervention   7 879
 
Le message d'erreur s'il te plait... Essaye de mettre juste char sinon.
0
Krilin
 
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 33769 Date d'inscription   Statut Modérateur Dernière intervention   7 879
 
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   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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
Krilin
 
Bonjour,

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

Merci
0
mamiemando Messages postés 33769 Date d'inscription   Statut Modérateur Dernière intervention   7 879
 
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
Krilin
 
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 33769 Date d'inscription   Statut Modérateur Dernière intervention   7 879
 
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
Krilin
 
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 33769 Date d'inscription   Statut Modérateur Dernière intervention   7 879
 
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
Krilin
 
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 33769 Date d'inscription   Statut Modérateur Dernière intervention   7 879
 
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