Главная страница
    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]

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


 
b z   (2007-11-06 17:53) [41]

что то с "детсва" вспомнилось: разница  - функция может вернуть на 1 результат больше чем процедура :)


 
Игорь Шевченко ©   (2007-11-06 18:00) [42]

Парой больше, парой меньше...


 
Alkid ©   (2007-11-06 18:01) [43]


> 3) в теле функции функция хотя бы раз должна присвоить себе
> значение.

Ну вот это не факт. Может и не присваивать. Только тогда warning и undefined behavior


 
Германн ©   (2007-11-06 18:11) [44]


> Alkid ©   (06.11.07 18:01) [43]
>
>
> > 3) в теле функции функция хотя бы раз должна присвоить
> себе
> > значение.
>
> Ну вот это не факт. Может и не присваивать. Только тогда
> warning и undefined behavior
>

Читай сабж.
> Когда я учился в универе и у нас был старый добрый паскаль


 
KSergey ©   (2007-11-06 18:11) [45]

> Alkid ©   (06.11.07 18:01) [43]
> Ну вот это не факт. Может и не присваивать. Только тогда

лично я бы эцих прописал.


 
Правильный_Вася   (2007-11-06 18:20) [46]


> 2) процедура имеет тип

???


 
Alkid ©   (2007-11-06 18:23) [47]


> лично я бы эцих прописал.

Да не эцих, а error :)


 
Kemuri   (2007-11-06 18:26) [48]

> KSergey Вы ничего не путаете?
да, заглючил уже сам
1) функция возвращает результат, процедура - нет
2) функция имеет тип
3) в теле функции функция хотя бы раз должна присвоить себе значение.
но думаю вы поняли


 
Azize ©   (2007-11-06 18:39) [49]


> 3) в теле функции функция хотя бы раз должна присвоить себе
> значение.
> но думаю вы поняли

не обязательно!!!!!!!!!!!!!!!!!!!!!


 
oxffff ©   (2007-11-06 18:41) [50]


> но думаю вы поняли


Функциональное программирование?


 
Alkid ©   (2007-11-06 18:44) [51]


> Функциональное программирование?

А при чём здесь это? Это, имхо, из другой оперы :)


 
Kemuri   (2007-11-06 18:47) [52]

> не обязательно!!!!!!!!!!!!!!!!!!!!!
Сам знаю что необязательно!!!!!!!!!!!!!! Повторюсь, это не мои слова. Но если пытаться это подвести под какую либо логику, то функция, не присваивающая себе значение (исключаем result) является процедурой, даже если обьявлена как функция. Думаю это надо понемать именно так.


 
Piter ©   (2007-11-06 19:22) [53]

Ega23 ©   (06.11.07 17:22) [28]
> FillChar кого? Регистра eax??

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

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


хинт, скорее всего связан с тем, чтобы метод использовать в callback вызовах WinApi.


 
Некто   (2007-11-06 19:29) [54]


> функция, не присваивающая себе значение (исключаем result)
> является процедурой, даже если обьявлена как функция

Тогда получается, что это процедура, которая имеет тип (п. 2)... Препод вас в рекурсию хотел загнать. :)


 
Anatoly Podgoretsky ©   (2007-11-06 20:12) [55]

> megabyte  (06.11.2007 16:28:04)  [4]

Оба тезиса неверны.


 
Anatoly Podgoretsky ©   (2007-11-06 20:15) [56]

> Kerk  (06.11.2007 16:36:10)  [10]

Не присваивай и не возвращает - это две большие разницы.
А откуда у не присваивает уши растут мы знаем.


 
Anatoly Podgoretsky ©   (2007-11-06 20:15) [57]

> ZeroDivide  (06.11.2007 16:40:13)  [13]

А он какой всегда


 
Anatoly Podgoretsky ©   (2007-11-06 20:19) [58]

> Piter  (06.11.2007 17:12:23)  [23]

В стек говоришь, а про регистры не слышал.
А есть процессоры без стека


 
Anatoly Podgoretsky ©   (2007-11-06 20:23) [59]

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

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

Test := Test + 1;

