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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Параметры в процедурах и функциях, Параметры var, const, out - один нюанс 
:(
    Опции темы
Гость_Traum
Дата 1.7.2005, 15:19 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Возможные варианты:

1. procedure (p:real);

2. procedure (var p:real);

3. procedure (out p:real);

4. procedure (const p:real);

При этом известно что:
1. - происходит выделение памяти и копирование параметра
2. - нет выделения памяти и нет копирования, а работа через указатель
3. - тоже что и 2. только может быть не инициализирована
4. - невозможность изменения

Вопрос:
В варианте 4. непонятно происходит ли выделение памяти и икопирование по аналогии с вариантом 1., от которого вариант 4. отличается недопустимостью изменения параметра?
  Вверх
Akella
Дата 1.7.2005, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



память выделяется только на заданное значение, т.е. память выделяется, но экономно
PM MAIL   Вверх
Vit
Дата 1.7.2005, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


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

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



А какие проблемы если передаётся тип real?


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
poor_yorik
Дата 1.7.2005, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В варианте 4 насколько мне известно память не выделяется, и не копируется. Потому-что при изменении внешнего параметра изменяется и внутренний.
Например.
Код

 var
  st:string;
 procedure dost(const s:string);
  begin
   st:='Haha';
  showmessage(s);
 end;
begin
 st:='HeHe';
 dost(st);
end. 


В єтом случае на єкран выводится 'Haha'. А если бы стояло просто procedure dost(s:string), то на экране б мы увидели 'HeHe'.

--------------------
Семь раз отмерь, один раз - откомпиль.... Семь раз отпей, один раз - отлей... Семь раз отъешь, один раз - не жадничай и другим дай...
PM MAIL YIM   Вверх
December
Дата 1.7.2005, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


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

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



poor_yorik
По-моему, всё наоборот. И разве компилятор позволяет присвоение параметру-константе?


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Guest
Дата 1.7.2005, 17:07 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
А какие проблемы если передаётся тип real?


real в контексте вопроса не имел смысла - (в реалии может быть кошмарно большой массив какого нибудь типа и вообще не real - в примере случайно указал real).

Правильно сформулированный вопрос:
Работает ли вариант 4. (параметр с const) по схеме варианта 1. (копирование и выделения) или по схеме варианта 2. (через указатель) ?

(важным может оказаться быстродействие или память и хотелось бы со знанием выбирать между просто параметром и параметром в качестве const)


  Вверх
Guest
Дата 1.7.2005, 17:12 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











poor_yorik
если это работает то тогда ... вопрос ясен.

Может кто-нибудь это знает из "официоальных" источников (справка, книга)
  Вверх
Гость_Traum
Дата 1.7.2005, 18:24 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











poor_yorik
Ниже следующий код привел к противоположному выводу (копирование и выделение имеет место)
Код

var
  Form1: TForm1;
  st:integer;

implementation
{$R *.dfm}

procedure TForm1.TryToChange(const s:integer);
begin
   st:=st+5;  Panel1.Caption:=IntToStr(s)+'  '+IntToStr(st);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   st:=10;  TryToChange(st);
end;

В результате на панеле появились 10 и 15.
  Вверх
p0s0l
Дата 1.7.2005, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



Если мне не сильно изменяет память, то:
const аналогичен var, только компилятор не позволяет изменить параметр (но если узнать через @ адрес операнда и изменить его, то он изменится и в вызываеющей функции, что говорит о том, что const - тот же var).
Если const-параметр имеет длину <= 4 байт, то он передаётся не ссылкой, а значением (в целях быстродействия, всё равно в регистр умещается полностью)...


--------------------
С уважением, г-н Посол.
PM   Вверх
Medved
Дата 4.7.2005, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

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



Цитата(p0s0l @ 1.7.2005, 21:40)

const аналогичен var, только компилятор не позволяет изменить параметр
...
Если const-параметр имеет длину <= 4 байт, то он передаётся не ссылкой, а значением

Абсолюьно точно. Это так называемый "защищенный указатель", если я ничего не путаю.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
p0s0l
Дата 4.7.2005, 07:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



Есть люди smile, которым не нравится слово "аналогичен". Я перед ними извиняюсь, и чтобы не путать остальных, скажу, что есть маленький нюанс пре передаче const-параметра... Но при правильном программировании на Delphi с этим различием не столкнётесь никогда...
Кому надо - тот найдет эту разницу (при передаче определенных типов данных) smile


--------------------
С уважением, г-н Посол.
PM   Вверх
SoWa
Дата 4.7.2005, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


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

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



странно, передавать константу. Память должна быть изначально выделена тогда?


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Girder
Дата 4.7.2005, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


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

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



p0s0l мог бы сразу написать что енто я не согласен smile

1. При Const передается:
a) Значение(в регистре) - зависит от размера и типа;
б) Указатель на данные(будут ли скопированны при ентом данные, в новое место, зависит от типа - например при Real, Extended будет копирование) - Зависит от типа
в) указатель на указатель данных, например TCaption, const(костанты) и т.п. - Зависит от типа.

2. При var передается указатель(что енто будет регистр или ячейка памяти - по большому счету не важно) на указатель данных - ни от чего не зависит.

PS: Т.е. будет ли выделение памяти при первом варианте - зависит от типа. Будет ли аналогичени var - зависит от типа. Будет ли перадано значение - зависит от размера и типа.

PS2: Зная как работает компилятор можно легко нарушить 1a,1б и "превратить" const в var.

PS3: Надеюсь... теперь понятно разъяснил с чем я не согласен smile

Это сообщение отредактировал(а) Girder - 4.7.2005, 20:44


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
p0s0l
Дата 4.7.2005, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



Цитата
PS3: Надеюсь... теперь понятно разъяснил с чем я не согласен

Честно, про real, extended - не знал (в принципе, если немного подумать, то это логично, что они передаются значением, в целях быстродействия - получается const реализован так, чтобы добиться максимальной производительности)...

Цитата(Girder @ 4.7.2005, 11:30)
PS2: Зная как работает компилятор можно легко нарушить 1a,1б и "превратить" const в var.
Вот это я и называю неправильным программированием smile

thnx за поправку


--------------------
С уважением, г-н Посол.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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