Les Allergies
Alimentaires
Posez votre question Signaler

[programmer en C] - erreur de segmentation

Guillaume - Dernière réponse le 4 sept. 2003 à 18:11
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.
Lire la suite 

[programmer en C] - erreur de segmentation »

12 réponses
Réponse
+0
moins plus
*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))
Ajouter un commentaire
Réponse
+0
moins plus
merci de ta réponse !!

mais q est un pointeur, que j'ai défini par q=seq.
il a besoin d'etre alloué ?
Ajouter un commentaire
Réponse
+0
moins plus
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);
Ajouter un commentaire
Réponse
+0
moins plus
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.
Bob - 4 sept. 2003 à 17:25
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 ...
mirza - 4 sept. 2003 à 17:28
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 ...
mirza - 4 sept. 2003 à 17:20
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
}
Ajouter un commentaire
Réponse
+0
moins plus
Y a le #include <stdio.h> k été bouffé je suppose ;-) .
Ajouter un commentaire
Réponse
+0
moins plus
c bon, tout le prgrme fait ce j'attend de lui.
merci pour le coup de pouce.
mirza - 4 sept. 2003 à 17:22
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é ?
guillaume - 4 sept. 2003 à 18:11
oui, pigé.

et encore merci
Ajouter un commentaire
Ce document intitulé « [programmer en C] - erreur de segmentation » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?