А мы посмотрим на твое выражение. Только сильно не выражайся :-)


 
Anatoly Podgoretsky ©   (2007-11-06 20:25) [60]

> Johnmen  (06.11.2007 17:29:33)  [33]

Особенно хорошо решать голосование вопрос крутится ли солнце вокруг земли.


 
Anatoly Podgoretsky ©   (2007-11-06 20:30) [61]

> Alkid  (06.11.2007 18:23:47)  [47]

А если это функция/функционал класса RandomInt?
Тогда это уже не будет ошибкой, но предупреждение получишь.


 
Piter ©   (2007-11-06 20:36) [62]

Удалено модератором


 
Anatoly Podgoretsky ©   (2007-11-06 20:42) [63]

> Piter  (06.11.2007 20:36:02)  [62]

Пишу от души, ничем себя не ограничивая.
И тебе привет.


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


> Германн ©   (06.11.07 17:25) [30]
>
>
> > Amoeba ©   (06.11.07 17:24) [29]
>
>
> > Нет тут слева ф-ии. Это тот же Result.
>
> Читай [19] внимательно и с выражением :-)

Не надо софистики!


 
Dimaxx ©   (2007-11-06 21:21) [65]

Есть еще 1 отличие. Функцию можно вызвать и как процедуру и как функцию, а процедуру как функцию не вызовешь.


 
Германн ©   (2007-11-06 21:21) [66]


> Anatoly Podgoretsky ©   (06.11.07 20:23) [59]
>
> > Германн  (06.11.2007 17:14:25)  [25]
>
> Это старый синтаксис и смысл здесь другой, ничего функции
> не присваивается.

А я этого и не говорил.

> попробуй сделай
>
> Test := Test + 1;
>
> А мы посмотрим на твое выражение.

Не дождётесь!


 
Черный Шаман   (2007-11-06 21:23) [67]


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


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

Чаще всего оно смешивается.


 
Anatoly Podgoretsky ©   (2007-11-06 21:34) [68]

> Германн  (06.11.2007 21:21:06)  [66]

Ну тогда ты не понял меня, слева не функция, а просто слово, по синтаксису означает Result

> Не дождётесь!

Да я от тебя другого и не ожидал, знал что ты испугаешься.


 
Kolan ©   (2007-11-06 21:41) [69]

Ессно разница есть.

ЗЫ
 Ветки про основы всегда вызывают горячие споры :)


 
oxffff ©   (2007-11-06 21:43) [70]


> Alkid ©   (06.11.07 18:44) [51]
>
> > Функциональное программирование?
>
> А при чём здесь это? Это, имхо, из другой оперы :)


Имхо такие требования препода смахивают именно в сторону ФП.


 
Jukadze   (2007-11-06 22:00) [71]

Черный Шаман   (06.11.07 21:23) [67]

>Если концептуально, то функция располагает к функциональному программированию(без состояния), процедура к императивному программированию(с состоянием).

К функциональному программированию располагает отсутствие возможности создавать побочные эффекты при выполнении подпрограмм.
А именно отсутствие присваивание и наличие только связывания (binding).


 
Galinka ©   (2007-11-06 22:32) [72]

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


 
Ins ©   (2007-11-07 00:20) [73]

>>нам преподша на экзамене задала такой вопрос

Надо было задать встречный вопрос: "На каком уровне абстракции? На машинном или на человеческом?"


 
Германн ©   (2007-11-07 02:02) [74]


> Johnmen ©   (06.11.07 17:29) [33]
>
> > ALL
> Итак, выношу на голосование:
> Есть ли различия между процедурой и функцией? (ДА/НЕТ)
> Я голосую - НЕТ.
> 0/1
>
> PS
> Вообще предлагаю все вопросы решать демократические, т.е.
>  голосованием.
>

Я голосую - ДА.
Функцию (в нынешней мировой ситуации, поскольку на суть сабжа никто не обращает внимания, даже его автор) можно использовать везде. Процедуру же нельзя использовать в выражениях. Ни в левой части (даже если это всего лишь её идентификатор), ни в правой.


 
Kemuri   (2007-11-07 02:08) [75]

