FONCTION DE MATHS EN C

FONCTION DE MATHS EN C - C - Programmation

Marsh Posté le 09-03-2005 à 20:56:36    

Bonjour
 
J'ai un petit probleme en C.
Je veux utiliser les fonctions de la bibliotheque
math.h.
Je fait "#include <math.h>"
et j'ai bien verifier dans /usr/bin/include
que math.h existe bien.
 
J'ai une erreur unreconized sqrt.
 
Pourquoi????

Reply

Marsh Posté le 09-03-2005 à 20:56:36   

Reply

Marsh Posté le 09-03-2005 à 21:00:53    

-lm

Reply

Marsh Posté le 09-03-2005 à 21:02:02    

comment ca -lm?
explique toi stp

Reply

Marsh Posté le 09-03-2005 à 21:02:58    

Pas mieux que Taz... il fo mettre l'option -lm dans ta commande de compilation

Reply

Marsh Posté le 09-03-2005 à 21:05:11    

a quoi set cette option?
et d'ou viens une telle erreur?

Reply

Marsh Posté le 09-03-2005 à 21:16:18    

la_marseillaise a écrit :

a quoi set cette option?


Avec gcc, à ajouter la bibliothèque mathématique

Citation :

et d'ou viens une telle erreur?


Le linker ne trouve pas la fonction. Normal, elle ne fat pas partie de la bibliothèque standard par défaut (pour éviter d'encombrer la mémoire sur les cibles de taille réduite, je suppose...)
 
http://mapage.noos.fr/emdel/notes.htm#bibliotheque


Message édité par Emmanuel Delahaye le 09-03-2005 à 21:18:06

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 09-03-2005 à 21:16:59    

man sqrt !

Reply

Marsh Posté le 09-03-2005 à 21:32:42    

Emmanuel D elahaye
 
la bibliotheque figure bien dans mon repertoire include
 
Taz
j'ai deja regarder le man
 

Reply

Marsh Posté le 09-03-2005 à 21:38:51    

la_marseillaise a écrit :

...
j'ai deja regarder le man

C'est le bon que tu as regardé ?
 
 
SQRT(3)                                            Manuel du programmeur Linux                                           SQRT(3)
 
NOM
       sqrt, sqrtf, sqrtl - Fonction racine carrée (square root).
 
SYNOPSIS
       #include <math.h>
 
       double sqrt (double x);
 
       float sqrt (float x);
 
       long double sqrt (long double x);
 
DESCRIPTION
       La fonction sqrt() renvoie la racine carrée non‐négative de x.  Elle échoue et positionne errno a EDOM, si x est négatif.
 
ERREURS
       EDOM   x est négatif.
 
NOTES
       Pour utiliser les fonctions de la bibliothèque mathématique, il ne faut pas oublier d’ajouter l’argument ‐lm sur la ligne de commande de cc(1) ou ld(1), lors de l’édition des liens.
 
CONFORME A
       SVID 3, POSIX, BSD 4.3, ISO 9899.  Les variantes float et long double sont des demandes C99.
 
VOIR AUSSI
       hypot(3)
 
TRADUCTION
       Christophe Blaess, 1996‐2003.


Message édité par darkoli le 09-03-2005 à 21:39:28

---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 09-03-2005 à 21:43:15    

darkoli  
 
l'erreur unreconized est aussi pour pow
ma racine est bien positive

Reply

Marsh Posté le 09-03-2005 à 21:43:15   

Reply

Marsh Posté le 09-03-2005 à 21:49:33    

-lm est obligatoire?
ca me parait lourd

Reply

Marsh Posté le 09-03-2005 à 21:51:09    

POW(3)                    Manuel du programmeur Linux                   POW(3)
 
NOM
       pow, powf, powl - Fonction puissance
 
SYNOPSIS
       #define _GNU_SOURCE
       #include <math.h>
 
       double pow (double x, double y);
 
       float powf (float x, float y);
 
       long double powl (long double x, long double y);
 
DESCRIPTION
       La fonction pow() renvoie la valeur de x élevé à la puissance y.
 
ERREURS
       EDOM   L’argument  x  est  négatif,  et y n’est pas entier. Le résultat
              serait un nombre complexe.
 
NOTES
       Pour utiliser les fonctions de la bibliothèque mathématique, il ne faut
       pas  oublier d’ajouter l’argument ‐lm sur la ligne de commande de cc(1)
       ou ld(1), lors de l’édition des liens.
 
CONFORMITÉ
       SVID 3, POSIX, BSD 4.3, ISO 9899 Les variantes  float  et  long  double
       sont des demandes C99.
 
VOIR AUSSI
       sqrt(3), cbrt(3)
 
TRADUCTION
       Christophe Blaess, 1996‐2003.
 
LDP                             30 juillet 2003                         POW(3)

Reply

Marsh Posté le 09-03-2005 à 21:51:45    

la_marseillaise a écrit :


ca me parait lourd


ah bon.

Reply

Marsh Posté le 09-03-2005 à 21:57:35    

la_marseillaise a écrit :

-lm est obligatoire?


 
Lorsque tu appelles une fonction de la librairie "/usr/lib/libqqchose.a", tu dois indiquer au compilo que tu utilises cette librairie afin que le compilo sache où se trouve le code de la fonction
gcc machin.c /usr/lib/libqqchose.a -o machin
 
Raccourci, l'option "-lqqchose" est un raccourci vers "/usr/lib/libqqchose.a" donc tu peux remplacer la commande précédente par
gcc machin.c -lqqchose -o machin
 
Ici, tu utilises la librairie "libm.a" donc "-lm"
 

la_marseillaise a écrit :

ca me parait lourd


Ce qui serait vraiment lourd, comme l'a dit Emmanuel, c'est que toutes les librairies existantes soient automatiquement reliées lors de la compilation. Là, tu aurais une compilationqui dure 3 plombes.
 
Ici, au contraire, c'est toi le maître. Tu utilises les librairie "/usr:lib/libx.a" et "/usr/lib/liby.a" donc tu l'indiques au compilo
cc machin.c -lx -ly -o machin

Reply

Marsh Posté le 09-03-2005 à 21:57:38    

oui c'est tres lourd!
 
 
merci mais j'ai deja lu toute cette doc!!!!

Reply

Marsh Posté le 09-03-2005 à 21:59:09    

Sve@r
 
je n'utilise pas de .a que des .h
 
je n'ai pas trop compris
 
(je debute en C)

Reply

Marsh Posté le 09-03-2005 à 22:03:15    

la_marseillaise a écrit :

Sve@r
 
je n'utilise pas de .a que des .h
 
je n'ai pas trop compris
 
(je debute en C)


alors fais comme si t'avais compris, ça a peut d'importance pour le moment. retiens juste que pour certaines bibliothèques, il faut dire à gcc où elles sont.

Reply

Marsh Posté le 09-03-2005 à 22:03:56    

la_marseillaise a écrit :

Sve@r
 
je n'utilise pas de .a que des .h
 
je n'ai pas trop compris
 
(je debute en C)


 
Pour résumer, le ".h" c'est le descriptif des fonctions que tu utilises.  
Ex: sqrt prend comme argument un double et renvoie un double.
C'est en effet plus facile d'inclure un fichier ".h" regroupant un descriptif de 80 fonctions que de réécrire tous les descriptifs. Car tu es obligé de déclarer dans ton source toutes les fonctions que tu vas utiliser avant de les utiliser.
 
Le ".a", c'est un gros fichier contenant le code exécutable des fonctions. Calculer une racine carrée ne se fait pas en 3 opérations. Il faut une boucle, etc. Ce code est déjà précompilé et inclus dans le ".a"
 
Quand tu compiles, tu indiques au compilo où se trouve le code des fonctions que tu vas utiliser.
 
On pourrait inclure le code dans le ".h" mais n'importe qui pourrait toucher le code donc on aurait de gros pb.


Message édité par Sve@r le 09-03-2005 à 22:04:33
Reply

Marsh Posté le 09-03-2005 à 22:05:47    

Sve@r
 
je te remercie beaucoup
 
j'ai tres bien compris
 
 
MERCI A TOUS!!!!!

Reply

Marsh Posté le 09-03-2005 à 22:48:25    

la_marseillaise a écrit :

-lm est obligatoire?


Oui.

Citation :

ca me parait lourd


Peut importe, c'est comme ça, (et c'est pas lourd)
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 09-03-2005 à 22:55:28    

