Суть проблемы: пишу программу на Си в Eclipse (на Mandriva), компилятор выдает ошибку undefined referense to 'sin' (cos, atan, sqrt). Ошибка появляется, когда в качестве аргумента функции указываю переменную, с константами ошибки не возникает.
Использую include math.h и ctdio.h, может быть нужно что-то еще?
Если кто-то сталкивался, подскажите!
Ошибка повторяется и при использовании компилятора Eclipse и при компилировании в терминале.
Внутренние функции в си не работают с переменными
код в студию.
#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...
Спасибо , что быстро откликнулись!
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, это подключение математической библиотеки.
Ошибка появляется, когда в качестве аргумента функции указываю переменную, с константами ошибки не возникает.
потому-что синус от константы == константа. Её вычисляет компилятор во время компиляции. Во время работы это не нужно, и если в коде все функции от констант, то и считать ничего не нужно. И не нужна мат. либа.
такая ошибка возникает, если вы линкуете без опции -lm, это подключение математической библиотеки.
Я в Си начинающий, подскажите пожалуйста, как это реализовать практически (хорошо бы с примером).
Я в Си начинающий, подскажите пожалуйста, как это реализовать практически (хорошо бы с примером).
[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, т.к. в венде нет нормальной консоли).
Спасибо, с линкованием разобрался!
Еще вопрос: мне нужно на Си представить время в формате времени - hh:mm:ss , например 21:15:08..., (в исходных данных время в числовом формате (double) и не зависит от текущего времени);
в VB к примеру есть функция format , где можно задать нужный формат для преобразования времени в числовом формате в формат long time. В Си я подобной функции не нашел, пришлось придумывать свою, но думаю знатоки Си могли бы подсказать как оптимально преобразовать время из числового формата в формат времени и наоборот.
Как допустим в Excel : Формат - Ячейки - Дата/Время...
Вообще есть несколько способов. Плюс Ваш, который как я понял тоже работает.
1. Используйте функцию localtime() (или gmtime()) и руками (т.е. с помощью printf()) создавайте нужный Вам формат.
2. Используйте функцию asctime()
3. Используйте функцию ctime()
4. Используйте функцию strftime()
Как применять эти функции, думаю, сможете сами нагуглить.
И простите за совет, не пожалейте 500 рэ -- купите книжку Н.Мэтью и Р.Стоунса "Основы программирования в Linux" http://www.books.ru/shop/books/646220
Потом будете меня благодарить до конца дней. А мне будет приятно :) Серьезно. Книжка хорошая. Хватит надолго.
1. Используйте функцию localtime() (или gmtime()) и руками (т.е. с помощью printf()) создавайте нужный Вам формат.
2. Используйте функцию asctime()
3. Используйте функцию ctime()
4. Используйте функцию strftime()
ИМХО посл. вариант оптимальный обычно. strftime() тоже позволяет задавать ручками формат.