>на суть сабжа никто не обращает внимания, даже его автор
Так суть уже исчерпана давно... хва тут флудить уже :)


 
guav ©   (2007-11-07 02:10) [76]

> Ни в левой части (даже если это всего лишь её идентификатор)
> , ни в правой.

В правой можно.


 
guav ©   (2007-11-07 02:13) [77]

Я голосую ДА.


 
Германн ©   (2007-11-07 02:18) [78]


> guav ©   (07.11.07 02:10) [76]
>
> > Ни в левой части (даже если это всего лишь её идентификатор)
> > , ни в правой.
>
> В правой можно.
>

Это как?


 
guav ©   (2007-11-07 02:20) [79]

> [78] Германн ©   (07.11.07 02:18)


var P: procedure;
begin
 P := Beep;
end;


 
Германн ©   (2007-11-07 02:22) [80]


> Kemuri   (07.11.07 02:08) [75]
>
> >на суть сабжа никто не обращает внимания, даже его автор
> Так суть уже исчерпана давно... хва тут флудить уже :)
>

Тогда поясни. Ты говоришь о паскале времён ТР или о современном Дельфи?
По сабжу следует первое, по большинству ответов - второе.
Так как тебя понимать, Саид?


 
Германн ©   (2007-11-07 02:25) [81]


> guav ©   (07.11.07 02:20) [79]

Я пошутил в [19], ты пошутил в [79].
Мы с тобой одной крови, ты и я.
:-)


 
Kemuri   (2007-11-07 05:43) [82]

>Германн ©   (07.11.07 02:22) [80]
>Тогда поясни. Ты говоришь о паскале времён ТР или о современном >Дельфи?
>По сабжу следует первое, по большинству ответов - второе.

На уровне начального программирования, коем мы занимались в уневере, разниц между подпрограммами паскаля и делфи вроде как нету. (я не говорю про техническую сторону.)  Меня интересовало только одно - будут ли такие люди среди программистов, которые разделят мнения нашей преподши. Таких вроде нету :) Вот и все что я хотел узнать. Ожидал десяток или два ответов, а тут вдруг такая активность непойми с чего.... *в шоке*


 
Думкин ©   (2007-11-07 06:03) [83]

> разниц между подпрограммами паскаля и делфи вроде как нету

Вообще-то есть. :) Если брать тот же ТурбоПаскаль5.5 и уже 7, а потом и Дельфи - произошли серьезные изменения, например передача открытых массивов. Или это техническая сторона?


 
Думкин ©   (2007-11-07 06:05) [84]

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


 
Gydvin ©   (2007-11-07 07:02) [85]

Мое имхо

Разницы в принципе нет. В функции, как и в процедуре можно вернуть значение через ссылку на переменную. Другое дело, что для возврата значения проще и красивее использовать функцию, а не процедуру и то при условии, что результат выполнения этой функции будет использоваться один раз, без повторной (как бы правильно сказать) инициализации. И если работаешь с простыми типами. Если это не так, то необходимо создавать промежуточный буфер, в который будут складываться возвращаемые функцией значения, что в свою очередь ставит под сомнение ценность функции, как подпрограммы возвращающей результат!

Я голосую – НЕТ разницы.


> И использование функции как процедуры, без использования
> результата выполнения - туда же. Раньше это было ошибкой.
>  Сейчас норма.

Изврат имхо. Никакой нормальный программист не будет так делать.


 
Думкин ©   (2007-11-07 07:14) [86]

> Gydvin ©   (07.11.07 07:02) [85]

Почему? Ведь вы сами пишите, что ниакой разницы нет, а потом пишите, что это изврат использовать функцию, как процедуру  в некоторых случаях? Так есть разница или нет разницы?


 
Gydvin ©   (2007-11-07 07:28) [87]


> Думкин ©   (07.11.07 07:14) [86]
> > Gydvin ©   (07.11.07 07:02) [85] Почему? Ведь вы сами
> пишите, что ниакой разницы нет, а потом пишите, что это
> изврат использовать функцию, как процедуру  в некоторых
> случаях? Так есть разница или нет разницы?

Читать потом такой код не удобно, так как ожидаешь от нее, что должна вернуть result :)


 
KSergey ©   (2007-11-07 07:36) [88]

