Форум: "Прочее";
Текущий архив: 2008.03.23;
Скачать: [xml.tar.bz2];
ВнизКогда я пишу 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c