Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GCC выдает ошибку, На рекурсии и при вызове pow 
:(
    Опции темы
Graf Zeppelin
Дата 2.12.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 28.3.2004

Репутация: нет
Всего: 1



У меня следующая проблема - если в программе есть рекурсия то при компиляции линковщик выдает следующую ошибку:
Код

/tmp/ccC8W2C1.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status

К программе эта ошибка не привязана - она возникает в любой проге где есть рекурсия. Вот, подскажите как бороться.

И ещё вопрос - в какой библиотеке есть функция возведения в степень pow. В заголовках math.h её нет.
--------------------
Jah, help me!
PM MAIL   Вверх
Dragon
Дата 2.12.2006, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 10.8.2006
Где: Киев

Репутация: нет
Всего: нет



Версия gcc, коммандная строка, которой компилируешь программу - и sample код, в котором проявляется проблема с рекурсией.

Для вызова pow() нужно включать math.h - это определено стандартом. Даже если прототипа pow() нет в самом math.h, он обязан быть в файле включаемом в math.h.

PM MAIL ICQ   Вверх
Graf Zeppelin
Дата 2.12.2006, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 28.3.2004

Репутация: нет
Всего: 1



Версия GCC - 4.0.3
Были неудачные попытки установить GCC - 4.1.1, после этого для верности GCC -4.0.3 был установлен заново.
Код такой:
Код

int sum_of_digits(int a) {

    int tmp=0;

    while(a!=0) {

        tmp+=a%10;

        a/=10;

    }

    if (abs(tmp)>9) return sum_of_digits(abs(tmp)1);

    else return(abs(tmp));

}

Многочисленными прогонами было определено что дело именно в рекурсии. Тоесть вызове функции sum_of_digits. Функция была объявлена(была так же попытка компилить и без объявления - разницы ни какой).
Команда такая:
Код

# gcc -o xo CL2.C
/tmp/ccHv7C8P.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status


Включение math.h все равно не помогает бороться с отстутствием pow в библиотеке.

Это сообщение отредактировал(а) Graf Zeppelin - 2.12.2006, 22:59
--------------------
Jah, help me!
PM MAIL   Вверх
bilbobagginz
Дата 2.12.2006, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 4
Всего: 317



не знаю на какой системе всё это запускается, и с какими флажками компиляции. у меня всё собралось без проблем.  скорее всего проблема не в коде а в настройках компиляции... 

вопрос другой: почему бы не проще:
Код

/*! Sum of Digits */
int SoD(int a) {
    int arg=abs(a); /* каждый вызов... дорогая штука */
    if (arg<10) return arg;
    return (arg%10+SoD((arg-arg%10)/10));
}


( есть какие-то случаи, к-рые я пропускаю ?  )


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
Graf Zeppelin
Дата 3.12.2006, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 28.3.2004

Репутация: нет
Всего: 1



Код

#define abs(a) ((a>=0)?(a):(-a))

Во первых - это ускоряет работу этой функции просто невероятно, во вторых, то что ты сказал, делает компилятор при трансляции на ассемблер, поэтому писать не обязательно.
--------------------
Jah, help me!
PM MAIL   Вверх
Dude03
Дата 3.12.2006, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.4.2006

Репутация: 1
Всего: 6



Цитата(Graf Zeppelin @  3.12.2006,  00:01 Найти цитируемый пост)
Во первых - это ускоряет работу этой функции просто невероятно, во вторых, то что ты сказал, делает компилятор при трансляции на ассемблер, поэтому писать не обязательно. 

Если честно не врубил - что, где и когда ускоряет? smile
 
PM MAIL   Вверх
Graf Zeppelin
Дата 3.12.2006, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 28.3.2004

Репутация: нет
Всего: 1



Стандартная функция abs(), лежащая в библиотеке math, а точнее её вызов достаточно дорог, и лучше вместо него использовать эту конструкцию с #define - работает где-то на порядок быстрее.
Второе - если ты повторно в программе вычисляешь какое-то значение, тоесть два(ну или более) раза делаешь одно и то же, то компилятор вроде GCC стандартно сам при трансляции на ассемблер заменит несколько вычислений одним. Поэтому в ходе разработки на это можно не обращать внимания, другое дело, если пишешь не на GCC - к сожалению почти все компиляторы под Windows представляют достаточно скудный набор опций оптимизации, поэтому многие задачи они не решают, а оставляют программисту. Хотя данную конкретную задачу решают все.

Всем принявшим участие в обсуждении темы выражаю благодарность, а так же приношу извинения - ошибка не в компиляторе, библиотеках или ещё чем-то, ошибка чисто моя. Файл в котоом была моя программа имел расширение *.C, что и было источником проблем, при замене на *.c обе ошибки заявленные в теме ушли.
--------------------
Jah, help me!
PM MAIL   Вверх
MAKCim
Дата 3.12.2006, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата

Во первых - это ускоряет работу этой функции просто невероятно

а так
Код

static inline double abs(double value) {
    __asm__("fabs" : "+t" (value));
    return value;
}

 smile 
хотя при включенной -O3 для всех вариантов генерируется один и тот же код


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bilbobagginz
Дата 3.12.2006, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 4
Всего: 317



я понимаю, когда оптимизируют ф-ю какого-нить преобразования фурье. 
но когда оптимизируют функцию sum_of_digits, у меня немножко это в голове не укладывается.
просто интересно, в каком случае использование ЭТОГО вычисления становится критичным во времени ?
шифрование что-ли ? ( CRC уже давно есть релизованные ... )


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
Graf Zeppelin
Дата 3.12.2006, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 28.3.2004

Репутация: нет
Всего: 1



Это простейшая хэш-функция для разбиения одного списка на несколько =) В той программе юзается очень часто.
--------------------
Jah, help me!
PM MAIL   Вверх
bilbobagginz
Дата 3.12.2006, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 4
Всего: 317



понял smile тупим-с потихоньку.



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
Graf Zeppelin
Дата 3.12.2006, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 28.3.2004

Репутация: нет
Всего: 1



Кстати, вопрос в функцией pow все-таки в силе. Проблема в том, что если в коде в неё вставлены уже заранее известные значения(константы к примеру) то компиляция проходит удачно, и программа работает нормально. Но при подстановке переменных сразу же ошибка линковщика.
--------------------
Jah, help me!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0579 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.