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 -
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;
}
}
}
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;
}
}
}
A voir également:
- Atoi segmentation fault
- Erreur de segmentation c ✓ - Forum C++
- Zsh: segmentation fault ✓ - Forum Programmation
- Zsh segmentation fault ✓ - Forum Assembleur
- Scanf segmentation fault ✓ - Forum Programmation
- Segmentation fault(core dumped ) avec gmp ✓ - Forum C
4 réponses
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; } } }
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 ! :)
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,
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.
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,