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