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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> inline 
:(
    Опции темы
Lampa24
Дата 19.1.2009, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

ile q2a.h

#ifndef Q2A_H
#define Q2A_H

int MyFactorial(int a)
{
    if (a < 2)
        return 1;
    return a*MyFactorial(a-1);
}

int NumPermutations(int b);


#endif
//////////////////////////////////////////////////////////////////////
file Q2a.cpp
#include "Q2a.h"

int NumPermutations(int b)
{
    return MyFactorial(b);
}
////////////////////////////////////////////////////////////////////////
file Q2b.cpp
#include <iostream>
#include "Q2a.h"

int main()
{
    std::cout << "Num permutations of 5 elements: " << NumPermutations(5) << std::endl;
    return 0;
}




Криво написано , но это учебная прога.
В таком виде она не проходит линкинг и в принципе это понятно .
Но если добавить inline к int MyFactorial(int a) , то прога работает.
Объясните плз. почему??????
Ведь inline в рекурсии компайлер игнорирует. 

PM MAIL   Вверх
vinter
Дата 19.1.2009, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата(Lampa24 @  19.1.2009,  21:59 Найти цитируемый пост)
Ведь inline в рекурсии компайлер игнорирует. 

не обязательно, этот эффект называется tail call(tail recursion это частный случай). В данном случае компилятор заменяет рекурсию на цикл, и делает функцию подставляемой


--------------------
Мой блог
PM MAIL WWW   Вверх
Lampa24
Дата 19.1.2009, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



vinter  Спасибо, но это не отвечает на основной вопрос , почему inline избавляет от ошибки ????
PM MAIL   Вверх
vinter
Дата 19.1.2009, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата(Lampa24 @  19.1.2009,  22:28 Найти цитируемый пост)
vinter  Спасибо, но это не отвечает на основной вопрос , почему inline избавляет от ошибки ????

потомучто inline не является функцией, inline встраивается подобно макросу на этапе компиляции => не случается повторных определений и ошибки нет


--------------------
Мой блог
PM MAIL WWW   Вверх
Lampa24
Дата 19.1.2009, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(vinter @ 19.1.2009,  21:40)
Цитата(Lampa24 @  19.1.2009,  22:28 Найти цитируемый пост)
vinter  Спасибо, но это не отвечает на основной вопрос , почему inline избавляет от ошибки ????

потомучто inline не является функцией, inline встраивается подобно макросу на этапе компиляции => не случается повторных определений и ошибки нет

Пасибо огромное!!!!!!
PM MAIL   Вверх
Lazin
Дата 19.1.2009, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(vinter @  19.1.2009,  21:19 Найти цитируемый пост)
не обязательно, этот эффект называется tail call(tail recursion это частный случай). В данном случае компилятор заменяет рекурсию на цикл, и делает функцию подставляемой

я думаю программа не работает не из-за переполнения стека smile 
Цитата(Lampa24 @  19.1.2009,  20:59 Найти цитируемый пост)
NumPermutations(5)


Цитата(Lampa24 @  19.1.2009,  20:59 Найти цитируемый пост)
В таком виде она не проходит линкинг и в принципе это понятно .
Но если добавить inline к int MyFactorial(int a) , то прога работает.
Объясните плз. почему??????

что за ошибка?

Это сообщение отредактировал(а) Lazin - 19.1.2009, 21:56
PM MAIL Skype GTalk   Вверх
Lampa24
Дата 19.1.2009, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Lazin @ 19.1.2009,  21:55)
Цитата(vinter @  19.1.2009,  21:19 Найти цитируемый пост)
не обязательно, этот эффект называется tail call(tail recursion это частный случай). В данном случае компилятор заменяет рекурсию на цикл, и делает функцию подставляемой

я думаю программа не работает не из-за переполнения стека smile 
Цитата(Lampa24 @  19.1.2009,  20:59 Найти цитируемый пост)
NumPermutations(5)


Цитата(Lampa24 @  19.1.2009,  20:59 Найти цитируемый пост)
В таком виде она не проходит линкинг и в принципе это понятно .
Но если добавить inline к int MyFactorial(int a) , то прога работает.
Объясните плз. почему??????

что за ошибка?

Какого стэка???? Фактариал 5 посчитать проблема??? 
А ошибка двойное определение функции NumPermutations
PM MAIL   Вверх
Lazin
Дата 19.1.2009, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(Lampa24 @  19.1.2009,  22:04 Найти цитируемый пост)
А ошибка двойное определение функции NumPermutations 

