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

Вниз

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

 
Германн ©   (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.7 MB
Время: 0.052 c
11-1180182392
VPBar
2007-05-26 16:26
2007.12.09
Ошибка TStrListEx.DeleteLast ??


15-1193175070
Прочее
2007-10-24 01:31
2007.12.09
Как сделать чтобы в OnKeyPress проходило сообщение VK_UP ?


1-1190293681
Lpnt
2007-09-20 17:08
2007.12.09
Отображение данных.


2-1195193394
Alex8
2007-11-16 09:09
2007.12.09
Сортировка выборки по вычисляемому полю


15-1194927662
vajo
2007-11-13 07:21
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский