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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что делает VAR в процедуре 
V
    Опции темы
StepRu
  Дата 15.8.2007, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Подскажите пожалуйста

Код

procedure MyProc(var M:TMemoryStream)


и

Код

procedure MyProc(M:TMemoryStream)


В чём у них разница? Ведь M:TMemoryStream уже является указателем на объект, но если поставить VAR - что измениться? Пожалуйста, дайте обоснованный ответ! с указанием на источник.
PM MAIL   Вверх
MetalFan
Дата 15.8.2007, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



Цитата(StepRu @  15.8.2007,  14:09 Найти цитируемый пост)
дайте обоснованный ответ! с указанием на источник. 

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

Это сообщение отредактировал(а) MetalFan - 15.8.2007, 14:17


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
StepRu
Дата 15.8.2007, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(MetalFan @  15.8.2007,  14:15 Найти цитируемый пост)

в первом случае параметр передается по ссылке и его значение можно изменить внутри процедуры.
во втором - по значению. т.е. изменение его внутри процедуры не приведет к изменению вне ее.

Неа, это относиться не к классам =( Вот если бы там был не TMemoryStream а Integer, то вопросов бы не возникло. 

Код

procedure m(t:TButton);
begin
  t.Height:=10;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
m(Button1);
end;

процедура m без проблем меняет внешний объект как с Var, так и без него.
PM MAIL   Вверх
ivashkanet
Дата 15.8.2007, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

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



StepRu, изменяет части объекта, но не весь объект!

Попробуй
Код

procedure m(t:TButton);
begin
  t = anOtherButton;
end;

PM MAIL WWW ICQ   Вверх
StepRu
Дата 15.8.2007, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ivashkanet  А по какому принципу он эти части определяет? Например когда я юзал TMemoryStream и писал из процедуры во внешний объект методом WriteBuffer, то во внешнем объекте в начале всё было ок, но 40 байт он недописывал. Вар конечно усё исправил, но первые байты он почему то записал без Var =|
PM MAIL   Вверх
ivashkanet
Дата 15.8.2007, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

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



StepRu, ничего не понял.
Дельфи я не знаю. Просто это межъязыковой вопрос (в C# все точно так же).
Суть в том, что при передаче  по "ссылке" (val) мы можем модифицировать объект на который эта "ссылка" ссылается.
Код
procedure m(var i:Integer, var t:TButton);
begin
  i := 5;
  t := Button123;
end;

Если же мы передаём "по значению" (без var), то модифицировать ссылку на объект нельзя, зато можно модифицировать сам объект
Код
procedure m(var i:SuperInteger, var t:TButton);
begin
  i.Value := 5;
  t := Button123; -- не прокатит
  t.Height:=10; -- прокатит
end;

PM MAIL WWW ICQ   Вверх
Yanis
Дата 15.8.2007, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 72
Всего: 111



Цитата(StepRu @  15.8.2007,  15:45 Найти цитируемый пост)
процедура m без проблем меняет

Она не меняет. Она тока вызывает пропертю Height, а уже она меняет.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
bems
Дата 15.8.2007, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 31
Всего: 88



с варом можно переписать ссылку ссылкой на другой объект


--------------------
Обижено школьников: 8
PM MAIL   Вверх
StepRu
Дата 15.8.2007, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Млин =) Народ, я наверное плохо объясняю, но мне надо модифицировать внешний объект из процедуры, передав в неё ссылку на этот объект!

Код

procedure m(t:TMemoryStream);
var
  i:Word;
begin
for I := 1 to 10 do
  t.WriteBuffer(I,SizeOf(I));
ShowMessage(IntToStr(t.Size));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  value,i:Word;
begin
MemStr:=TMemoryStream.Create;
m(MemStr);
MemStr.Position:=0;
for I := 1 to 10 do
begin
  MemStr.ReadBuffer(value,SizeOf(value));
  if value<>I then
    ShowMessage('Ошибка в записи №'+IntToStr(I)+'где value = '+IntToStr(value));
end;
ShowMessage(IntToStr(MemStr.Size));
end;

 как вы видите, я внутри функции m никакой другой объект не присваиваю t. Кстати, фукция нормально пашет как с Var, так и без него, изменяя данные в  памяти с помощью объекта MemStr, переданного в функцию. Так вот у меня вопрос в чём - что этот VAr делает, когда в качестве типа параметра указан класс? Он лишь позволяет ссылаться на другой объект внутри функции? Просто например если тип был бы Integer, то без Var он бы не изменился вне функции, а с классом он меняется! Так вот, как влияет VAR на внешний объект? из примера понял - что никак =/

PS. Был более сложный код, где записывались данные не однотипные, так вот там если не указать VAR, memStr не досчитался бы нескольких записей.

PS 2. Кстати, если указать VAR, то взятие адреса @

Код

procedure TForm1.m(var t:TMemoryStream);
var
  i:Word;
begin
if @t=@memStr

вернёт естественно True. А вот если я Var не укажу, то ссылка на объект просто копируется? Но это никак не будет влиять на обращение к внешнему объекту и работу с его методами, свойствами, конструктором и деструктором? Просто реально был случай, когда без Var исчезало несколько байт в потоке памяти.

Это сообщение отредактировал(а) StepRu - 15.8.2007, 16:25
PM MAIL   Вверх
bems
Дата 15.8.2007, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 31
Всего: 88



var нужен чтобы записать в переменную ссылку на новый объект. При изменении значений полей объекта сама ссылка остается неизменной и var не нужен но и не мешает.
Цитата(StepRu @  15.8.2007,  16:04 Найти цитируемый пост)
как вы видите, я внутри функции m никакой другой объект не присваиваю t. 
значит вар тебе никчему

Цитата(StepRu @  15.8.2007,  16:04 Найти цитируемый пост)
Просто например если тип был бы Integer, то без Var он бы не изменился вне функции, а с классом он меняется! 
с классом значение переменной тоже не меняется, а меняется содержимое памяти где-то начиная с адреса на который _указывает_ переменная. Поэтому в принципе все то же самое

Добавлено через 48 секунд
Цитата(StepRu @  15.8.2007,  16:04 Найти цитируемый пост)
PS. Был более сложный код, где записывались данные не однотипные, так вот там если не указать VAR, memStr не досчитался бы нескольких записей.

давай этот код, там и посмотрим

Добавлено через 9 минут и 2 секунды
Цитата(StepRu @  15.8.2007,  16:04 Найти цитируемый пост)
Просто реально был случай, когда без Var исчезало несколько байт в потоке памяти.

 smile  smile 


--------------------
Обижено школьников: 8
PM MAIL   Вверх
StepRu
Дата 15.8.2007, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



bems
Спасибо огромное. Я понял в чём была ошибка - исправил усё. реально ступил в адресации, т.к. очень запутан проект и там действительно указатель  передавать надо в главную программу smile 

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.1148 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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