Flux rss
Collection CommentÇaMarche.net
Rechercher : dans
Par :

[programmer en C] - erreur de segmentation

Guillaume, le jeudi 4 septembre 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.

1

mirza, le jeudi 4 septembre 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 jeudi 4 septembre 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 jeudi 4 septembre 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 jeudi 4 septembre 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 jeudi 4 septembre 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 jeudi 4 septembre 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 jeudi 4 septembre 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 jeudi 4 septembre 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 jeudi 4 septembre 2003 à 17:15:48

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

Répondre à Bob

7

Guillaume, le jeudi 4 septembre 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 jeudi 4 septembre 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 jeudi 4 septembre 2003 à 18:11:49

Oui, pigé.

et encore merci

Répondre à guillaume
Programme C (Sauvegarde des valeurs (Résolu) Bonjour, Voila j'aimerais creer un programme C quisauvegarderait toutes les valeurs entrées dans une table excel ou access... Quel est l'instruction qui le permet??? Je suis débutant. Merci d'avance www.commentcamarche.net/forum/affich-4622178-programme-c-sauvegarde-des-valeurs
[programme c] comment exécuter un programme c bonjour je suis un débutant sur linux et j aimerais savoir comment on peut exécuter un programme c après l avoir taper et compiler? Merci d avance à tous ceux ki m aideront dans mon apprentissage www.commentcamarche.net/forum/affich-2091609-programme-c-comment-executer-un-programme-c
[Langage C] C/C++ Erreur de segmentation 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... www.commentcamarche.net/faq/sujet-4791-langage-c-c-c-erreur-de-segmentation
La compilation et les modules en C et en C++Cet 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... www.commentcamarche.net/faq/sujet-14440-la-compilation-et-les-modules-en-c-et-en-c
[Programmation] Comment débuter, quel langage?Comment débuter, quel langage? Introduction Ceux que l'on peut utiliser Delphi/Pascal Java Python .Net Smalltalk Ceux que l'on peut utiliser à la rigueur C/C++ PHP Ada Lisp/Caml/... Ceux que l'on peut ne pas utiliser www.commentcamarche.net/faq/sujet-457-programmation-comment-debuter-quel-langage
Microsoft Visual C++ Runtime library (Résolu)Après avoir passé SPYBOT et ADAWARE, il m'est impossible d'ouvrir Outlook Express. J'ai le message suivant : Microsoft Visual C++ Runtime library Program : C:\Program Files\Outlook Express\msimm.exe this application has requested the Runtime to... www.commentcamarche.net/forum/affich-2663352-microsoft-visual-c-runtime-library
C\Windows\SMINST\BLService Visual C++ RuntimeBonjour, Une boite de dialogue s'affiche régulièrement Microsoft Visual C++ Runtime Library Dans cette fenêtre une X Runtime Error! Programme C:\Windows\SMINST\BLService.exe Et le message suivant en anglais que je ne comprends pas. « This application... www.commentcamarche.net/forum/affich-8320709-c-windows-sminst-blservice-visual-c-runtime
Introduction au langage CPetite histoire du C Le langage C a été mis au point par D.Ritchie et B.W.Kernighan au début des années 70. Leur but était de permettre de développer un langage qui permettrait d'obtenir un système d'exploitation de type UNIX portable. D.Ritchie... www.commentcamarche.net/contents/c/cintro.php3
Les pointeurs en langage CDéfinition d'un pointeur Un pointeur est une variable contenant l'adresse d'une autre variable d'un type donné. La notion de pointeur fait souvent peur car il s'agit d'une technique de programmation très puissante, permettant de définir des... www.commentcamarche.net/contents/c/cpoint.php3
Langage C - Les fonctionsLa notion de fonction On appelle fonction un sous-programme qui permet d'effectuer un ensemble d'instructions par simple appel de la fonction dans le corps du programme principal. Les fonctions permettent d'exécuter dans plusieurs parties du... www.commentcamarche.net/contents/c/cfonc.php3