Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];

Вниз

Различия между процедурой и функцией   Найти похожие ветки 

 
Kemuri   (2007-11-06 16:21) [0]

Когда я учился в универе и у нас был старый добрый паскаль, нам преподша на экзамене задала такой вопрос: сколько различий между процедурой и функцией в паскале и какие они. По ее мнению на этот вопрос есть единственный правильный ответ. Любые попытки оспорить ее мнение расценивались как провал. Вот теперь мне интересно узнать мнения программистов на этот счет. Итак, сколько и какие?
ЗЫ "правильный" ответ оглашу чуть позже.


 
Kerk ©   (2007-11-06 16:22) [1]

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


 
oldman ©   (2007-11-06 16:23) [2]

Ответ первый: А процедура должна возвращать результат? А функция?


 
oldman ©   (2007-11-06 16:26) [3]


> Kerk ©   (06.11.07 16:22) [1]


Попрошу не путать голову программиста с головой Kerkа. Различия есть.


 
megabyte ©   (2007-11-06 16:28) [4]

1) Функция имеет тип, а процедура - нет.
2) Имя функции можно использовать как операнд, т.е. в выражении, а имя процедуры - нет.


 
Ega23 ©   (2007-11-06 16:31) [5]

функция  возвращает результат.
процедура результат не возвращает.


 
oldman ©   (2007-11-06 16:32) [6]


> По ее мнению на этот вопрос есть единственный правильный
> ответ.


А этот ответ действительно правильный?
Или это только "по ее мнению"?


 
Kerk ©   (2007-11-06 16:33) [7]

oldman ©   (06.11.07 16:23) [2]

> Ответ первый: А процедура должна возвращать результат? А
> функция?

Обе не должны в Delphi. Различия между процедурой и функцией есть смысл обсуждать только в контексте синтаксиса конкретного языка.

megabyte ©   (06.11.07 16:28) [4]

> 2) Имя функции можно использовать как операнд, т.е. в выражении,
>  а имя процедуры - нет.

Не имя функции, а результат ее выполнения. Пусть дельфовый синтаксис с толку не сбивает.

---
Я повторюсь, различия только в интерпретации этой подпрограммы тем, кто ее использует. Функция отличается от процедуры только тем, что чего-то полезное записывает в EAX. И вызывающий эту особенность использует.


 
oldman ©   (2007-11-06 16:35) [8]


> Kerk ©   (06.11.07 16:33) [7]
> oldman ©   (06.11.07 16:23) [2]
> > Ответ первый: А процедура должна возвращать результат?  А  функция?
>
> Обе не должны в Delphi.


Можно ссылку на источник? С каких это пор функция не возвращает результат?


 
Alkid ©   (2007-11-06 16:36) [9]


> 2) Имя функции можно использовать как операнд, т.е. в выражении,
>  а имя процедуры - нет.

Имя процедуры тоже можно использовать как операнд в выражении. В частности для взятия адреса процедуры :)


 
Kerk ©   (2007-11-06 16:36) [10]


> oldman ©   (06.11.07 16:35) [8]

Не присваивай ничего переменной Result, вот и нет тебе результата


 
clickmaker ©   (2007-11-06 16:39) [11]


> [10] Kerk ©   (06.11.07 16:36)

это уже, как суслик пресловутый )


 
TUser ©   (2007-11-06 16:39) [12]

У функции есть результат (всегда) и тип этого результата. Еще они объявляются по-разному.

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


 
ZeroDivide ©   (2007-11-06 16:40) [13]


> Не присваивай ничего переменной Result, вот и нет тебе результата


Никакой результат - тоже результат


 
oldman ©   (2007-11-06 16:40) [14]


> Kerk ©   (06.11.07 16:36) [10]


А если тебе не нужен результат, то это и называется процедурой, а не функцией. Функция нужна именно для получения ответа.


 
Vlad Oshin ©   (2007-11-06 16:49) [15]

f1
Procedures and functions, referred to collectively as routines, are self-contained statement blocks that can be called from different locations in a program. A function is a routine that returns a value when it executes. A procedure is a routine that does not return a value.

Function calls, because they return a value, can be used as expressions in assignments and operations. For example,

I := SomeFunction(X);

calls SomeFunction and assigns the result to I. Function calls cannot appear on the left side of an assignment statement.

Procedure calls--and, when extended syntax is enabled ({$X+}), function calls--can be used as complete statements. For example,

DoSomething;

calls the DoSomething routine; if DoSomething is a function, its return value is discarded.

Procedures and functions can call themselves recursively.


 
oxffff ©   (2007-11-06 16:52) [16]


> Любые попытки оспорить ее мнение расценивались как провал


Препода в студию.


 
oldman ©   (2007-11-06 16:54) [17]


> Vlad Oshin ©   (06.11.07 16:49) [15]


"Попрошу неприличными словами не выражаться!" (Шариков П.П. ©)
:)))


 
Sonia ©   (2007-11-06 16:59) [18]


> Препода в студию.

Тогда уже не в студию, а на костер :)


 
Германн ©   (2007-11-06 17:00) [19]


> Различия между процедурой и функцией

Идентификатор функции может стоять в левой части выражения, а идентификатор процедуры нет.


 
Amoeba ©   (2007-11-06 17:06) [20]


> Германн ©   (06.11.07 17:00) [19]
>
>
> > Различия между процедурой и функцией
>
> Идентификатор функции может стоять в левой части выражения,
>  а идентификатор процедуры нет.
>

Приведи пример.


 
TUser ©   (2007-11-06 17:07) [21]

Он просто изнутри монитора смотрит.


 
Johnmen ©   (2007-11-06 17:07) [22]


> Германн ©   (06.11.07 17:00) [19]

