Rechercher : dans
Par :

[programmer en C] - erreur de segmentation

Dernière réponse le 4 sep 2003 à 18:11:49 Guillaume, le 4 sep 2003 à 16:29:47 
 Signaler ce message aux modérateurs

Bonjour,

j'ai un petit pb d'erreur de segementation, et je ne voit pas d'ou ca peut venir...

int main(int argc, char **argv)
{
char j, c;
char *seq, *q, *sens, *protein, *phase_num;
FILE *f;
int i=0, flag=0;

////// vérification de l'entrée
if (argc!=4)
{
printf ("Entrez la sequence, le sens ('f' ou 'r') et la phase!!\n");
exit(EXIT_FAILURE);
}

////// ouverture du fichier en lecture
f=fopen(argv[1],"r");
if(f==NULL)
{
printf("Can't open %s\n",argv[1]);
exit(EXIT_FAILURE);
}


q = seq;
/* lecture du fichier et stockage des caracteres*/
while( fscanf( f, "%c" ,&j ) != EOF)
{
if ( j == '\n' && flag == 0)
{
flag = 1;
}
if ( flag == 1 && j != '\n' )
{
switch(j)
{
case 'A' : c = 'a'; break;
case 'T' : c = 't'; break;
case 'C' : c = 'c'; break;
case 'G' : c = 'g'; break;
case 'a' : c = 'a'; break;
case 't' : c = 't'; break;
case 'c' : c = 'c'; break;
case 'g' : c = 'g'; break;
}
*q++ = c;
*q='\0';
printf("char num %d\t ==> seq : %s\n",i,seq);
i++;
}
}
sens = argv[2];
phase_num = argv[3];
printf("seq : %s sens : %s phase : %s\n",seq, sens, phase_num);
return 1;
}

Si vou savez une idée, je sui spreneur, merci !!

G.

Meilleures réponses pour « [programmer en C] erreur de segmentation » dans :
[Langage C] C/C++ Erreur de segmentation Voir Qu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux...
Les inlines en C++ VoirSignification Exemple 1 Inline et headers Exemple 2 Signification Le mot-clé inline est utilisé en C++ et s'applique à une fonction. Il indique au compilateur que chaque appel à la fonction inline devra être remplacé par le corps de cette...

1

mirza, le 4 sep 2003 à 16:39:10

*q++ = c; // erreur car q n'a pas été alloué (par new en C++ ou malloc en C)

si tu veux lire des lignes completes du fichier utilise la fonction C
sscanf
elle lit une ligne d'un fichier dans une chaine de caractere C (qui doit avoir ete allouée (parfois plus grnde que prévue))

Répondre à mirza

2

guillaume, le 4 sep 2003 à 16:52:57

Merci de ta réponse !!

mais q est un pointeur, que j'ai défini par q=seq.
il a besoin d'etre alloué ?

Répondre à guillaume

3

guillaume, le 4 sep 2003 à 17:03:48

Ok, c bon ca marche !!

en fait j'ai alloué seq :
seq = malloc(10 000 000 );

j'ai mis un chiffre volontairement énorme, car la chaine que je veux lire peut contenir jusqu'a 10 000 000 caracteres.

serait-ce judicieux de réallouer la variable une fois que sa longueur est connue ?

du genre :

len = lenstr(seq);
new_seq = malloc(len);
free(seq);

Répondre à guillaume

4

Bob, le 4 sep 2003 à 17:08:56

Bizarre quand je compile ton code je n'ai aucun blème. Pour le coup du pointeur je pense pas que y a une erreur ptr=ptr ça parait logique mais j'ai pas pigé tu pointe sur quoi.

Répondre à Bob

6

mirza, le 4 sep 2003 à 17:19:12

Cours (rapide je suis au boulot ...) sur les pointeurs

char* str1 = NULL; // déclaration mais pas ALLOCATION

char* str2 = (char*) malloc(strlen("bonjour") + 1); // alloue la taille de bonjour + 1 caractère spécial '\0' qui est OBLIGATOIRE et qui indique la fin de la chaine

puis on fait (par exemple)
sprintf(str2, "%s\0", "bonjour");

c'est à dire recopie "bonjour" et '\0' sur str2

en fin de programme les chaines allouées par 'malloc' doivent zetre desallouées

if (str2!=NULL)
{
free(str2); // OBLIGATOIRE sinon l
str2 = NULL; // = NULL
}

Répondre à mirza

10

Bob, le 4 sep 2003 à 17:25:40

Merci mais je pense que je savais déjà tout ça ;-). Pourquoi caster à tout va un char *pt r= malloc(taille * sizeof(char)) passe bien et le char NULL n'est obligatoire que pour l'affichage donc pour le traitement de chaine on peut s'en passer. Si tu as d'autres remarques ...

Répondre à Bob

11

mirza, le 4 sep 2003 à 17:28:42

Le cast c'est pas sécurité car malloc rend du void* et pas du char*

concerant le = NULL
c'est pour t'assurer de ne pas "par oubli" plus tard dans le code utiliser ta chaine SANS l'avoir allouer et initialiser

du stykle

char* str;

printf("%s", str); // car ici TOUT peut arriver (plantage ou pas, affichage correct (par miracle) ou pas ...

Répondre à mirza

8

mirza, le 4 sep 2003 à 17:20:32

Cours (rapide je suis au boulot ...) sur les pointeurs

char* str1 = NULL; // déclaration mais pas ALLOCATION

char* str2 = (char*) malloc(strlen("bonjour") + 1); // alloue la taille de bonjour + 1 caractère spécial '\0' qui est OBLIGATOIRE et qui indique la fin de la chaine

puis on fait (par exemple)
sprintf(str2, "%s\0", "bonjour");

c'est à dire recopie "bonjour" et '\0' sur str2

en fin de programme les chaines allouées par 'malloc' doivent zetre desallouées

if (str2!=NULL)
{
free(str2); // OBLIGATOIRE sinon la mémoire devient toute pourrie (comme du gruyère avec des blocs non libérés)
str2 = NULL; // = NULL
}

Répondre à mirza

5

Bob, le 4 sep 2003 à 17:15:48

Y a le #include <stdio.h> k été bouffé je suppose ;-) .

Répondre à Bob

7

Guillaume, le 4 sep 2003 à 17:20:32

C bon, tout le prgrme fait ce j'attend de lui.
merci pour le coup de pouce.

Répondre à Guillaume

9

mirza, le 4 sep 2003 à 17:22:15

Char* str2 = str1; // CORRECT sur le peincipe MAIS dangereux

car

1) il ne faut PAS tenter de libérer le bloc 2 FOIS
c'est à dire ne pas faire free(str1) ET free(str2) => plantage

2) une modif sur str1 impact aussi str2
(en fait str1 et str2 désignent/pointent sur la MEME chaine)

pigé ?

Répondre à mirza

12

 guillaume, le 4 sep 2003 à 18:11:49

Oui, pigé.

et encore merci

Répondre à guillaume