LinuxForum.Fans
Тема

Внутренние функции в си не работают с переменными

Автор: pelejuy 9 сообщений 3152 просмотров
#134826

Суть проблемы: пишу программу на Си в Eclipse (на Mandriva), компилятор выдает ошибку undefined referense to 'sin' (cos, atan, sqrt). Ошибка появляется, когда в качестве аргумента функции указываю переменную, с константами ошибки не возникает.
Использую include math.h и ctdio.h, может быть нужно что-то еще?
Если кто-то сталкивался, подскажите!
Ошибка повторяется и при использовании компилятора Eclipse и при компилировании в терминале.

#134827

код в студию.

#134831
text

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

int main(void) { puts("Введите текст"); int rn, hh, mm, ss, zsh, shg, shm, zd, dg, dm, R; double ARG, ARC, kor, razn; double SHR, DOLR; scanf("%*u %2u%*u %2u %2u %2u %*u %1u %3u %2u %1u %3u %2u" , &rn, &hh, &mm, &ss, &zsh, &shg, &shm, &zd, &dg, &dm);

if (zsh > 2) SHR = (shg + (double)shm / 60) / 180 * 3.14159265358979; else SHR=(-shg - (double)shm / 60) / 180 * 3.14159265358979; if (zd > 2) DOLR=(dg + (double)dm / 60) / 180 * 3.14159265358979; else DOLR=(-dg - (double)dm / 60) / 180 * 3.14159265358979;

/*printf("%f %f\n" , SHR, DOLR);*/

razn = DOLR - 1.874532; double aa = sin(1.154374); double bb = sin(SHR); double cc = cos(1.154374); double dd = cos(SHR); double ee = cos(razn);

ARG = aa*bb+cc*dd*ee; kor = (-ARG * ARG) + 1; ARC = atan(-ARG / sqrt(kor)) + 2 * atan(1);

R = ARC * 180 / 3.14159265358979 * 111.1; printf("%u" , R);

return 0; }

Пока копировал код,- заработало!, - восстановил параметры по умолчанию..., до этого явно прописывал пути к файлам include, менял их с разных ide...
Спасибо , что быстро откликнулись!

#134894
man atan написал:
ATAN(3) Linux Programmer's Manual ATAN(3)

NAME
atan, atanf, atanl - arc tangent function

SYNOPSIS
#include <math.h>

double atan(double x);
float atanf(float x);
long double atanl( long double x);

Link with -lm.

такая ошибка возникает, если вы линкуете без опции -lm, это подключение математической библиотеки.

pelejuy написал:
Ошибка появляется, когда в качестве аргумента функции указываю переменную, с константами ошибки не возникает.

потому-что синус от константы == константа. Её вычисляет компилятор во время компиляции. Во время работы это не нужно, и если в коде все функции от констант, то и считать ничего не нужно. И не нужна мат. либа.

#134899
drBatty написал:

такая ошибка возникает, если вы линкуете без опции -lm, это подключение математической библиотеки.

Я в Си начинающий, подскажите пожалуйста, как это реализовать практически (хорошо бы с примером).

#134904
pelejuy написал:
Я в Си начинающий, подскажите пожалуйста, как это реализовать практически (хорошо бы с примером).

[console]ksu@ksu:~$ cat fp.c
#include <stdio.h>
#include <math.h>

int main()
{
double x = 0.5;
double y = atanf(x);
printf("atanf(%f) == %f\n", x, y);
return 0;
}
ksu@ksu:~$ gcc -o fp fp.c
/tmp/ccPol6tT.o: In function `main':
fp.c:(.text+0x35): undefined reference to `atanf'
collect2: выполнение ld завершилось с кодом возврата 1
ksu@ksu:~$ gcc -lm -o fp fp.c
ksu@ksu:~$ ./fp
atanf(0.500000) == 0.463648
[/console]
мой совет: начинайте с консоли. не наступайте на те-же грабли, которые несколько лет били меня по башке (когда я пользовался MSVC, т.к. в венде нет нормальной консоли).

#136243

Спасибо, с линкованием разобрался!
Еще вопрос: мне нужно на Си представить время в формате времени - hh:mm:ss , например 21:15:08..., (в исходных данных время в числовом формате (double) и не зависит от текущего времени);
в VB к примеру есть функция format , где можно задать нужный формат для преобразования времени в числовом формате в формат long time. В Си я подобной функции не нашел, пришлось придумывать свою, но думаю знатоки Си могли бы подсказать как оптимально преобразовать время из числового формата в формат времени и наоборот.
Как допустим в Excel : Формат - Ячейки - Дата/Время...

#136270

Вообще есть несколько способов. Плюс Ваш, который как я понял тоже работает.

1. Используйте функцию localtime() (или gmtime()) и руками (т.е. с помощью printf()) создавайте нужный Вам формат.
2. Используйте функцию asctime()
3. Используйте функцию ctime()
4. Используйте функцию strftime()

Как применять эти функции, думаю, сможете сами нагуглить.

И простите за совет, не пожалейте 500 рэ -- купите книжку Н.Мэтью и Р.Стоунса "Основы программирования в Linux" http://www.books.ru/shop/books/646220
Потом будете меня благодарить до конца дней. А мне будет приятно :) Серьезно. Книжка хорошая. Хватит надолго.

#136292
zhevak написал:
1. Используйте функцию localtime() (или gmtime()) и руками (т.е. с помощью printf()) создавайте нужный Вам формат.
2. Используйте функцию asctime()
3. Используйте функцию ctime()
4. Используйте функцию strftime()

ИМХО посл. вариант оптимальный обычно. strftime() тоже позволяет задавать ручками формат.

Войдите или зарегистрируйтесь, чтобы ответить.