Какого выражения?


 
Piter ©   (2007-11-06 17:12) [23]

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

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

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


 
Piter ©   (2007-11-06 17:14) [24]

Ega23 ©   (06.11.07 16:31) [5]
функция  возвращает результат.
процедура результат не возвращает


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

procedure Test(var i: integer);

вызывай эту прцоедуру и она вернет тебе результат в переменную i.


 
Германн ©   (2007-11-06 17:14) [25]


> Johnmen ©   (06.11.07 17:07) [22]

function Test: Boolean;
begin
 Test:=True;
end;


 
Ega23 ©   (2007-11-06 17:15) [26]


> Не присваивай ничего переменной Result, вот и нет тебе результата


ЕМНИП, там FillChar с нулём идёт. Так что Result даже без присвоения ноль.


 
Kerk ©   (2007-11-06 17:16) [27]


> Ega23 ©   (06.11.07 17:15) [26]

FillChar кого? Регистра eax??


 
Ega23 ©   (2007-11-06 17:22) [28]


> FillChar кого? Регистра eax??


Или это я с прямым углом путаю?

Ром, не помню точно. С этим как-то Hint какой-то связан...


 
Amoeba ©   (2007-11-06 17:24) [29]


> Германн ©   (06.11.07 17:14) [25]
>
>
> > Johnmen ©   (06.11.07 17:07) [22]
>
> function Test: Boolean;
> begin
>  Test:=True;
> end;

Нет тут слева ф-ии. Это тот же Result.


 
Германн ©   (2007-11-06 17:25) [30]


> Amoeba ©   (06.11.07 17:24) [29]


> Нет тут слева ф-ии. Это тот же Result.

Читай [19] внимательно и с выражением :-)


 
TUser ©   (2007-11-06 17:27) [31]


> ЕМНИП, там FillChar с нулём идёт. Так что Result даже без
> присвоения ноль.

А это вообще зависит, как грицца, от. Вот пример

function A (I: integer): integer;
begin
 if I < 10 then result := I;
end;

var i: integer;
begin
 for i := 1 to 10 do
   writeln (A (i));
end.


 
Доброжелатель   (2007-11-06 17:29) [32]

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


 
Johnmen ©   (2007-11-06 17:29) [33]


> Германн ©   (06.11.07 17:14) [25]

Нееее, ну это несерьезно...

> ALL
Итак, выношу на голосование:
Есть ли различия между процедурой и функцией? (ДА/НЕТ)
Я голосую - НЕТ.
0/1

PS
Вообще предлагаю все вопросы решать демократические, т.е. голосованием.


 
kaif ©   (2007-11-06 17:31) [34]

megabyte ©   (06.11.07 16:28) [4]
1) Функция имеет тип, а процедура - нет.


type
 TMyProc = procedure(var s: string);
 TMyFunc = function(const s: xtring): string;

И то и другое имеет тип.
Даже метод имеет тип:

type
 TMyProcMethod = procedure(var s: string) of object;
 TMyFuncMethod = function(const s: xtring): string of object;

И то и другое может возвращать значение. Процедура может возвращать значение, если передать параметр по ссылке.
-----------
По сабжу.
Мой IQ говорит о том, что возможны два "единственно правильных" ответа у училки:

1. Функция возвращает результат и поэтому может использоваться в выражениях (Ваш ответ)
2. При объявлении фукции в Pascal обязательно указывать тип возвращаемого значения, а при объявлении процедуры вообще нельзя указывать какой-либо тип возвращаемого значения. Дело в том, что во многих других языках для процедур обязательно указывать тип возвращаемого значения void.


 
Ega23 ©   (2007-11-06 17:33) [35]

Complete class at cursor    inherited для перегруженных функций не ставит.
Типа Result := inherited (....)

Так что процедура - лучше функции!  :)))


 
TUser ©   (2007-11-06 17:34) [36]

Лучше все-таки спросить у училки, заглюки у каждого свои.


 
KSergey ©   (2007-11-06 17:34) [37]

> TUser ©   (06.11.07 17:27) [31]

И все же компилятор - он не дурак. Он не зря варнинги пишет, которые в приличном обществе за ошибки расцениваются.


 
Kemuri   (2007-11-06 17:34) [38]

Так, господа программисты,... всем вам двойки :)
Ответ такой:
1) процедура возвращает результат, функция - нет
2) процедура имеет тип
3) в теле функции функция хотя бы раз должна присвоить себе значение.
ВСЕ!!!

Озвучу свое мнение: процедура возвращает результат, функция - нет. Это единственное отличие. Все остальное - следствия.

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

Да, и на мое возражение "Я считаю, что вы неправы..." был резкий ответ "а я считаю что тебе надо пару поставить". Даже доводы слушать не стала. Пришлось согласится на вышеперечисленные 3 различия. (чувство было будто признал что земля плоская под страхом быть сожженным на костре)


 
KSergey ©   (2007-11-06 17:36) [39]

> Kemuri   (06.11.07 17:34) [38]

Вы ничего не путаете?


 
Vlad Oshin ©   (2007-11-06 17:49) [40]

а вообщето, нет, наверное, разницы



Страницы: 1 2 3 вся ветка

Форум: "Прочее";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.047 c
15-1194896394
Tracy Hide
2007-11-12 22:39
2007.12.09
Касательно ИИ


15-1194451108
Max3m
2007-11-07 18:58
2007.12.09
PasswordChar +XP


2-1195026948
Sergl
2007-11-14 10:55
2007.12.09
Как заставить клиента ждать ответа с сервера(Сокеты)


2-1195122648
San1
2007-11-15 13:30
2007.12.09
как избавиться от зависания


11-1180165434
Vladimir Kladov
2007-05-26 11:43
2007.12.09
Версия 2.63





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский