![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Описание процедуры
pargo © (2006-05-24 15:14:00)Есть ли разница между использованием следующих процедур ?
Если есть, то какую надо использовать ?
procedure Test1(PrBar:TProgresBar);
begin
PrBar.Position:=0;
end;
procedure Test2(PrBar:Pointer);
begin
TProgresBar(PrBar^).Position:=0;
end;
han_malign (2006-05-25 18:24:00) [1]
> а я думаю будет копироваться
- неправильно думаешь, string это "умный", но указатель, копирование призойдет только при изменении параметра - вот ShortString, статическиемассивы и рекорды - будут копироваться в стек...
З.Ы.
> 2. procedure XXX(const SomeParam: TSomeParamType);
> Компилятор НЕ позволяет изменить параметр, переданный по значению.
XXX(const val: integer) - "простые" параметры передаются по значению.
XXX(const val: TByteArray)/XXX(const val) - "сложные" - по ссылке...
StriderMan (2006-05-25 17:46:00) [2]
> Строка просто так не будет копироваться в процедуру - увеличит
> счетчик ссылок и все тут
а я думаю будет копироваться
ведь если в теле процедуры изменить эту самую строку, "снаружи" ничего не изменится.
А можно подробнее про счетчик ссылок для строк?
Я думал это только для интерфейсов механизм
Loginov Dmitry (2006-05-25 17:43:00) [3]StriderMan © (25.05.06 17:30) [15]
а если передать например procedure StrProc(s: string), то вся строка скопируется в процедуру
Несколько неудачный пример. Строка просто так не будет копироваться в процедуру - увеличит счетчик ссылок и все тут.
TUser (2006-05-25 17:39:00) [4]> Компилятор НЕ позволяет изменить параметр, переданный по значению.
Компилятор передаст указатель и не позволит изменять параметр.
StriderMan (2006-05-25 17:30:00) [5]
> 1. procedure XXX(SomeParam: TSomeParamType);
>
> Компилятор позволяет изменить параметр, переданный по значению.
>
>
> 2. procedure XXX(const SomeParam: TSomeParamType);
>
> Компилятор НЕ позволяет изменить параметр, переданный по
> значению.
>
> 3. procedure XXX(var SomeParam: TSomeParamType);
>
> Компилятор позволяет изменить параметр, переданный по ссылке.
>
Конечно верно, но дело еще в том, что 'var' и 'const' это по сути передача параметра указателем, просто для удобства работаешь с ними как с переменными безо всяких ^
поэтому когда передаете строки или массивы по возможности нужно указывать var или const, тогда переменная не будет копироваться, а если передать например procedure StrProc(s: string), то вся строка скопируется в процедуру, что может сказаться на быстродействии и памяти. При передаче объектов разницы особой нет (переменные объектов есть указатели), т.к. что передать указатель, что указатель на указатель все равно 4 байта.
Сергей М. (2006-05-25 16:27:00) [6]
> veb (25.05.06 16:04) [13]
1. procedure XXX(SomeParam: TSomeParamType);
Компилятор позволяет изменить параметр, переданный по значению.
2. procedure XXX(const SomeParam: TSomeParamType);
Компилятор НЕ позволяет изменить параметр, переданный по значению.
3. procedure XXX(var SomeParam: TSomeParamType);
Компилятор позволяет изменить параметр, переданный по ссылке.
veb (2006-05-25 16:04:00) [7]>Как ты думаешь, чем и почему отличается работа компилятора в случаях
Объясните мне пожалуйста!
MsGuns (2006-05-25 14:40:00) [8]>pirate © [5],[6]
Чушь, сказанная единожды - просто чушь.
Сказанная дважды - уже преступление
;)
Сергей М. (2006-05-25 14:02:00) [9]
> pirate © (24.05.06 22:37) [6]
Как ты думаешь, чем и почему отличается работа компилятора в случаях
1. procedure XXX(SomeParam: TSomeParamType);
2. procedure XXX( constSomeParam: TSomeParamType);
3. procedure XXX( varSomeParam: TSomeParamType);
?
Игорь Шевченко (2006-05-25 13:57:00) [10]
> Если есть, то какую надо использовать ?
Первую
pirate (2006-05-25 13:56:00) [11]считается.
DrPass (2006-05-25 00:34:00) [12]
> pirate © (24.05.06 22:37) [6]
> А вот и нет!
> procedure Test1(PrBar:TProgresBar);
> begin
> PrBar.Position:=0;
> // Здесь изменение Position не отразится на реальном Progressbar'е,
>
...а ты бы сначала попробовал :)
На самом деле еще как отразится. Какая разница, параметр это или нет? Значение у указателя и в программе, и в процедуре указывает на один и тот же объект в памяти. Сам объект при передаче в процедуру, само собой, не копируется. Более того, TProgressBar, как и любой другой классовый тип, является просто псевдонимом типа pointer. Так что PrBar:TProgresBar и PrBar:Pointer - это по сути синонимы.
Leonid Troyanovsky (2006-05-24 23:25:00) [13]
> pirate © (24.05.06 22:37) [6]
> procedure Test2(PrBar:Pointer);
> begin
> TProgresBar(PrBar^).Position:=0;
> // А здесь изменится, тк PrBar - указательна реальный ProgressBar
> end;
А вот и нет!
Бо, это всего лишь пойнтер,
который может указывать хоть в nil.
--
КRegards, LVT.
pirate (2006-05-24 22:37:00) [14]А вот и нет!
procedure Test1(PrBar:TProgresBar);
begin
PrBar.Position:=0;
// Здесь изменение Position не отразится на реальном Progressbar'е,
т.к. PrBar это просто параметр.
end;
procedure Test2(PrBar:Pointer);
begin
TProgresBar(PrBar^).Position:=0;
// А здесь изменится, тк PrBar - указательна реальный ProgressBar
end;
Так же аналогичный эффект должна дать переделанная 1ая процедура:
procedure Test1(var PrBar:TProgresBar);
begin
PrBar.Position:=0;
// Здесь PrBar так же является указателем на реальный объект.
т.к. PrBar это просто параметр.
end;
pirate (2006-05-24 22:37:00) [15]А вот и нет!
procedure Test1(PrBar:TProgresBar);
begin
PrBar.Position:=0;
// Здесь изменение Position не отразится на реальном Progressbar'е,
т.к. PrBar это просто параметр.
end;
procedure Test2(PrBar:Pointer);
begin
TProgresBar(PrBar^).Position:=0;
// А здесь изменится, тк PrBar - указательна реальный ProgressBar
end;
Так же аналогичный эффект должна дать переделанная 1ая процедура:
procedure Test1(var PrBar:TProgresBar);
begin
PrBar.Position:=0;
// Здесь PrBar так же является указателем на реальный объект.
т.к. PrBar это просто параметр.
end;
Сергей М. (2006-05-24 15:22:00) [16]Для компилятора разницы нет - и в том и в другом случае он сгенерирует один и тот же код.
А вот для программиста разница очевидна..
Elen (2006-05-24 15:20:00) [17]
>Ctrl + Alt + C
Что это за сочетание?
TUser (2006-05-24 15:19:00) [18]Ctrl + Alt + C
Elen (2006-05-24 15:17:00) [19]Помоему разницы нет
Используй ту которую удобно (которую понимаешь)