> Gydvin ©   (07.11.07 07:28) [87]
> Читать потом такой код не удобно, так как ожидаешь от нее,
>  что должна вернуть result :)

Так она и возвращает. В чем проблема?


 
KSergey ©   (2007-11-07 07:41) [89]

> Kemuri   (06.11.07 18:26) [48]
> но думаю вы поняли

Ну уж нет уж. Когда пошел такой разговор -то всего чего угодно можно ожидать.

> Kemuri   (06.11.07 18:26) [48]
> 1) функция возвращает результат, процедура - нет
> 2) функция имеет тип
> 3) в теле функции функция хотя бы раз должна присвоить себе значение.

Ok, а с какими пунктами из приведенных лично вы не согласны? Т.е. в чем конкретно выражалось желание оспорить ее мнение? Или суть разногласий была лишь в том, чтобы верно посчитать эти пункты, т.к. вопрос стоял "сколько различий между процедурой и функцией"?


 
Gydvin ©   (2007-11-07 07:42) [90]

Читаем внимательно

>
> Думкин ©   (07.11.07 06:05) [84]
>
> И использование функции как процедуры, без использования
> результата выполнения
- туда же. Раньше это было ошибкой.
>  Сейчас норма.


 
Anatoly Podgoretsky ©   (2007-11-07 08:42) [91]

> Думкин  (07.11.2007 07:14:26)  [86]

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


 
uw ©   (2007-11-07 10:03) [92]

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


 
_uw_ ©   (2007-11-07 10:07) [93]

Удалено модератором


 
Alkid ©   (2007-11-07 10:25) [94]


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

А как же быть с функциями, выполняющими какое-то действие (побочный эффект) и возвращающимим результат выполнения? Тоже дурной тон?


 
euru ©   (2007-11-07 10:27) [95]


> uw ©   (07.11.07 10:03) [92]

>  В современных языках самок плохое, что она может сделать,
>  - это возбудить исключение

:)


 
Alkid ©   (2007-11-07 10:44) [96]


> >  В современных языках самок плохое, что она может сделать,
> >  - это возбудить исключение

А если исключение хорошо возбудится, то самка далеко не уйдёт :)


 
uw ©   (2007-11-07 10:54) [97]

Alkid ©   (07.11.07 10:25) [94]
А как же быть с функциями, выполняющими какое-то действие (побочный эффект) и возвращающимим результат выполнения? Тоже дурной тон?

Ты имеешь в виду что-то типа

function CreateDir(const Dir: string): Boolean;

Что сделаешь - sheet happens. Но нельзя же все слова воспринимать чересчур буквально :)


 
_uw_ ©   (2007-11-07 10:57) [98]

А насчет "самок", похоже, мне пора сходить к личному психотерапевту :-О


 
Kerk ©   (2007-11-07 10:59) [99]


> uw ©   (07.11.07 10:54) [97]
> _uw_ ©   (07.11.07 10:57) [98]

И насчет раздвоения личности тоже сходи :)))


 
uw ©   (2007-11-07 11:01) [100]

Kerk ©   (07.11.07 10:59) [99]
И насчет раздвоения личности тоже сходи :)))

Вряд ли он поможет. Но я опять забыл, как мне сделать, чтобы не лез другой ник :-(


 
Anatoly Podgoretsky ©   (2007-11-07 15:40) [101]

> uw  (07.11.2007 10:54:37)  [97]

Это только синтактически функция, а реально функционал.
Приходится мириться как с неизбежным злом.


 
Черный Шаман   (2007-11-07 16:00) [102]


> Gydvin ©   (07.11.07 07:02) [85]
>
>
> > И использование функции как процедуры, без использования
> > результата выполнения - туда же. Раньше это было ошибкой.
>
> >  Сейчас норма.
>
> Изврат имхо. Никакой нормальный программист не будет так
> делать.


Возврат функций которые возвращают значения типа Bool или Boolean часто игнорируется в программах.


 
Галинка ©   (2007-11-07 16:01) [103]

Anatoly Podgoretsky ©   (07.11.07 15:40) [101]

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


 
Галинка ©   (2007-11-07 16:02) [104]

это касается Си и Си-диеза ))


 
Anatoly Podgoretsky ©   (2007-11-07 16:08) [105]

