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

Вниз

есть ли разница в объявлении таких процедур?   Найти похожие ветки 

 
Peter1   (2005-08-05 22:59) [0]

procedure DoSome(Value: Integer);
procedure DoSome(var Value: Integer);
procedure DoSome(out Value: Integer);

Вопрос в принципе прост. И даже есть описание в хелпе. Но объясните мне по-русски разницу. Потому что хелп я не понял. Единственное что понятно так это когда передается значение через параметр const, ясно что внутри прецедуры нельзя будет присвоить новое значение константе. заранее спасибо.


 
DrPass ©   (2005-08-05 23:24) [1]

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


 
Джо ©   (2005-08-05 23:27) [2]


> В третьем случае в процедуру ничего не передается, но она
> должна вернуть какое-либо значение, которое будет присвоено
> внешней переменной

Это не совсем верная формулировка, имхо. Как это - ничего не передается?

procedure DoSomething (out Param: Integer);
begin
 WriteLn (Param)
end;

var
 A: Integer;
begin
 A := 10;
 DoSomething(A);
end.

Прекрасным образом процедура напечатает переданное ей значение, то есть 10.


 
Eraser ©   (2005-08-05 23:49) [3]

Джо ©   (05.08.05 23:27) [2]

Справка говорит об обратном:
An out parameter, like a variable parameter, is passed by reference. With an out parameter, however, the initial value of the referenced variable is discarded by the routine it is passed to. The out parameter is for output only; that is, it tells the function or procedure where to store output, but doesn"t provide any input.

Но возможно если out применять не в COM или CORBA приложениях, то out = var.


 
Mx ©   (2005-08-05 23:59) [4]

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


 
Джо ©   (2005-08-06 00:19) [5]


>  [3] Eraser ©   (05.08.05 23:49)

Справку то я читал. Просто считаю неверным такое:

> В третьем случае в процедуру ничего не передается

равно и такое:

> The out parameter is for output only; that is, it tells
> the function or procedure where to store output, but doesn"t
> provide any input

Т.е, я считаю, что в данном случае в Справке - ошибка. Не уточняется тип данных, для которых применимо описание.
По-моему, только если передавать ссылку на интерфейс, описание параметра out будет соответствовать описанному в Справке.
Вот в таком случае, действительно, интерфейс уничтожится перед передачей в процедуру и в нее передастся nil:

type
 ISomeIntf = interface
   function GetString: string;
 end;

 TSomeClass = class (TInterfacedObject, ISomeIntf)
   function GetString: string;
 end;

function TSomeClass.GetString: string;
begin
 Result := "Interface is not null"
end;

procedure DoSomething (out Intf: ISomeIntf);
begin
 if Intf <> nil then
   WriteLn(Intf.GetString) // эту строку мы не увидим
end;

var
Intf: ISomeIntf;
begin
 Intf := TSomeClass.Create;
 DoSomething(Intf);
 ReadLn
end.



 
Джо ©   (2005-08-06 00:26) [6]

Чтобы не темнить, скажу, что обнуляются только переменные с управляемым временем жизни. Длинные строки, варианты, дин. массивы и интерфейсы.

Кажись, ничего не упустил, ибо пиво рулит :0)


 
Mx ©   (2005-08-06 00:51) [7]


> Джо ©   (06.08.05 00:26) [6]
> Чтобы не темнить, скажу, что обнуляются только переменные
> с управляемым временем жизни

Хорошо сказал :)


 
Eraser ©   (2005-08-06 00:52) [8]

Джо ©   (06.08.05 00:26) [6]

Так оно и есть, а они на всякий случай всё обобщили, чтобы путаницы не было )


 
GuAV ©   (2005-08-06 00:57) [9]

Даже для обычных переменных имеет смысл различать out/var, т.к. это влияет на предупреждения компилятора.

Что касается procedure DoSome(Value: Integer); , то для типов с управляемым временем жизни следует по возможности (если переменная не изменяется в подпрограмме) заменить на procedure DoSome(const Value: Integer); .


 
Джо ©   (2005-08-06 01:36) [10]


> Что касается procedure DoSome(Value: Integer); , то для
> типов с управляемым временем жизни следует по возможности
> (если переменная не изменяется в подпрограмме) заменить
> на procedure DoSome(const Value: Integer); .

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


 
Peter1   (2005-08-06 01:49) [11]

вот теперь понял. спасибо.


 
злобная танька   (2005-08-07 14:37) [12]

я тоже думала, что в справке ошибка.
теперь всё ясно. спасибо Джо.



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

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

Наверх





Память: 0.47 MB
Время: 0.011 c
8-1115212792
Артём
2005-05-04 17:19
2005.09.11
Видео-кодеки


4-1121359278
SpyBoy
2005-07-14 20:41
2005.09.11
Определение программы


3-1122554184
lexa12345
2005-07-28 16:36
2005.09.11
Fast Report 3


14-1124192137
pasha_golub
2005-08-16 15:35
2005.09.11
Давайте померяемся...


1-1124792531
TikTanik
2005-08-23 14:22
2005.09.11
Обьединение классов! :)





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