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? Или в чем причина?



Последнее исправление: beastie (всего исправлений: 1)

-lm

забыл

Первый вариант, возможно оптимизируется до вывода константы, хотя я не уверен. Надо бы на ассемблере глянуть что там внутри.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 2)
Ответ на: комментарий от 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
() автор топика

gcc -Wall -o test2 test2.c

gcc -std=c11 -Wall -Wextra -Werror -o test2 test2.c -lm

-Wall -Wextra -Werror как минимум, еще -Wshadow -Wpedantic хорошо добавить, тяжело в ученьи (с)

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

В удаленных подсказали, что для myfunc нужен тип double, а не int.

// Ну не всегда же нужно сносить комментарии, даже если там кого-то оскорбили :-/

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

не надо заострять внимание, тут это норма. главное - ты получил ответ на свой вопрос. толерантность и все такое, ну сам понимаешь.

Anoxemian ★★★★★
()

sqrt(4) трактуется как builtin и заменяется на константу. Отключается такая оптимизация -fno-builtin-sqrt

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

ну, в этом случае яснее некуда

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

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

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

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

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

Это бич (bitch) языков программирования

Так забавно, когда не владеющее английскийм быдло вдруг начинает умничать...

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

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

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

-Wconversion

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

-Wconversion
-Wconversion

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

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

Это bitch разработчиков gcc, которые не хотят добаввлять -Weverything и вынуждают вписывать в параметры запуска gcc полный выхлоп gcc --help=warnings.

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

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

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.