C kérdés

Fórumok

Helló,

két kérdésem volna.
1, Ha csak a szabványos C könyvtárakat lehet használni (sulis házi, mennie kell Windowson és Linuxon is) akkor hogy tudom egy fájl hosszát megtudni.
2,
int distance(Station* stationA,Station* stationB){
return (SPEED/3600) * sqrt(pow(stationA->x - stationB->x,2)+pow(stationA->y - stationB->y,2));
}

Föntire azt írja hogy, undefined reference to 'sqrt'. Miért van ez?

Ha ezt írom:

int distance(Station* stationA,Station* stationB){
return (SPEED/3600) * sqrt(5);
}

akkor simán lefordul.

Előre is köszi a válaszokat.
üdv
Szati

Hozzászólások


1.
f = fopen("xxxxxxx.xxx","r");
fseek(f, 0, SEEK_END);
meret = ftell(f);

2.
Linkeld a math libet -lm kapcsolóval a fordításkor.
Meg persze

#include <math.h>

__________
0x2A

1.) az említett stat() függvény egy struktúrát ad vissza (egy direktszorzat vagy rekord típust), amelynek van olyan mezője, ami a fájl bájtoban mért hosszát tartalmazza.

2.) Egy Linux man oldalból:

NAME
sqrt, sqrtf, sqrtl - square root function

SYNOPSIS
#include

double sqrt(double x);
float sqrtf(float x);
long double sqrtl(long double x);

Link with -lm.

(itt megköveteli a linkelést, de ez az általános)

1) stat fv.is talán jó. Mindenesetre BSD és Linux rendszereken is megy :)
(man 2 stat)

1. Mint fent mások is említették, stat() megmondja egy fájl méretét az st_size mezőben. Ha egy FILE* adott (és a fájlnév nem), akkor fseek-kel a végére mész, és ftell-lel lekérdezed az aktuális pozíciót.

2. Az sqrt(5) és az sqrt(pow(stationA->x - stationB->x,2) hívások között az a lényeges különbség, hogy az előbbit a gcc fordítási időben lecseréli 2-re (mivel int-et kell visszaadni), tehát az sqrt függvény soha nem hívódik meg, tehát nincs rá szükség, míg az utóbbi esetben az sqrt() függvény meghívódik, és a gcc-nek az -lm kapcsolót meg kell adni, ezzel jelezve, hogy a /lib/libm.so*-ban van az sqrt() függvény.