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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прототипы функции, помогите розобратся 
V
    Опции темы
EvgenZ
Дата 20.10.2006, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


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

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



Цитата(bsa @ 20.10.2006,  17:16)
Цитата(EvgenZ @ 20.10.2006,  16:50)
Коротко, но не ясно  smile .  
По функциям не помню, а вот с классами бывает так, что в одном классе используется ссылка на другой класс, а первый класс содержит ссылку на первый, т.е. без первого не создашь второй и наоборот. Для того чтобы скомпилировалось надо сделать объявление одного класса и после описывать второй и потом уже описывать первый. В функциях вроде такая же тема.

Если функция вызывает себя (в т.ч. и через другую функцию), то она рекурсивная. Рекурсия используется не очень часто. Но не смотря на это в Си подавляющее большинство функций объявлено прототипами (в .h файлах). smile
WERITAS был прав.

Да я собственно и не говорил, что неправильно, я просто сказал, что непонятно. Самый простой, надежный и логичный способ спросить это у того, кому предназначалась эта строка.

Sergio в С выполнение (и просмотр при компиляции) идет построчно, т.е.
Код

...
int a, b = 5;
a = b + c;
int c = 3;

у тебя будет ошибка, так как ты пытаешься использовать переменную которой еще нет во второй строке приведенного примера, но она есть дальше!!! Таже ситуация с функциями, компилятор смотрит, что есть функция (а функция в свою очередь должна быть, как все функции в С, уникальной. Что дает уникальность? - правильно, имя и список параметров) которая используется в данном куске, он вдиит, что она объявлена и дает компилировать, а если не находит, то....


vinter респект  smile .


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
Sergio
Дата 20.10.2006, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

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



Но я не пойму зачём это делать?? smile  Места меньше занимаэт ли что?  smile  Не легче обявить функцию и в блоке сразу определить(тоесть что она делать будет)
PM MAIL ICQ   Вверх
Daevaorn
Дата 20.10.2006, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Sergio @  21.10.2006,  00:51 Найти цитируемый пост)
Но я не пойму зачём это делать?? 

Из-за идиомы заголовок-реализация. Ты подключаешь только заголовки(*.h или *.hpp), из которых компилятор узнает об определениях. А сам код непосредсвенно компилируется отдельно(*.c или *.cpp) в объектные файлы. Советую почитать книги по С++. Там об этом пишут.
PM MAIL WWW   Вверх
Xenon
Дата 21.10.2006, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Sergio, Если определишь функцию до функции из которой ее вызываешь - пожалуйста, можешь забить на прототипы smile

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

Это сообщение отредактировал(а) Xenon - 21.10.2006, 00:06


--------------------
user posted image  
PM MAIL   Вверх
bsa
Дата 21.10.2006, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Sergio @ 20.10.2006,  23:51)
Но я не пойму зачём это делать?? smile  Места меньше занимаэт ли что?  smile  Не легче обявить функцию и в блоке сразу определить(тоесть что она делать будет)

Проще, если программа маленькая и состоит из не более чем десяти функций. Но когда количество функций исчисляется сотнями, то ты помрешь при отладке (я уж не говорю про компиляцию - поменял 1 на 2, и все компилируется заново). Поэтому такие крупные программы разбивают на модули, а связь между модулями реализуют через заголовочные файлы. И изменив один из файлов, тебе придется скомпилировать только его, а не все. Да и отлаживать проще, так как судя по ошибке ты сразу определяешь в каком модуле проблема и уже ищешь ошибку в 10 функциях, а не в нескольких сотнях. smile
PM   Вверх
Xenon
Дата 21.10.2006, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Вот, например ...
Код

void func()
{
    cout << "Func";
    func2();
}
int main( int argc, char* argv[] )
{
    func();
    getch();
    return 0;
}
void func2()
{
    cout << "Func2";
}


Компилятор тебя пошлет нафиг, так как он скажет: "А кто такая func2()?". Без прототипа не обойтись. Пример глупый и тут, конечно, как нефиг делать - можно просто func2 определить перед main() и все, но бывают примеры посложнее где иначе никак


--------------------
user posted image  
PM MAIL   Вверх
knut
Дата 21.10.2006, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Sergio, 
допустим у тебя  етсть функц. func а эту вункц ты реализуеш отдельно а вызов происхоет в маин. вот если не будет прототипа то компилятор не узнает о какой функц идет речьsmile
P.S
он конечно умный но не до такой степени.

Код

void func();
int main()
{
  func();
return 0;
}
void func ()
{
  // reatize function;
}



--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
Xenon
Дата 21.10.2006, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



ВСе привели один и тот же пример, в принципе smile
Если человек и сейчас не поймет, то я уже не знаю как объяснить smile


--------------------
user posted image  
PM MAIL   Вверх
Sergio
Дата 21.10.2006, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

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



Народ, то я так понял, что функции прототипы, это как абстрактные функции в класах (без определения, только заголовок). А реализация может быть в середине другой функции. Правильно или нет? smile 
PM MAIL ICQ   Вверх
bsa
Дата 21.10.2006, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Sergio @ 21.10.2006,  22:00)
Народ, то я так понял, что функции прототипы, это как абстрактные функции в класах (без определения, только заголовок). А реализация может быть в середине другой функции. Правильно или нет? smile

неправильно!
Реализация не может находиться в другой функции - по определению.
PM   Вверх
Alexeis
Дата 21.10.2006, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



В с++ Функции могут находится только внутри модуля, но  не внутри некоторой функции. Такая штука возможна только в паскале. smile 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Sergio
Дата 21.10.2006, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

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



Тепер понял.  smile Всем спасибо.
PM MAIL ICQ   Вверх
UnrealMan
Дата 22.10.2006, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(WERITAS @  20.10.2006,  16:29 Найти цитируемый пост)
Коротко и ясно: прототип ф-ции нужен, чтобы компилятор видел какие у нее параметры 

... и возвращаемое значение.

Цитата(EvgenZ @  20.10.2006,  16:50 Найти цитируемый пост)
По функциям не помню, а вот с классами бывает так, что в одном классе используется ссылка на другой класс, а первый класс содержит ссылку на первый, т.е. без первого не создашь второй и наоборот. Для того чтобы скомпилировалось надо сделать объявление одного класса и после описывать второй и потом уже описывать первый. В функциях вроде такая же тема. 

Однако в отношении классов иногда важен ещё и их размер. Тогда одним объявлением не обойдёшься:

Код
struct B;

struct A
{
    B b; // ошибка: размер b не известен
};

struct B
{
};

Что касается функций, то в редких случаях их объявление может пригодиться как средство разрешения области видимости:

Код
void Func(int) { cout<<"int"<<endl; }
void Func(double) { cout<<"double"<<endl; }

int main()
{
    void Func(double);
    Func(1); // void Func(int) не принимает участия в перегрузке
}

PM MAIL   Вверх
JackYF
Дата 23.10.2006, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



UnrealMan, откуда информация насчет не принятия участия в перегрузке?

То есть если я в этом случае вызову

Код

void Func(int);
void Func(double);

int main()
{
  void Func(int);
  
  Func(2.1);
}


Вызовется Func(int) ???


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Daevaorn
Дата 23.10.2006, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(JackYF @  23.10.2006,  16:33 Найти цитируемый пост)
откуда информация насчет не принятия участия в перегрузке?

Стандарт
Цитата(JackYF @  23.10.2006,  16:33 Найти цитируемый пост)
Вызовется Func(int) ??? 

Да
PM MAIL WWW   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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