Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
Время: 1.132 c
15-1147933109
syte_ser78
2006-05-18 10:18
2006.06.11
программа для перекодировки дампа MySql базы


15-1148048657
vidiv
2006-05-19 18:24
2006.06.11
sin(x) = sqrt(2)/2


3-1145346379
Sanych_K_A
2006-04-18 11:46
2006.06.11
Ошибка при подключении к FireBird


3-1145255279
RomanH
2006-04-17 10:27
2006.06.11
IB.Системные таблицы


2-1148395534
AntonXP
2006-05-23 18:45
2006.06.11
Реализация задачи.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский