Calcul de polynôme en c: problème avec math.h
Résolu
empirekro
Messages postés
31
Date d'inscription
Statut
Membre
Dernière intervention
-
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
énoncé :
on a un tableaux coef[] et un entier abscisse. Il faut calculer l'ordonnée ordonnee correspondant à abscisse, en considérant le fait que, si on écrit le polynôme sous la forme P = a_0 + a_1*X + ... + a_n*X^n on a a_0 = coef[0], ... , a_n = coef[n].
Mon code donne donc
gcc me sort
en cherchant un peu, j'ai essayé de changer le type de "abscisse" comme suit
Mais rien à faire. En recherchant sur la deuxième ligne d'erreur, je me suis intéressé de plus près à "math.h". Pour définir "pow", ce fichier fait appel à "/usr/bits/mathcall".
Mais voilà : chez moi, "/usr/bits" n'existe pas.
en faisant un
j'ai trouvé ledit fichier dans /usr/include/i386-linux-gnu/bits/mathcalls.h .
Quelqu'un pourrait-il m'indiquer comment dire à mon éditeur de lien où aller chercher ce fichier?
merci.
énoncé :
on a un tableaux coef[] et un entier abscisse. Il faut calculer l'ordonnée ordonnee correspondant à abscisse, en considérant le fait que, si on écrit le polynôme sous la forme P = a_0 + a_1*X + ... + a_n*X^n on a a_0 = coef[0], ... , a_n = coef[n].
Mon code donne donc
/*on initialise ordonnee à a_0)*/Mais en compilant -- je tape :
for(j=1;j<n+1;j++)
{
ordonnee = ordonnee + coef[j]*pow(abscisse,j);
}
gcc -lm monFichier.c -o monFichier
gcc me sort
/tmp/*un truc bizarre*/.o: In function 'main':
monFichier.c:(.text+02xfa):undefined reference to 'pow'
collect2: ld a retourné 1 code d'état d'exécution
en cherchant un peu, j'ai essayé de changer le type de "abscisse" comme suit
(double) abscisse
Mais rien à faire. En recherchant sur la deuxième ligne d'erreur, je me suis intéressé de plus près à "math.h". Pour définir "pow", ce fichier fait appel à "/usr/bits/mathcall".
Mais voilà : chez moi, "/usr/bits" n'existe pas.
en faisant un
find /usr -name '*mathcall*'
j'ai trouvé ledit fichier dans /usr/include/i386-linux-gnu/bits/mathcalls.h .
Quelqu'un pourrait-il m'indiquer comment dire à mon éditeur de lien où aller chercher ce fichier?
merci.
A voir également:
- Calcul de polynôme en c: problème avec math.h
- Calcul moyenne excel - Guide
- Calcul km marche à pied gratuit - Télécharger - Sport
- Calcul charpente bois gratuit - Télécharger - Architecture & Déco
- Logiciel gratuit calcul valeur nutritionnelle - Télécharger - Santé & Bien-être
- Logiciel gratuit calcul surface m2 - Télécharger - Outils professionnels
5 réponses
Salut.
Déjà, en compilation, il y a plusieurs étape : préprocesseur, compilation, édition des liens.
Vu le message que tu mets, les deux première étapes se sont bien passées. Ce qui veux dire que le compilateur a trouvé tout les fichiers ".h" dont il avait besoin et qu'il a tout compiler. Le problème, c'est à l'édition des liens, il n'arrive pas à trouver la fonction.
Les erreurs courrantes dans ce genre de cas, c'est : oublie de l'inclusion de math.h dans le source (mais ça ne semble pas être ton cas), oublie de la liaison avec la bibliothèque mathématique (mais tu mets bien -lm), ou absence de la bibliothèque mathématique.
Je te propose deux test : essai de mettre "-lm" à la fin de la ligne de compilation.
essai de trouver "libm.a" et passe le fichier en argument de "nm". nm te liste tout les symboles présents dans libm.a, tu devrais y trouver pow.
Pour mathcall, c'est peut être que ton gcc est mal installé.
Il est souvent vain de réécrire les fonction système, elles ont été optimisées et debugué depuis de nombreuses années, tu ne réussira qu'à faire moins bien, ou éventuellement plus restrictif.
Déjà, en compilation, il y a plusieurs étape : préprocesseur, compilation, édition des liens.
Vu le message que tu mets, les deux première étapes se sont bien passées. Ce qui veux dire que le compilateur a trouvé tout les fichiers ".h" dont il avait besoin et qu'il a tout compiler. Le problème, c'est à l'édition des liens, il n'arrive pas à trouver la fonction.
Les erreurs courrantes dans ce genre de cas, c'est : oublie de l'inclusion de math.h dans le source (mais ça ne semble pas être ton cas), oublie de la liaison avec la bibliothèque mathématique (mais tu mets bien -lm), ou absence de la bibliothèque mathématique.
Je te propose deux test : essai de mettre "-lm" à la fin de la ligne de compilation.
essai de trouver "libm.a" et passe le fichier en argument de "nm". nm te liste tout les symboles présents dans libm.a, tu devrais y trouver pow.
Pour mathcall, c'est peut être que ton gcc est mal installé.
Il est souvent vain de réécrire les fonction système, elles ont été optimisées et debugué depuis de nombreuses années, tu ne réussira qu'à faire moins bien, ou éventuellement plus restrictif.
Utilises ce code à la place de pow
int my_pow(int n, int p)
{
int i = 1;
int res = 1;
while (i <= p)
{
res = res * n;
i++;
}
return (res);
}
C'est une version maison, tu fais
my_pow(5, 2); ca te renvoie 25
Faire ses propres fonctions soit même c'est toujours plus classe que d'utiliser les fonctions systèmes.
Par ailleurs sache que nous ne sommes pas la pour te faire tes exercices.
int my_pow(int n, int p)
{
int i = 1;
int res = 1;
while (i <= p)
{
res = res * n;
i++;
}
return (res);
}
C'est une version maison, tu fais
my_pow(5, 2); ca te renvoie 25
Faire ses propres fonctions soit même c'est toujours plus classe que d'utiliser les fonctions systèmes.
Par ailleurs sache que nous ne sommes pas la pour te faire tes exercices.
ça a l'air d'être accepté. Merci!
Par ailleurs, sachez que je n'ai aucunement demandé une solution à mon exercice, mais simplement une aide dans le cadre d'un problème de lien au moment de la compilation.
Par ailleurs, sachez que je n'ai aucunement demandé une solution à mon exercice, mais simplement une aide dans le cadre d'un problème de lien au moment de la compilation.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
En fait c'est pas exactement a rendre à un prof. C'est juste pour bien intégrer une théorie mathématique.
La solution a finalement été trouvée comme étant celle de Char Snipeur : il fallait mettre le -lm à la fin.
Quelqu'un pourrait me dire pourquoi?
En tout cas merci à ceux qui ont bien voulu jeter un coup d'oeil à mon problème!
La solution a finalement été trouvée comme étant celle de Char Snipeur : il fallait mettre le -lm à la fin.
Quelqu'un pourrait me dire pourquoi?
En tout cas merci à ceux qui ont bien voulu jeter un coup d'oeil à mon problème!
Je n'ai jamais bien compris pourquoi. J'ai l'impression que le compilateur "oublie" ce qu'il y avait dans le bibliothèques avant, donc en arrivant sur ton .o, il voit un "pow" mais comme il n'y a plus rien après, il dit qu'il ne trouve pas. Ce n'est que mon interprétation, il est possible qu'il y ait d'autres raison. En tout cas, dans le projet sur lequel je travail, nous avions plusieurs bibliothèques dépendantes les unes des autres, du coup, il fallait les mettre dans un ordre bien particulier et les mettre plusieurs fois.
il fallait mettre le -lm à la fin. Quelqu'un pourrait me dire pourquoi?
Lorsque tu utilises une fonction présente dans un autre fichier (dans un .c, ou dans une bibliothèque (libmath), tu as besoin d'indiquer au compilateur son prototype (inclusion d'un header .h). Mais cela ne suffit pas puisque lors de la compilation, il va rechercher le code de chacune des fonctions (édition des liens) qu'il ne trouvera pas si rien ne lui est indiqué. D'où la présence du -lm (pour libmath). Dès qu'on utilise une bibliothèque (hormis la libC bien sûr), il faut la linker.
Cdlt,
Lorsque tu utilises une fonction présente dans un autre fichier (dans un .c, ou dans une bibliothèque (libmath), tu as besoin d'indiquer au compilateur son prototype (inclusion d'un header .h). Mais cela ne suffit pas puisque lors de la compilation, il va rechercher le code de chacune des fonctions (édition des liens) qu'il ne trouvera pas si rien ne lui est indiqué. D'où la présence du -lm (pour libmath). Dès qu'on utilise une bibliothèque (hormis la libC bien sûr), il faut la linker.
Cdlt,
Oui je n'ai jamais dit le contraire mais
1) C'est un truc qu'il doit rendre le prof appréciera le geste.
2) Ca sert a beaucoup mieux comprendre comment ca fonctionne que de faire un vulgaire "printf" (qui se doute qu'en fait il y a des write derrière ça)
3) C'était une solution temporaire à son problème
Mais je suis d'accord avec toi que ca n'est pas toujours le plus opti