Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.11;
Скачать: CL | DM;

Вниз

Описание процедуры   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.045 c
15-1147882047
Копир
2006-05-17 20:07
2006.06.11
А не выпить ли нам грузинского вина?


2-1148377208
Мурзилка
2006-05-23 13:40
2006.06.11
можно ли создать свой шрифт?


2-1148463740
Мурзилка
2006-05-24 13:42
2006.06.11
шрифты


1-1146640969
Konstantin iz Eburga
2006-05-03 11:22
2006.06.11
Chart: изменить тип серии во время работы...


15-1147594333
ArtemESC
2006-05-14 12:12
2006.06.11
Дайте мне вирус!