Форум: "Начинающим";
Текущий архив: 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.01 c