2010-11-08 15 views
6
#include <math.h> 
#include <stdio.h> 

int main(void) 
{ 
    double x = 4.0, result; 

    result = sqrt(x); 
    printf("The square root of %lf is %lfn", x, result); 
    return 0; 
} 

Ten kod nie działa, ponieważ pobiera pierwiastek kwadratowy zmiennej. Jeśli zmienisz sqrt(x), na sqrt(20.0), kod działa dobrze, dlaczego? Proszę wytłumacz.C programowanie funkcji sqrt

Ponadto, w jaki sposób uzyskać pierwiastek kwadratowy zmiennej (co jest tym, czego naprawdę potrzebuję)?

WYJŚCIE:

[email protected]:~/Programming/C.progs/Personal$ vim sqroot1.c 
[email protected]:~/Programming/C.progs/Personal$ cc -c sqroot1.c 
[email protected]:~/Programming/C.progs/Personal$ cc -o sqroot1 sqroot1.c 
[email protected]:~/Programming/C.progs/Personal$ ./sqroot1 
4.472136 
[email protected]:~/Programming/C.progs/Personal$ vim sqroot2.c 
[email protected]:~/Programming/C.progs/Personal$ cc -c sqroot2.c 
[email protected]:~/Programming/C.progs/Personal$ cc -o sqroot2 sqroot2.c 
/tmp/ccw2dVdc.o: In function `main': 
sqroot2.c:(.text+0x29): undefined reference to `sqrt' 
collect2: ld returned 1 exit status 
[email protected]:~/Programming/C.progs/Personal$ 

UWAGA: sqroot1 jest sqroot 20,0. sqroot2 to sqroot zmiennej.

[email protected]:~/Programming/C.progs/Personal$ cc -o sqroot2 sqroot2.c -lm 
[email protected]:~/Programming/C.progs/Personal$ ./sqroot2 
4.472136 
[email protected]:~/Programming/C.progs/Personal$ 

SOLVED.

+2

post jak to nie działa, ponieważ to działa ... –

+0

Ten kod wygląda dobrze do mnie. Jaki wynik uzyskujesz po uruchomieniu? –

+0

Mówisz, że to nie działa: co widzisz? To powinno zadziałać, chociaż ze względu na styl umieściłbym zmienną wyników na innej linii. Poza tym brakuje ci/przed ostatnim n w twoim printf. – winwaed

Odpowiedz

35

Kod powinien działać dobrze, jeśli łączysz się w odpowiednich bibliotekach (libc.a i libm.a). Problemem jest prawdopodobnie używanie gcc i zapominanie o połączeniu w libm.a poprzez -lm, co daje niezdefiniowane odniesienie do sqrt. GCC oblicza sqrt(20.0) w czasie kompilacji, ponieważ jest stałą.

Spróbuj skompilować go z

gcc myfile.c -lm 

EDIT: Niektóre więcej informacji. Możesz to potwierdzić, patrząc na wygenerowany zespół, gdy zastąpisz x stałą w wywołaniu sqrt.

gcc myfile.c -S 

Następnie przyjrzeć montażu w myfile.s i nie będzie widać linię call sqrt wszędzie.

+11

To dość imponujące czytanie myśli. –

+4

Jeśli popełniłeś ten sam błąd i doszli do tego samego wniosku na kursie wprowadzającym, jestem pewna, że ​​będziesz także Miss Cleo. – Kizaru

+0

Nie mogę znaleźć opcji -lm na stronie podręcznika gcc. – qed