LINUX.ORG.RU

Дурацкий вопрос про Си

 


0

4

Есть такой код:

#include <stdio.h>
#include <math.h>

int main() {
        float res = sqrt(4);
        printf("%f\n", res);
        return 0;
}
И есть такой:
#include <stdio.h>
#include <math.h>

int myfunc(int x) {
        float s = sqrt(x);
        return s;
}

int main() {
        float res = myfunc(4);
        printf("%f\n", res);
        return 0;
}
Компилирую так:
gcc -Wall -o test2 test2.c
В первом случае компилируется нормально, во втором нет:
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../x86_64-pc-linux-gnu/bin/ld: /tmp/cckklZZ9.o: in function `myfunc':
test2.c:(.text+0x11): undefined reference to `sqrt'
collect2: error: ld returned 1 exit status
Я не понимаю, для вызова sqrt в отдельной функции надо как-то по-особому инклюдить math.h? Или в чем причина?

Ответ на: комментарий от peregrine

beaver тоже

Спасибо, не знал про -lm.

У тебя функция неправильный тип возвращает.

Я так понимаю, вместо float надо ставить double? Переделал так:

#include <stdio.h>
#include <math.h>

int myfunc(int x) {
        double s = sqrt(x);
        return s;
}

int main() {
        double res = myfunc(24);
        printf("%f\n", res);
        return 0;
}
Но теперь почему-то выводит 4.000000 вместо нормального дробного значения. Не подскажете почему?

unicorne ()
Ответ на: комментарий от peregrine

А, ну и это да, хотя неприятно, что ошибка не очень явно пишется какая

А это и не ошибка. Это бич (bitch) языков программирования C и C++, называется слабая типизация.

https://ru.wikipedia.org/wiki/Каламбур_типизации

EXL ★★★★★ ()
Ответ на: комментарий от EXL

А это и не ошибка. Это бич (bitch) языков программирования C и C++, называется слабая типизация.

Это бич (bitch) пользователя @EXL, называется слабое знание опций gcc. На, держи:

-Wconversion

И друзьям раздай:

-Wconversion
-Wconversion

@unicorne, и тебе тоже:

-Wconversion
anonymous ()
Ответ на: комментарий от olelookoe

Интересное мнение, здесь обычно предпочитают абсолютные вещи, которые обязаны учитывать даже аллаха, а не какой-то там конкретный код.

anonymous ()