Segmentation fault à cause d'un atoi
Résolu
anonyme8989
Messages postés
5
Statut
Membre
-
anonyme8989 Messages postés 5 Statut Membre -
anonyme8989 Messages postés 5 Statut Membre -
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;
}
}
}
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
Statut
Membre
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,