> Галинка  (07.11.2007 16:01:43)  [103]

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


 
uw ©   (2007-11-07 17:55) [106]

Anatoly Podgoretsky ©   (07.11.07 15:40) [101]
Это только синтактически функция, а реально функционал.
Приходится мириться как с неизбежным злом.

Ну да. Я вот у себя нашел такой метод:

function TGrPointsList.AddPoint(Minute: Integer; U: Double): Boolean;

Что он возвращает? А возвращает он то, что написано в комментарии:

// Если добавлена новая точка или изменилась начальная точка,
// то функция возвращает True

Ну, не бред, а? А напиши я

procedure TGrPointsList.AddPoint(Minute: Integer; U: Double; var NewPoint: Boolean);

и не надо было б писать комментарий. Правда, в вызывающем методе пришлось бы определить переменную. Так и с приведенным выше "функционалом".


 
@!!ex ©   (2007-11-07 18:33) [107]

1) Заступлюсь за препода.
Надо помнить, что препод должен объяснить конкретику ВСЕМ студентам. А половина из них - Не в теме. Поэтому препод все заведомо упрощает, даже если это и не совсем корректно. Тем кто не в теме - это пофиг(сложное объяснение все ранво не поймут), те кто в теме - сами разберутся более глубоко. Сам это понял недавно, когда понадобилось объяснять это студентам.
2) Собственно по воспросу.
Разницы между процедурой и функцией нет.
Грубо говоря, функция это таже процедура, только у которой есть дополнительный параметр var Result, который пользователь не передает, им полностью компилятор рулит.


 
Kemuri   (2007-11-07 20:07) [108]

>KSergey ©   (07.11.07 07:41) [89]
> > Kemuri   (06.11.07 18:26) [48]
> > 1) функция возвращает результат, процедура - нет
> > 2) функция имеет тип
> > 3) в теле функции функция хотя бы раз должна присвоить
>  
> Ok, а с какими пунктами из приведенных лично вы не согласны?
>  Т.е. в чем конкретно выражалось желание оспорить ее мнение?
>  Или суть разногласий была лишь в том, чтобы верно посчитать
> эти пункты, т.к. вопрос стоял "сколько различий между процедурой
> и функцией"?
Да, именно в этом и была суть разногласий. Свое мнение я уже озвучивал. Различием я считаю только пункт 1, остальное следствие из п.1. Даже если все следствия считать за различия, то п.2... а функция ли имеет тип или возвращаемый результат. И как тогда быть с разницей слов Procedure и Function? почему это не пункт 4?


 
wendy parkinson   (2007-11-07 20:15) [109]

1. Процедура возвращает пустой результат (пусть тот, кто считает, что, void это не пустой результат, первым бросит камень в свой монитор)
2. Процедура имеет тип (пусть тот, кто считает, что void (my_proc_ptr_t*)(int, char**) это не тип, см п.1)
3. Ничего подобного, она должна написать return; (ну вы поняли).


 
vpbar ©   (2007-11-07 20:27) [110]

вот понаписали :)
Ну внесу свои пять копеек.
Различия всего два в описании
function Func(a,b:byte):Integer;
procedure Proc(a,b:byte);
И в и в использовании
x:=Proc(1,1); // так нельзя
x:=Func(1,1);// а так можно


 
vpbar ©   (2007-11-07 20:33) [111]

Да  еще  несколько раз выше видел > 2) функция имеет тип
Дык и процедура тоже
TProc=procedure (a,b:integer); // тип процедуры из 110


 
@!!ex ©   (2007-11-07 21:41) [112]


> x:=Proc(1,1); // так нельзя

И так можно. просто компилятор этого не понимает. Достаточно добавиьт в процедуру еще один параметр(возвращаемое значение), и вызов делать ассемблерный, получим функцию. Что и требовалось доказать. Функция - таже процедура, но расписывается она компилятором по другому.
Рассуждать о различиях между процедурой и функцией, примерно тоже самое, что рассуждать о различиях между классическоей передачей параметров и stdcall.


 
vpbar ©   (2007-11-07 22:18) [113]

