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

Вниз

Когда я пишу const aRecord в параметре функции, то туда передаётс   Найти похожие ветки 

 
Linker   (2008-02-10 03:59) [0]

передаётся ссылка или полностью весь рекорд?


 
tButton ©   (2008-02-10 07:29) [1]

туда передается константа.


 
Dmitry S ©   (2008-02-10 08:04) [2]

рекорд копируется и передается в функцию


 
Григорьев Антон ©   (2008-02-10 08:29) [3]


> Dmitry S ©   (10.02.08 08:04) [2]
> рекорд копируется и передается в функцию

Никуда он не копируется, передаётся ссылка.

Вообще, способ передачи const-параметров, насколько мне известно, недокументирован и теоретически может быть изменён, но во всех известныхмне версиях Delphi применяется такое правило: для элементарного типа размером до 4 байт передаётся значение, для остальных типов - ссылка.


 
DVM ©   (2008-02-10 09:47) [4]

procedure p1(var ARec: MyRecord); - передается ссылка

procedure p1(ARec: MyRecord); - создается копия

procedure p1(const ARec: MyRecord); - передается ссылка ибо в копировании нет смысла, т.к. изменять все одно нельзя будет.


 
tButton ©   (2008-02-10 10:10) [5]

а если объект? например stringList?


 
DVM ©   (2008-02-10 10:18) [6]


> tButton ©   (10.02.08 10:10) [5]

Объекты всегда по ссылке.


 
uw ©   (2008-02-10 10:22) [7]

DVM ©   (10.02.08 09:47) [4]
procedure p1(const ARec: MyRecord); - передается ссылка ибо в копировании нет смысла, т.к. изменять все одно нельзя будет.

Этот пример не укладывается в твой тезис:

procedure Change(const Rec: TRec);
var
 ip: ^Integer;
begin
 ip := @Rec.i;
 ip^ := 12;
end;


 
DVM ©   (2008-02-10 10:27) [8]


> uw ©   (10.02.08 10:22) [7]

Это другое. Понятно, что всегда можно поменять значение по какому-либо адресу в памяти. Конечно же имелось в виду что то вроде ARec.A := ...
Вот потому то указатели и являются "небезопасным кодом", что с их применением возможны фокусы типа [7].


 
uw ©   (2008-02-10 10:31) [9]

В таком примере "всегда" поменять подставляемую запись не получится:

procedure Change(Rec: TRec);
var
ip: ^Integer;
begin
ip := @Rec.i;
ip^ := 12;
end;

Процедура просто не знает, где менять.


 
DVM ©   (2008-02-10 10:34) [10]


> В таком примере "всегда" поменять подставляемую запись не
> получится:

Получится еще как. Только все манипуляции будут производиться с копией. Все верно, противоречий нет никаких.


 
uw ©   (2008-02-10 10:39) [11]

Конечно, копию поменяешь, а исходная запись не изменится. А в первом примере изменится. В этом разница. Я же возражаю против тезиса "в копировании нет смысла, т.к. изменять все одно нельзя будет", а не против какого-то противоречия.


 
Джо ©   (2008-02-10 14:27) [12]

> [3] Григорьев Антон ©   (10.02.08 08:29)
>
> > Dmitry S ©   (10.02.08 08:04) [2]
> > рекорд копируется и передается в функцию
>
> Никуда он не копируется, передаётся ссылка.
>
> Вообще, способ передачи const-параметров, насколько мне
> известно, недокументирован и теоретически может быть изменён,
> но во всех известныхмне версиях Delphi применяется такое
> правило: для элементарного типа размером до 4 байт передаётся
> значение, для остальных типов - ссылка.

Еще от соглашений о типе вызова зависит. В общем, CPU window тут судья :)


 
Linker   (2008-02-11 02:20) [13]

А какой смысл передавать копию, если это константа, и всё равно функция ничего в ней изменить не может?

Нет ли там какой-нибудь опции, чтобы точно можно было передать ссылку и чтобы её нельзя было изменять? Что нибудь типа const var aRecord ?


 
ketmar ©   (2008-02-11 02:22) [14]

>[13] Linker (2008-02-11 02:20:00)
>Нет ли там какой-нибудь опции, чтобы точно можно было передать ссылку и
>чтобы её нельзя было изменять?

const x: PaRecord;

PaRecord = ^aRecord;

---
Understanding is not required. Only obedience.


 
Linker   (2008-02-11 02:27) [15]


> ketmar ©   (11.02.08 02:22) [14]
> PaRecord = ^aRecord;


А разве её нельзя будет изменить?
Вообще связываться с указателями не хочу принципиально.


 
ketmar ©   (2008-02-11 02:29) [16]

>[15] Linker (2008-02-11 02:27:00)
>разве её нельзя будет изменить?

кого — её? ты задал конкретный вопрос: «передать ссылку и чтобы её нельзя было изменять». передаётся ссылка, ссылку изменить нельзя, потому что const.

---
Understanding is not required. Only obedience.



Страницы: 1 вся ветка

Текущий архив: 2008.03.23;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.015 c
2-1203585756
webpauk
2008-02-21 12:22
2008.03.23
Некорректное определение Trect


4-1185701082
emfs
2007-07-29 13:24
2008.03.23
размеры рабочего стола


15-1202789867
Slider007
2008-02-12 07:17
2008.03.23
С днем рождения ! 12 февраля 2008 вторник


2-1203946490
Alex8
2008-02-25 16:34
2008.03.23
Включение принтера


15-1202557459
Kolan
2008-02-09 14:44
2008.03.23
Где взять Pascal Script?