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
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
A voir également:
- Calcul de polynôme en c: problème avec math.h
- Calcul moyenne excel - Guide
- Calcul charpente bois gratuit - Télécharger - Architecture & Déco
- Logiciel gratuit calcul valeur nutritionnelle - Télécharger - Santé & Bien-être
- Logiciel calcul surface terrain gratuit - Télécharger - Outils professionnels
- Formule de calcul excel - Guide
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
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.
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.
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
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.
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.
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
30 sept. 2013 à 13:30
Cela fonctionne-t-il ?
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
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.
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
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
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!
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!
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
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.
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
1 oct. 2013 à 10:35
Ok merci beaucoup!
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
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,
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,
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
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.
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
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")...
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")...
30 sept. 2013 à 15:00
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