>>@!!ex ©   (07.11.07 21:41) [112]
Уважаемый, насколько я понял речь шла о паскале?
А на асемблере вообще нет ни функций ни процедур, есть только стек регистры память и комманды.
ЗЫ. А классическая передача параметров это как?


 
@!!ex ©   (2007-11-07 22:23) [114]


> Уважаемый, насколько я понял речь шла о паскале?

Конечно, мы же на форуме дельфи вроде? :))


> А на асемблере вообще нет ни функций ни процедур, есть только
> стек регистры память и комманды.

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


> ЗЫ. А классическая передача параметров это как?

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


 
vpbar ©   (2007-11-07 22:46) [115]

>>@!!ex ©   (07.11.07 22:23) [114]

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

Класс. Тогда массив строка класс и запись - тоже по сути одно и тоже куча бит. Отличается только удобным доступом к отдельным группам бит. Собственно, процедура тоже что и бесусловный переход отличается удобным способом возврата в точку после вызова. И вообще все отличия между разными языками программирования только формальные.
ЗЫ Все пыль, тфу ты  - все суть биты.


 
@!!ex ©   (2007-11-07 23:11) [116]


> vpbar ©   (07.11.07 22:46) [115]

Это вы уже утрируете.
Функция и процедура отличаються только тем, явно или не явно передается последний параметр: Result, и есть ли он вообще.
Они не отличаються ни с точки зрения кода получившегося, ни с точки зрения программера.
Тоесть:
R:=1+sqrt(N)
и
var
 Result:single;
sqrt(N,Result);
R:=1+Result;

получим практически идеентичный код.


 
@!!ex ©   (2007-11-07 23:13) [117]

Это
> Тогда массив строка класс и запись - тоже по сути одно и
> тоже куча бит.

нет. Разница между процедурой и функцией примерно тоже самое, что разница между string и PChar.


 
Однокамушкин   (2007-11-08 08:49) [118]


> @!!ex ©   (07.11.07 18:33) [107]
> 1) Заступлюсь за препода.
> Надо помнить, что препод должен объяснить конкретику ВСЕМ
> студентам. А половина из них - Не в теме. Поэтому препод
> все заведомо упрощает, даже если это и не совсем корректно.
>  Тем кто не в теме - это пофиг(сложное объяснение все ранво
> не поймут), те кто в теме - сами разберутся более глубоко.
>  Сам это понял недавно, когда понадобилось объяснять это
> студентам.

ИМХО в данном случае не стоит заступаться

Преподу действительно приходится многое упрощать в расчёте на средний уровень, но если препод видит, что у конкретного студента понимание уже переросло этот уровень, он не должен заставлять такого студента соглашаться с шаблонным ответом, а наоборот, в меру своих возможностей ещё больше повысить этот уровень, а не общаться как в Kemuri   (06.11.07 17:34) [38]

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

> Ins ©   (07.11.07 00:20) [73]
> Надо было задать встречный вопрос: "На каком уровне абстракции?
>  На машинном или на человеческом?"

Я бы только добавил сюда ещё несколько возможных уровней - уровень машинного кода, уровень ЯВУ, уровень математической абстракции над ЯВУ...

Но судя по [38], за такой встречный вопрос у этой преподши пара гарантирована :(((((((


 
Dib@zol ©   (2007-11-08 13:57) [119]

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

Два первых параметра - соответственно в EAX и EDX, остальные - в стек с конца. Стандартная дельфяная директива __fastcall.



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

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

Наверх





Память: 0.79 MB
Время: 0.071 c
11-1180370896
Rusya
2007-05-28 20:48
2007.12.09
Help: Обработчик OnDrawCell


15-1194968623
IOrist
2007-11-13 18:43
2007.12.09
Почиму в орешнике 1 страница?


15-1194162093
Riply
2007-11-04 10:41
2007.12.09
Маленькие, разряжающие обстановку, моменты.


15-1194616987
Parus
2007-11-09 17:03
2007.12.09
Запрет хостов!


2-1195234812
Иринка
2007-11-16 20:40
2007.12.09
Цикл не работает ... ?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский