![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Lampa24 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 22.3.2008 Репутация: нет Всего: нет |
Криво написано , но это учебная прога. В таком виде она не проходит линкинг и в принципе это понятно . Но если добавить inline к int MyFactorial(int a) , то прога работает. Объясните плз. почему?????? Ведь inline в рекурсии компайлер игнорирует. |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
не обязательно, этот эффект называется tail call(tail recursion это частный случай). В данном случае компилятор заменяет рекурсию на цикл, и делает функцию подставляемой |
|||
|
||||
Lampa24 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 22.3.2008 Репутация: нет Всего: нет |
vinter Спасибо, но это не отвечает на основной вопрос , почему inline избавляет от ошибки ????
|
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
||||
|
||||
Lampa24 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 22.3.2008 Репутация: нет Всего: нет |
Пасибо огромное!!!!!! |
|||
|
||||
Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
я думаю программа не работает не из-за переполнения стека ![]()
что за ошибка? Это сообщение отредактировал(а) Lazin - 19.1.2009, 21:56 |
||||
|
|||||
Lampa24 |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 22.3.2008 Репутация: нет Всего: нет |
Какого стэка???? Фактариал 5 посчитать проблема??? А ошибка двойное определение функции NumPermutations |
||||||
|
|||||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
интересно в каком месте, можешь запостить то что выдает компилтор, а не свой вольный пересказ? это я вообще не тебе |
|||
|
||||
Lampa24 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 22.3.2008 Репутация: нет Всего: нет |
Compiling... Q2a.cpp Linking... Q2a.obj : error LNK2005: "int __cdecl MyFactorial(int)" (?MyFactorial@@YAHH@Z) already defined in Q2b.obj Debug/Q2b.exe : fatal error LNK1169: one or more multiply defined symbols found Error executing link.exe. Q2b.exe - 2 error(s), 0 warning(s) Это без inline |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
а причем оно тут? я про переполнение ни слова не сказал. глянь на исходник, у него ф-ия определена в ашнике |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
ааааа ну ты сказал, что там оптимизация хвостовой рекурсии используется и я подумал что ты подумал что без этой оптимизации программа валилась с переполнением стека, а с ней работала, в принципе это возможно, если рекурсия глубокая и ф-я не определена в ашнике ![]() |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Lampa24, на будущее, чтобы подобных проблем не было, в h файл помещай только декларации структур, классов, переменных, функций, перечисления и переопределения типов, можно еще константы (на C++), а реализацию - в c/cpp файл. Просто, когда в двух или более модулях встречается реализация функций с одинаковыми именами (сигнатурами), то линкер выдает ошибку, так как он не может понять, в каком месте какая используется. Если ты помечаешь ее inline, то начинают работать несколько иные правила - линкер уже может и не знать о существовании такой функции.
|
|||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 5 Всего: 32 |
||||
|
||||
Lampa24 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 22.3.2008 Репутация: нет Всего: нет |
А ты бы не мог подробней об этих правилах . Просто это вопрос на д\з и мне нужно объяснить почему это так. Добавлено через 1 минуту и 18 секунд
????? Это к чему уважаемый??? |
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
об этом :
макрос во первых раскрывается не во время компиляции, а до. во вторых inline не более чем указание компилятору сделать функцию встраиваемой. в третьих проблема исчезает не из за того, что функция встраивается, а из за того что имена функций с inline для линкера помечены как локальные, в отличие от имен обычных функций, которые имееют внешнее связывание. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |