Помощь - Поиск - Пользователи - Календарь
Полная версия: Функция, которая не является функцией
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
Vinchkovsky
Рассмотрим такую функцию:

function Ax(var b:integer):integer;
begin
b:=1;
Ax:=1
end;


А теперь отвлечемся от Паскаля (условно wink.gif ).

С общей точки зрения кусок кода в примере - функция, процедура или функционально-процедурный мутант? rolleyes.gif

Спасибо за аргументированные ответы wink.gif
Archon
Можно ли считать функцией обособленный кусок кода, принимающий параметр, изменяющий его и возвращающий некоторое значение? Определённо.
Vinchkovsky
Archon, спасибо за ответ, тогда слова предподавателя о том, что функция возвращает одно значение, а процедура много, неверны?

Еще раз отмечу, что речь идет об основных понятиях программирования, не привязанных к конкретному языку wink.gif
volvo
Цитата
слова предподавателя о том, что функция возвращает одно значение, а процедура много, неверны?
Не в этом отличие процедуры от функции... А в том, что возвращаемое функцией значение можно использовать непосредственно в выражении. С процедурой такое не пройдет...

P.S. То, что ты привел - это функция с побочным эффектом, кстати...
Archon
В общем случае неверны. По идее процедура вообще не возвращает значения. Она может это делать только опосредованно: для Паскаля через var-параметры, например. Функция это тоже может делать. За подробностями сюда: Wikipedia: Функция (программирование)
Vinchkovsky
Цитата
Не в этом отличие процедуры от функции... А в том, что возвращаемое функцией значение можно использовать непосредственно в выражении. С процедурой такое не пройдет...

Понятно, так и отвечал предподавателю, он сказал, что это неверно и выдвинул свою версию. Я ему показал функцию, как в примере, на что он ничего внятного не ответил, сославшись на спешку.

Поэтому и решил уточнить, все ли функции в Паскале есть функциями smile.gif

Возможно, все это звучит странно; дополнительно сбили с толку слова местного "гения" о том, что функции такого виду по определению ни функции ни процедуры (хотя, если уж так и мыслить, то это процедуры).

Спасибо за ответ, который расставил все точки над ''i'' окончательно wink.gif

Archon, спасибо за ссылку; видно, предподаватель ошибся, хотя, возможно, хоте все пояснить понятно.
Vinchkovsky
Читаю в книге:

Цитата
Если алгорит выдает одно значение ... то такой алгоритм может быть алгоритмом-функцией, если выдает много значений ... алгоритмом-процедурой


В.Шелест, "Программирование", "БХВ-Петербург", 2002

Как с этим быть?

Если утверджение верно, то в Паскале процедура выдает значение через var-параметры. Но тогда и функция может возвращать сколько угодно значений через var-параметры?

Единственное логичное объяснение вижу в различии понятий "выдает" и "возвращает", хотя это звучит несколько бредово и предподаватель оперировал вторым понятием unsure.gif .
volvo
Цитата
Если алгорит выдает одно значение ... то такой алгоритм может быть алгоритмом-функцией, если выдает много значений ... алгоритмом-процедурой
Перефразируем: Если алгоритм выдает одно значение, он может быть реализован функцией. Если выдает много значений, то функцией (в чистом виде, без side-effects) он быть не может... И вот тогда уже он может быть реализован либо функцией, либо процедурой. Так понятнее?

Цитата
Но тогда и функция может возвращать сколько угодно значений через var-параметры?
Может. В качестве побочного эффекта, повторяю. Но не должна. А одно - должна вернуть...
Vinchkovsky
Спасибо за помощь, писал сообщение в спешке, хорошо не подумал, уже в дороге вспомнил о побочном эффекте.
Немного запутала фраза с Википедии:

Цитата
Особенность, отличающая ее от процедур, состоит в том, что функция возвращает значение, ... .

Я понял, что функция возращает одно значение, процедура не возращает + каждая из подпрограм может это делать опосредственно. Видимо, на самом деле имелось ввиду, что что функция обязательно возвращает значение, в отличии от процедуры, которая может это делать.

Спасибо за помощь (на практике все понимаю, в теории же хотелось разобраться).
Lapp
Цитата(Vinchkovsky @ 4.11.2008 18:08) *
на практике все понимаю, в теории же хотелось разобраться).

Ты писал где-то выше, что вопрос носит абстрактный характер, не привязанный к языку, но потом все же речь шла только о Паскале. Да, в Паскале фукнкция - это процедура, возвращающая значение. Иными словами, функиональность функции больше, чем процедуры. В языке Си процедур вообще нет, но зато в понятие функции внесено усовершенстовование: она не обязательно должна возвращать значение. Это еще раз показывает, что между функцией и процедурой отличия не принципиального, а чисто технического характера: функцию иногда удобнее использовать для вычисления параметров выражения.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.