Segmentation fault à cause d'un atoi

Résolu
anonyme8989 Messages postés 5 Date d'inscription   Statut Membre Dernière intervention   -  
anonyme8989 Messages postés 5 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

voilà une fonction que j'ai réalisée, lorsque je la teste j'ai un segmentation fault qui vient apparemment de la fonction entre les deux printf puisque le premier s'affiche quand j'exécute le test mais pas le deuxième. Quelqu'un aurait-il une idée de mon erreur?

Merci d'avance

void CALC_reconnaitreNombre(char* texte, unsigned int debut, float* resultat, unsigned int* fin, int* ok) {
char* chPartieEntiere;
char* chPartieDecimale;
int* partieEntiere=0;
int* partieDecimale=0;
int i;

CALC_reconnaitreSuiteChiffres(texte, debut, fin, ok);
if (*ok){
chPartieEntiere=malloc(sizeof(*chPartieEntiere) * (*fin-debut));
for (i=debut; i<=*fin-1; i++){
chPartieEntiere[i-debut] = texte[i];
}
printf("i avant %d %s \n", i, chPartieEntiere);
*partieEntiere=atoi(chPartieEntiere);
printf("i apres %d %c \n", i, chPartieEntiere[i-debut]);
debut=*fin+1;
CALC_reconnaitreVirgule(texte, debut, fin, ok);
if (*ok){
debut=*fin+1;
CALC_reconnaitreSuiteChiffres(texte, debut, fin, ok);
if (*ok){
chPartieDecimale=malloc(sizeof(*chPartieDecimale) * (*fin-debut+1));
for (i=debut; i<=*fin; i++)
chPartieDecimale[i-debut] = texte[i];
chPartieDecimale[i-debut] = '\0';
CALC_chaineEnNaturel(chPartieDecimale, partieDecimale, ok);
*resultat=*partieEntiere+(*partieDecimale)/CALC_xPuissanceN(10, strlen(chPartieDecimale));
debut=*fin;
}else
*resultat=*partieEntiere;
}

}
}

4 réponses

Baka__ Messages postés 40 Date d'inscription   Statut Membre Dernière intervention   14
 
Bonjour,

Désolé de ne pouvoir t'apporter mon aide, je ne maitrise absoument pas le c, je poste juste pour mettre en plus compréhensible (pense à utiliser la balise <c'ode c> ;)
void CALC_reconnaitreNombre(char* texte, unsigned int debut, float* resultat, unsigned int* fin, int* ok) {
 	char* chPartieEntiere;
 	char* chPartieDecimale;
 	int* partieEntiere=0;
 	int* partieDecimale=0;
 	int i;
 
 	CALC_reconnaitreSuiteChiffres(texte, debut, fin, ok);
 	if (*ok){
 	 	chPartieEntiere=malloc(sizeof(*chPartieEntiere) * (*fin-debut));
 	 	for (i=debut; i<=*fin-1; i++){
 	 		 chPartieEntiere[i-debut] = texte[i];
 	}
 	printf("i avant %d %s \n", i, chPartieEntiere);
 	*partieEntiere=atoi(chPartieEntiere);
 	printf("i apres %d %c \n", i, chPartieEntiere[i-debut]);
 	debut=*fin+1;
 	CALC_reconnaitreVirgule(texte, debut, fin, ok);
 	if (*ok){
 		 debut=*fin+1;
 		 CALC_reconnaitreSuiteChiffres(texte, debut, fin, ok);
  		if (*ok){
   			chPartieDecimale=malloc(sizeof(*chPartieDecimale) * (*fin-debut+1));
   			for (i=debut; i<=*fin; i++)
   				 chPartieDecimale[i-debut] = texte[i];
   			chPartieDecimale[i-debut] = '\0';
  			 CALC_chaineEnNaturel(chPartieDecimale, partieDecimale, ok);
  			 *resultat=*partieEntiere+(*partieDecimale)/CALC_xPuissanceN(10, strlen(chPartieDecimale));
   			debut=*fin;
  		}else
  			 *resultat=*partieEntiere;
 		 }
 
	 }
 }
0
anonyme8989 Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
Merci, c'est la première fois que je pose une question, je ne savais pas ! :)
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Bonjour,

Pour info, atoi() est obsolète. Il vaut mieux utiliser strtol().
Sinon, il faudrait que tu nous dises aussi comment tu appelles la fonction et comment sont initialisées les arguments.

Note : n'oublie pas d'utiliser la balise <code c>.
Exemple :
<code c>ici tu mets ton code</code>

Cdlt,
0
anonyme8989 Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour, je viens d'essayer avec strtol j'ai également une erreur de segmentation. Mes argruments sont texte="123", debut=0, resultat n'a pas de valeur, fin non plus et quand j'appelle la premère fonction *fin=3, *ok=1.
0
Utilisateur anonyme
 
Bonjour

atoi ou strtol, ton pointeur partieEntiere est initialisé à 0. Donc *partieEntiere t'envoie dans le décor, il faudrait l'initialiser par exemple comme tu l'as fait pour chPartieEntiere.
D'ailleurs, n'est-ce pas par erreur que tu utilises un pointeur pour cette variable ? Un simple int aurait suffi, je pense.
0
anonyme8989 Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,
J'ai modifié mon programme en tenant compte de vos conseils et je n'ai plus de segmentation fault, merci beaucoup !!!!!!!!
Bon dimanche !
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Bonjour,

Alors, effectivement, il y a le problème remonté par Le Père, mais pas que.
Tu as mis :
        if (*ok){
 	 	chPartieEntiere=malloc(sizeof(*chPartieEntiere) * (*fin-debut));
 	 	for (i=debut; i<=*fin-1; i++){
 	 		 chPartieEntiere[i-debut] = texte[i];
 	}

Deux remarques :
1/ L'indentation laisse penser que l'accolade fermante '}' est pour fermer le if alors qu'elle ferme le for. Du coup, je te conseille de bien vérifier tes accolades pour éviter des problèmes d'algorithmes futurs.

2/ chPartieEntiere contiendra la chaîne correspondant au nombre mais sans le '\0' qui est essentiel au bon fonctionnement de atoi(). Si tu ne le mets pas, cela peut fonctionner de manière aléatoire puisque dépendante de l'état du heap.

Note : je n'avais pas dit qu'avec strtol(), ça fonctionnerait. Juste que atoi() n'est plus à utiliser et qu'il faut utiliser strtol() en place. Mais bien sûr il faut tenir compte des autres problèmes ;-).

Cdlt,
0
anonyme8989 Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
Merci de votre aide, j'ai réussi à passer mon test :)

Bonne fin de journée
0