Menu

Probleme avec sqrtf [Résolu/Fermé]

Messages postés
1
Date d'inscription
mercredi 7 décembre 2011
Dernière intervention
7 décembre 2011
- - Dernière réponse :  Perla - 13 déc. 2011 à 17:03
Bonjour,

Mon probleme est que quand je compile mon fichier lors de la compilation j'ai comme message sur le terminal:

liste.c:244: undefined reference to 'sqrtf'

et je sais que cette fonction est dans math.h pourtant j'ai toujours cette erreur merci de m'aider voici le code:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include "ligne.h"
#include "truc.h"
#include "liste.h"
#include "coord.h"
#include "station.h"
#include "abr.h"
#include "connexion.h"
#include "abr_type.h"
#define MAX_LIGNE 256

.
.
.
.
Un_elem *lire_connexions(char *nomfichier,Une_ligne *liste_ligne,Un_nabr *abr_sta) {
Un_elem *liste=NULL;
FILE *f;
char ligne [MAX_LIGNE];

if((f=fopen(nomfichier,"r"))==NULL) {
fprintf(stderr,"erreur");
return NULL;
}
while(fgets(ligne,MAX_LIGNE,f)) {
Une_coord coord;
Tdata data;
char *pc=ligne;
char *code;
char*nom_dep;
char*nom_arr;
float val;
Un_truc *connex,*sta_dep;
if(*ligne =='#') continue;
code=pc;
while(*pc!=';')pc++;
*pc++='\0';
nom_dep=pc;
while(*pc!=';')pc++;
*pc++='\0';
nom_arr=pc;
while(*pc!=';')pc++;
*pc++='\0';
val=atof(pc);
Une_ligne *nico;
nico=chercher_ligne(liste_ligne,code);
if((data.con.ligne=nico)==NULL) {
fprintf(stderr,"erreur");
continue;
}
if((data.con.sta_dep=chercher_station(abr_sta,nom_dep))==NULL) {
fprintf(stderr,"erreur");
continue;
}
if((data.con.sta_dep=chercher_station(abr_sta,nom_arr))==NULL) {
fprintf(stderr,"erreur");
continue;
}
//calcul valeur arc
if(val==0.0) {
Une_coord cdep,carr;
float dx,dy;

cdep=data.con.sta_dep->coord;
carr=data.con.sta_arr->coord;
dx=((carr.lon-cdep.lon)*M_PI*6370/180);
dy=((carr.lat-cdep.lat)*M_PI*6370/180);

val=60*(sqrtf(dx*dx+dy*dy))/data.con.ligne->vitesse; //ligne de code 244

connex=creer_truc(coord,CON,data,val);
//ajout station depart
sta_dep=data.con.sta_dep;
(sta_dep->data.sta.nb_con)++;
sta_dep->data.sta.tab_con=realloc(sta_dep->data.sta.tab_con,sta_dep->data.sta.nb_con*sizeof(Un_elem*));
sta_dep->data.sta.tab_con[sta_dep->data.sta.nb_con-1]=connex;
//ajoute liste connexions
liste=inserer_deb_liste(liste,connex);
}
}
return liste;

}
Afficher la suite 
A voir également:

4 réponses

Meilleure réponse
Messages postés
698
Date d'inscription
dimanche 1 novembre 2009
Dernière intervention
31 décembre 2017
152
3
Merci
Problème classique !
Il ne suffit pas d'indiquer 'math.h' dans un fichier source car celui-ci n'est qu'un fichier de renseignements destiné au compilateur, il faut aussi indiquer au linker dans quelle bibliothèque se trouvent les fonctions correspondantes.
En général un ajout de '-lm' sur la ligne de commande résoud le problème.
Bonne continuation.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 57666 internautes nous ont dit merci ce mois-ci

J'ai le même soucis, seulement je pense que je ne place pas ce -lm au bon endroit dans la ligne de commande.
Dans mon makefile je fais entre autre:

liste.o : liste.c
gcc ${C_FLAGS} -c liste.c

test_sta : test_sta.o ligne.o liste.o truc.o abr.o station.o
gcc ${C_FLAGS} -lm -o test_sta test_sta.o truc.o ligne.o liste.o abr.o station.o

Sachant que l'appel à sqrt est dans liste.c

Où est donc l'erreur?
J'ai trouvé!
Il faut écrire à chaque ligne de commande qui dépend de liste.o -lm A LA FIN de la ligne de commande!

test_sta : test_sta.o ligne.o liste.o truc.o abr.o station.o
gcc ${C_FLAGS} -o test_sta test_sta.o truc.o ligne.o liste.o abr.o station.o -lm

:)
1
Merci
Moi j'ai pas compris ce qu'il faut faire!
UPMC en force yeah! XD
Messages postés
3661
Date d'inscription
dimanche 18 mars 2001
Statut
Modérateur
Dernière intervention
15 janvier 2017
1133
1
Merci
Tu dois lier libmath avec ton fichier objet avec l'option -lm:
johand@osiris: ~/src/CCM/C $ cat sqrtf-test.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(void)
{
  float two = 2.0;
  printf("The square root of %f is %10.10g\n", two, sqrtf(two) );
  return(EXIT_SUCCESS);
}
johand@osiris: ~/src/CCM/C $ gcc -Wall -lm  -o sqrtf-test sqrtf-test.c 
johand@osiris: ~/src/CCM/C $ ./sqrtf-test 
The square root of 2.000000 is 1.414213538
0
Merci
Bon ben moi j'ai aussi trouvé comment faire! J'ai tout simplement mis -lm à la deuxième ligne du make! (la première est un commentaire) . Et ça marche! Le problème c'est que maintenant j'ai une autre erreur! Il reconnaît pas mon chercher_ligne dans liste.c alors que les inclusions des headers ont bien été faites...