Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.09;
Скачать: CL | DM;

Вниз

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

 
Германн ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.72 MB
Время: 0.03 c
1-1190278304
tytus
2007-09-20 12:51
2007.12.09
Рамка вокруг региона????


2-1195110089
VladSot
2007-11-15 10:01
2007.12.09
Вопрос по TListView


3-1185875301
ChaoX
2007-07-31 13:48
2007.12.09
2 связанные таблицы


2-1194794278
soj
2007-11-11 18:17
2007.12.09
Получить код символа запятой.


15-1194700737
Kostafey
2007-11-10 16:18
2007.12.09
С днем рождения ! 10 ноября