Segmentation fault à cause d'un atoi

Résolu/Fermé
anonyme8989 Messages postés 5 Date d'inscription dimanche 11 janvier 2015 Statut Membre Dernière intervention 11 janvier 2015 - 11 janv. 2015 à 01:07
anonyme8989 Messages postés 5 Date d'inscription dimanche 11 janvier 2015 Statut Membre Dernière intervention 11 janvier 2015 - 11 janv. 2015 à 16:42
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 38 Date d'inscription mercredi 17 décembre 2014 Statut Membre Dernière intervention 1 juin 2015 14
Modifié par Baka__ le 11/01/2015 à 01:47
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 dimanche 11 janvier 2015 Statut Membre Dernière intervention 11 janvier 2015
Modifié par anonyme8989 le 11/01/2015 à 11:31
Merci, c'est la première fois que je pose une question, je ne savais pas ! :)
0
fiddy Messages postés 11067 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 812
11 janv. 2015 à 11:06
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 dimanche 11 janvier 2015 Statut Membre Dernière intervention 11 janvier 2015
11 janv. 2015 à 11:37
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
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 dimanche 11 janvier 2015 Statut Membre Dernière intervention 11 janvier 2015
11 janv. 2015 à 12:56
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 11067 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 812
11 janv. 2015 à 13:04
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 dimanche 11 janvier 2015 Statut Membre Dernière intervention 11 janvier 2015
11 janv. 2015 à 16:42
Merci de votre aide, j'ai réussi à passer mon test :)

Bonne fin de journée
0