Текущий архив: 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.7 MB
Время: 0.039 c