Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Параметры в процедурах и функциях


Автор: Гость_Traum 1.7.2005, 15:19
Возможные варианты:

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
память выделяется только на заданное значение, т.е. память выделяется, но экономно

Автор: Vit 1.7.2005, 15:42
А какие проблемы если передаётся тип real?

Автор: poor_yorik 1.7.2005, 16:09
В варианте 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'.

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

Автор: Guest 1.7.2005, 17:07
Цитата
А какие проблемы если передаётся тип real?


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

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

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


Автор: Guest 1.7.2005, 17:12
poor_yorik
если это работает то тогда ... вопрос ясен.

Может кто-нибудь это знает из "официоальных" источников (справка, книга)

Автор: Гость_Traum 1.7.2005, 18:24
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
Если мне не сильно изменяет память, то:
const аналогичен var, только компилятор не позволяет изменить параметр (но если узнать через @ адрес операнда и изменить его, то он изменится и в вызываеющей функции, что говорит о том, что const - тот же var).
Если const-параметр имеет длину <= 4 байт, то он передаётся не ссылкой, а значением (в целях быстродействия, всё равно в регистр умещается полностью)...

Автор: Medved 4.7.2005, 00:14
Цитата(p0s0l @ 1.7.2005, 21:40)

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

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

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

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

Автор: Girder 4.7.2005, 11:30
p0s0l мог бы сразу написать что енто я не согласен smile

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

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

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

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

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

Автор: p0s0l 4.7.2005, 18:02
Цитата
PS3: Надеюсь... теперь понятно разъяснил с чем я не согласен

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

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

thnx за поправку

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