![]() |
|
Модераторы: xvr |
![]()
|
|
| Graf Zeppelin |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 130 Регистрация: 28.3.2004 Репутация: нет Всего: 1 |
У меня следующая проблема - если в программе есть рекурсия то при компиляции линковщик выдает следующую ошибку:
К программе эта ошибка не привязана - она возникает в любой проге где есть рекурсия. Вот, подскажите как бороться. И ещё вопрос - в какой библиотеке есть функция возведения в степень pow. В заголовках math.h её нет. --------------------
Jah, help me! |
|||
|
||||
| Dragon |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 10.8.2006 Где: Киев Репутация: нет Всего: нет |
Версия gcc, коммандная строка, которой компилируешь программу - и sample код, в котором проявляется проблема с рекурсией.
Для вызова pow() нужно включать math.h - это определено стандартом. Даже если прототипа pow() нет в самом math.h, он обязан быть в файле включаемом в math.h. |
|||
|
||||
| Graf Zeppelin |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 130 Регистрация: 28.3.2004 Репутация: нет Всего: 1 |
Версия GCC - 4.0.3
Были неудачные попытки установить GCC - 4.1.1, после этого для верности GCC -4.0.3 был установлен заново. Код такой:
Многочисленными прогонами было определено что дело именно в рекурсии. Тоесть вызове функции sum_of_digits. Функция была объявлена(была так же попытка компилить и без объявления - разницы ни какой). Команда такая:
Включение math.h все равно не помогает бороться с отстутствием pow в библиотеке. Это сообщение отредактировал(а) Graf Zeppelin - 2.12.2006, 22:59 --------------------
Jah, help me! |
||||
|
|||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 4 Всего: 317 |
не знаю на какой системе всё это запускается, и с какими флажками компиляции. у меня всё собралось без проблем. скорее всего проблема не в коде а в настройках компиляции...
вопрос другой: почему бы не проще:
( есть какие-то случаи, к-рые я пропускаю ? ) -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| Graf Zeppelin |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 130 Регистрация: 28.3.2004 Репутация: нет Всего: 1 |
Во первых - это ускоряет работу этой функции просто невероятно, во вторых, то что ты сказал, делает компилятор при трансляции на ассемблер, поэтому писать не обязательно. --------------------
Jah, help me! |
|||
|
||||
| Dude03 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.4.2006 Репутация: 1 Всего: 6 |
||||
|
||||
| Graf Zeppelin |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 130 Регистрация: 28.3.2004 Репутация: нет Всего: 1 |
Стандартная функция abs(), лежащая в библиотеке math, а точнее её вызов достаточно дорог, и лучше вместо него использовать эту конструкцию с #define - работает где-то на порядок быстрее.
Второе - если ты повторно в программе вычисляешь какое-то значение, тоесть два(ну или более) раза делаешь одно и то же, то компилятор вроде GCC стандартно сам при трансляции на ассемблер заменит несколько вычислений одним. Поэтому в ходе разработки на это можно не обращать внимания, другое дело, если пишешь не на GCC - к сожалению почти все компиляторы под Windows представляют достаточно скудный набор опций оптимизации, поэтому многие задачи они не решают, а оставляют программисту. Хотя данную конкретную задачу решают все. Всем принявшим участие в обсуждении темы выражаю благодарность, а так же приношу извинения - ошибка не в компиляторе, библиотеках или ещё чем-то, ошибка чисто моя. Файл в котоом была моя программа имел расширение *.C, что и было источником проблем, при замене на *.c обе ошибки заявленные в теме ушли. --------------------
Jah, help me! |
|||
|
||||
| MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
а так
хотя при включенной -O3 для всех вариантов генерируется один и тот же код -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 4 Всего: 317 |
я понимаю, когда оптимизируют ф-ю какого-нить преобразования фурье.
но когда оптимизируют функцию sum_of_digits, у меня немножко это в голове не укладывается. просто интересно, в каком случае использование ЭТОГО вычисления становится критичным во времени ? шифрование что-ли ? ( CRC уже давно есть релизованные ... ) -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| Graf Zeppelin |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 130 Регистрация: 28.3.2004 Репутация: нет Всего: 1 |
Это простейшая хэш-функция для разбиения одного списка на несколько =) В той программе юзается очень часто.
--------------------
Jah, help me! |
|||
|
||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 4 Всего: 317 |
понял
-------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| Graf Zeppelin |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 130 Регистрация: 28.3.2004 Репутация: нет Всего: 1 |
Кстати, вопрос в функцией pow все-таки в силе. Проблема в том, что если в коде в неё вставлены уже заранее известные значения(константы к примеру) то компиляция проходит удачно, и программа работает нормально. Но при подстановке переменных сразу же ошибка линковщика.
--------------------
Jah, help me! |
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |