Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > VAR vs. OUT?


Автор: BraM's 29.7.2004, 08:44
Вообщем-то поиск по форуму не дал мне ответа на вопрос - в чём разница между var-папаметрами и out-параметрами?

Автор: Guest 29.7.2004, 08:50
OUT
Цитата
Поскольку в программе может быть много операторов, то встроенный оператор
OUT сообщит компилятору, какая из переменных несет выходной результат.


Var - дает указатель на облясть памяти отведенную для переменной

Автор: BraM's 29.7.2004, 09:05
Всё равно не понял.
они ведь оба, получается, дают адрес... то есть передачу по ссылке...

Автор: Akella 29.7.2004, 09:12
есть такое объявление
procedure myproc(var a:integer);
begin
//здесь программа будет работать именно с переменной а
//т.е. будет создана еще одна переменная в памяти и работа будет
//производиться именно с ней
end;


procedure myproc(a:integer);
begin
//здесь программа будет работать с ссылкой в памяти на переменую а
end;

procedure myproc(b:string; out a:integer);
begin
//можно написать так a:=25;
end;

//а где-то дальше
var c:integer;
begin
myproc("lcmvfgfg", c);//c:=25
end;

Автор: Cheba 29.7.2004, 09:20
Цитата
//здесь программа будет работать именно с переменной а
//т.е. будет создана еще одна переменная в памяти и работа будет
//производиться именно с ней
Никак не могк понять как тут можно было вставить "т.е."... =\

Автор: BraM's 29.7.2004, 09:21
Код
porcedure proc1(var a: integer);
begin
  a := 25;
end;

procedure proc2(out a: integer);
begin
  a := 25;
end;

var
  a1, a2: integer;
begin
  a1 := 0;
  a2 := 0;
  proc1(a1);
  proc2(a2);
end.


Вот объясните мне - в чём разница?

Автор: Cheba 29.7.2004, 09:32
Цитата
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.

For example, consider the procedure heading

Код
procedure GetInfo(out Info: SomeRecordType);


When you call GetInfo, you must pass it a variable of type SomeRecordType:

Код
var MyRecord: SomeRecordType;
...
GetInfo(MyRecord);


But you're not using MyRecord to pass any data to the GetInfo procedure; MyRecord is just a container where you want GetInfo to store the information it generates. The call to GetInfo immediately frees the memory used by MyRecord, before program control passes to the procedure.

Out parameters are frequently used with distributed-object models like COM and CORBA. In addition, you should use out parameters when you pass an uninitialized variable to a function or procedure.
Хотя, как показывают эксперименты, значение передаваемое в out параметр все же никуда не девается.

Код
procedure TForm1.proc1(var a: Byte);
begin
 a := a + 1;
end;

procedure TForm1.proc2(out a: Byte);
begin
 a := a + 1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 b := 10;
 proc1(b);
 Caption := IntToStr(b);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 b := 10;
 proc2(b);
 Caption := IntToStr(b);
end;
Клики по обеим кнопкам выдадут одинаковый результат. hmmm.gif

Автор: BraM's 29.7.2004, 09:44
Cheba Так ведь именно про это я и говорю. Результат одинаковй! На кой стрём тогда понадобилось вводить "out"?

Автор: <Spawn> 29.7.2004, 10:52
Цитата
На кой стрём тогда понадобилось вводить "out"?
Хотя бы для того чтобы показать, что данный параметр может использоваться лишь как выходной, то есть значение его формируется в теле функции и помещается по переданому адресу. Похожую аналогию можно привести и для const параметров.

Автор: Петрович 29.7.2004, 21:38
Цитата
такое объявление
procedure myproc(var a:integer);
begin
//здесь программа будет работать именно с переменной а
//т.е. будет создана еще одна переменная в памяти и работа будет
//производиться именно с ней
end;


procedure myproc(a:integer);
begin
//здесь программа будет работать с ссылкой в памяти на переменую а
end;

С точностью до НАОБОРОТ!

Автор: Akella 30.7.2004, 08:54
извините, ошибочка вышла... sad.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)