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...
La compilation et les modules en C et en C++ VoirCet article a pour vocation d'introduire les notions de bases de la compilation en C et en C++ et de la programmation modulaire. Il permet de mieux comprendre les messages d'erreur du compilateur. Les notions abordées ici sont indépendantes du...
Compiler un programme en C avec Dev C++ sous Vista VoirIl est très probable que vous ayez des problèmes lors de la compilation d'une source C sous Vista avec Dev C++. Solution rapide de secours: le compilateur g++ Voici une astuce pour Dev-Cpp : Aller dans "Outils" -> "Options du compilateur" puis...
Caractéristiques du langage C VoirLe fichier source Le fichier source d'un programme écrit en langage C est un simple fichier texte dont l'extension est par convention .c. Note d'un visiteur (J.Grondin) : L'extension est en minuscules. Le .C (majuscule) est interprété par...
Gestion des erreurs et exceptions VoirGestion des erreurs et exceptions Les lignes de code que vous avez étudiées jusqu’à présent ne constituaient pas de vrais programmes mais des exemples. Elles ne comprenaient donc aucun traitement des erreurs. Les programmes que vous développerez...

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