Probleme avec sqrtf
Résolu
hoho26
Messages postés
1
Date d'inscription
Statut
Membre
Dernière intervention
-
Perla -
Perla -
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;
}
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;
}
4 réponses
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.
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.
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
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...
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?
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
:)