Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> VAR vs. OUT? 
:(
    Опции темы
BraM's
Дата 29.7.2004, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 2.7.2004

Репутация: нет
Всего: 1



Вообщем-то поиск по форуму не дал мне ответа на вопрос - в чём разница между var-папаметрами и out-параметрами?
PM MAIL ICQ   Вверх
Guest
Дата 29.7.2004, 08:50 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











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


Var - дает указатель на облясть памяти отведенную для переменной
  Вверх
BraM's
Дата 29.7.2004, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 2.7.2004

Репутация: нет
Всего: 1



Всё равно не понял.
они ведь оба, получается, дают адрес... то есть передачу по ссылке...
PM MAIL ICQ   Вверх
Akella
Дата 29.7.2004, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



есть такое объявление
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;
PM MAIL   Вверх
Cheba
Дата 29.7.2004, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pointless one
***


Профиль
Группа: Vingrad developer
Сообщений: 1777
Регистрация: 27.11.2003
Где: /dev/null

Репутация: 1
Всего: 62



Цитата
//здесь программа будет работать именно с переменной а
//т.е. будет создана еще одна переменная в памяти и работа будет
//производиться именно с ней
Никак не могк понять как тут можно было вставить "т.е."... =\
PM MAIL ICQ   Вверх
BraM's
Дата 29.7.2004, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 2.7.2004

Репутация: нет
Всего: 1



Код
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.


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

PM MAIL ICQ   Вверх
Cheba
Дата 29.7.2004, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pointless one
***


Профиль
Группа: Vingrad developer
Сообщений: 1777
Регистрация: 27.11.2003
Где: /dev/null

Репутация: 1
Всего: 62



Цитата
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
PM MAIL ICQ   Вверх
BraM's
Дата 29.7.2004, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 2.7.2004

Репутация: нет
Всего: 1



Cheba Так ведь именно про это я и говорю. Результат одинаковй! На кой стрём тогда понадобилось вводить "out"?

PM MAIL ICQ   Вверх
<Spawn>
Дата 29.7.2004, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



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


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Петрович
Дата 29.7.2004, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



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


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

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


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Akella
Дата 30.7.2004, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



извините, ошибочка вышла... sad.gif
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0581 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.