интересно в каком месте, можешь запостить то что выдает компилтор, а не свой вольный пересказ?

Цитата(Lampa24 @  19.1.2009,  22:04 Найти цитируемый пост)
Какого стэка???? Фактариал 5 посчитать проблема???

это я вообще не тебе
PM MAIL Skype GTalk   Вверх
Lampa24
Дата 19.1.2009, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Lazin @ 19.1.2009,  22:12)
Цитата(Lampa24 @  19.1.2009,  22:04 Найти цитируемый пост)
А ошибка двойное определение функции NumPermutations 

интересно в каком месте, можешь запостить то что выдает компилтор, а не свой вольный пересказ?

Цитата(Lampa24 @  19.1.2009,  22:04 Найти цитируемый пост)
Какого стэка???? Фактариал 5 посчитать проблема???

это я вообще не тебе

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


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


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата(Lazin @  19.1.2009,  22:55 Найти цитируемый пост)
я думаю программа не работает не из-за переполнения стека 

а причем оно тут? я про переполнение ни слова не сказал.

Цитата(Lazin @  19.1.2009,  22:55 Найти цитируемый пост)
что за ошибка?

глянь на исходник, у него ф-ия определена в ашнике


--------------------
Мой блог
PM MAIL WWW   Вверх
Lazin
Дата 19.1.2009, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(vinter @  19.1.2009,  22:20 Найти цитируемый пост)
глянь на исходник, у него ф-ия определена в ашнике

ааааа
Цитата(vinter @  19.1.2009,  22:20 Найти цитируемый пост)
а причем оно тут? я про переполнение ни слова не сказал.

ну ты сказал, что там  оптимизация хвостовой рекурсии используется и я подумал что ты подумал что без этой оптимизации программа валилась с переполнением стека, а с ней работала, в принципе это возможно, если рекурсия глубокая и ф-я не определена в ашнике smile 
PM MAIL Skype GTalk   Вверх
bsa
Дата 19.1.2009, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Lampa24, на будущее, чтобы подобных проблем не было, в h файл помещай только декларации структур, классов, переменных, функций, перечисления и переопределения типов, можно еще константы (на C++), а реализацию - в c/cpp файл. Просто, когда в двух или более модулях встречается реализация функций с одинаковыми именами (сигнатурами), то линкер выдает ошибку, так как он не может понять, в каком месте какая используется. Если ты помечаешь ее inline, то начинают работать несколько иные правила - линкер уже может и не знать о существовании такой функции.
PM   Вверх
UnrealMan
Дата 19.1.2009, 23:41 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Lampa24 @  19.1.2009,  21:52 Найти цитируемый пост)
Пасибо огромное!!!!!!

Вкусная лапша, да? smile Приходи ещё, здесь тебя ей накормят по полной smile 
PM MAIL   Вверх
Lampa24
Дата 19.1.2009, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(bsa @ 19.1.2009,  23:40)
Lampa24, на будущее, чтобы подобных проблем не было, в h файл помещай только декларации структур, классов, переменных, функций, перечисления и переопределения типов, можно еще константы (на C++), а реализацию - в c/cpp файл. Просто, когда в двух или более модулях встречается реализация функций с одинаковыми именами (сигнатурами), то линкер выдает ошибку, так как он не может понять, в каком месте какая используется. Если ты помечаешь ее inline, то начинают работать несколько иные правила - линкер уже может и не знать о существовании такой функции.

А ты бы не мог подробней об этих правилах . 
Просто это вопрос на д\з и мне нужно объяснить почему это так.

Добавлено через 1 минуту и 18 секунд
Цитата(UnrealMan @ 19.1.2009,  23:41)
Цитата(Lampa24 @  19.1.2009,  21:52 Найти цитируемый пост)
Пасибо огромное!!!!!!

Вкусная лапша, да? smile Приходи ещё, здесь тебя ей накормят по полной smile

????? Это к чему уважаемый???
PM MAIL   Вверх
mes
Дата 20.1.2009, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Lampa24 @  19.1.2009,  22:46 Найти цитируемый пост)
????? Это к чему уважаемый??? 

об этом :
Цитата(vinter @  19.1.2009,  20:40 Найти цитируемый пост)

потомучто inline не является функцией, inline встраивается подобно макросу на этапе компиляции => не случается повторных определений и ошибки нет 


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




--------------------
PM MAIL WWW   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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