la_marseillaise a écrit :


je n'utilise pas de .a que des .h
 
je n'ai pas trop compris
 
(je debute en C)


J'avais pourtant posté un lien... Tu ne l'as pas lu, c'est dommage...
 
Rappel : Un .h est un fichier d'interface (la partie visible de la bibliothèque). Il ne contient pas le code d'ecécution. Celui-ci se trouve dans un .a (.lib etc. selon le système). Par défaut une partie de la bibliothèque standard est liée automatiquement. Si on a besoin d'autres fonctions standard (comme les fonctions qui utilisent les flottants), on signale au linker qu'il faut ajouter ce qui manque (-lm) c'est une façon simple et rapide de le demander.  
 
La méthode officielle (qu'il faut utiliser pour les bibliothèques non standards) est plutôt du genre

-llibxxx.a


 
Nota : ces détails (importants) sont liés à l'implémentation du langage (compilateur, environnement de développement, système) et non au langage C lui-même.
 
Tout est expliqué dans le manuel de ton compilateur...


Message édité par Emmanuel Delahaye le 09-03-2005 à 22:56:56

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 10-03-2005 à 08:08:50    

Emmanuel Delahaye a écrit :

La méthode officielle (qu'il faut utiliser pour les bibliothèques non standards) est plutôt du genre

-llibxxx.a




 
C'est pas plutôt "libxxx.a" sans le "-l" ?

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed