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
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
A voir également:
- Atoi segmentation fault
- Erreur de segmentation - Forum C
- Scanf segmentation fault ✓ - Forum Programmation
- Erreur de segmentation c ✓ - Forum C++
- Zsh: segmentation fault ✓ - Forum Programmation
- Zsh segmentation fault ✓ - Forum Assembleur
4 réponses
Baka__
Messages postés
40
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
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> ;)
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; } } }
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
11 janv. 2015 à 11:06
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,
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,
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
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.
Utilisateur anonyme
Modifié par le père. le 11/01/2015 à 12:28
Modifié par le père. le 11/01/2015 à 12:28
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.
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.
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
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 !
J'ai modifié mon programme en tenant compte de vos conseils et je n'ai plus de segmentation fault, merci beaucoup !!!!!!!!
Bon dimanche !
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
11 janv. 2015 à 13:04
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 :
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,
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,
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
11 janv. 2015 à 16:42
Merci de votre aide, j'ai réussi à passer mon test :)
Bonne fin de journée
Bonne fin de journée
Modifié par anonyme8989 le 11/01/2015 à 11:31