1

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

Скромнее надо быть, товарищ Сидоренкова!

2

код в студию.

95% процентов проблем находятся между клавиатурой и стулом.

3 (25.03.2011 20:32:56 отредактировано mycetophylax)

#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...
Спасибо , что быстро откликнулись!

Скромнее надо быть, товарищ Сидоренкова!

4

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 пишет:

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

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

5 (25.03.2011 20:33:57 отредактировано mycetophylax)

drBatty пишет:

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

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

Скромнее надо быть, товарищ Сидоренкова!

6

pelejuy пишет:

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

 Консоль:
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


мой совет: начинайте с консоли. не наступайте на те-же грабли, которые несколько лет били меня по башке (когда я пользовался MSVC, т.к. в венде нет нормальной консоли).

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

7 (04.03.2011 17:00:04 отредактировано pelejuy)

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

Скромнее надо быть, товарищ Сидоренкова!

8

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

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

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

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

Live Free or Die

9

zhevak пишет:

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

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)