2010-11-08 2 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; 
} 

Этот код не работает, потому что он принимает квадратный корень переменной. Если вы измените sqrt(x), на sqrt(20.0), код работает просто отлично, почему? Пожалуйста, объясни.C программирование функция sqrt

Также, как получить квадратный корень переменной (что мне действительно нужно)?

ВЫВОД:

[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$ 

Примечание: sqroot1 является sqroot 20.0. sqroot2 - это квадрат переменной.

[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$ 

РЕШЕННЫЙ.

+2

Сообщение, как он не работает, так как он будет работать ... –

+0

Этот код выглядит хорошо для меня. Какой результат вы получаете при запуске? –

+0

Вы говорите, что это не работает: что вы видите? Он должен работать, хотя в качестве стиля я бы поместил переменную результата в другую строку. Также вам не хватает/до окончательного n в вашем printf. – winwaed

ответ

35

Код должен работать нормально, если вы связываетесь с соответствующими библиотеками (libc.a и libm.a). Ваша проблема, вероятно, в том, что вы используете gcc, и вы забываете ссылаться на libm.a через -lm, что дает вам неопределенную ссылку на sqrt. GCC вычисляет sqrt(20.0) во время компиляции, поскольку он является константой.

Попробуйте скомпилировать его с

gcc myfile.c -lm 

EDIT: Некоторые больше информации. Вы можете подтвердить это, посмотрев созданную сборку, когда вы замените x на константу в вызове sqrt.

gcc myfile.c -S 

Тогда взгляните на сборку в myfile.s и вы не будете видеть линию call sqrt в любом месте.

+11

Это довольно впечатляющее чтение ума. –

+4

Если вы допустили ту же ошибку и пришли к такому же выводу в своем вступительном курсе программирования, я уверен, что вы тоже будете мисс Клео. – Kizaru

+0

Я не могу найти параметр -lm в man-странице gcc. – qed

Смежные вопросы