Calcul de polynôme en c: problème avec math.h

Résolu/Fermé
empirekro Messages postés 31 Date d'inscription vendredi 5 avril 2013 Statut Membre Dernière intervention 28 octobre 2013 - 30 sept. 2013 à 11:41
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 2 oct. 2013 à 14:43
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

/*on initialise ordonnee à a_0)*/
for(j=1;j<n+1;j++)
{
ordonnee = ordonnee + coef[j]*pow(abscisse,j);
}
Mais en compilant -- je tape :

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:

5 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
30 sept. 2013 à 14:48
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.
1
MaximeL. Messages postés 298 Date d'inscription dimanche 12 février 2012 Statut Membre Dernière intervention 27 juin 2014 79
30 sept. 2013 à 15:00
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.

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
0
MaximeL. Messages postés 298 Date d'inscription dimanche 12 février 2012 Statut Membre Dernière intervention 27 juin 2014 79
Modifié par MaximeL. le 30/09/2013 à 11:56
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.
0
MaximeL. Messages postés 298 Date d'inscription dimanche 12 février 2012 Statut Membre Dernière intervention 27 juin 2014 79
30 sept. 2013 à 13:30
Cela fonctionne-t-il ?
0
empirekro Messages postés 31 Date d'inscription vendredi 5 avril 2013 Statut Membre Dernière intervention 28 octobre 2013
30 sept. 2013 à 13:42
ç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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
empirekro Messages postés 31 Date d'inscription vendredi 5 avril 2013 Statut Membre Dernière intervention 28 octobre 2013
Modifié par empirekro le 30/09/2013 à 17:04
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!
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
1 oct. 2013 à 08:22
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.
0
empirekro Messages postés 31 Date d'inscription vendredi 5 avril 2013 Statut Membre Dernière intervention 28 octobre 2013
1 oct. 2013 à 10:35
Ok merci beaucoup!
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
1 oct. 2013 à 18:18
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,
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
2 oct. 2013 à 08:06
fiddy, tu prend en cours et n'as pas tout lu, le -lm était présent, mais au début de la commande.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
2 oct. 2013 à 13:47
Char Snipeur,
le -lm était présent, mais au début de la commande.
Je n'ai pas dit le contraire. J'apportais simplement des précisions sur "pourquoi il est nécessaire" comme le demandait empirekro (vu que tu as dit "je n'ai jamais bien compris pourquoi")...
0