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

Вниз

PByteArray: непонятности   Найти похожие ветки 

 
begin...end ©   (2004-12-31 09:35) [0]

Всем здравствуйте! Вопрос навеян близлежащей веткой :-)

Вот простой пример:

var
 V: Cardinal;
begin
 V := 1000000000;               // 2-й байт: 10011010b = 154d
 ShowMessage(IntToStr(PByteArray(@V)^[2]));  // Конструкция 1
 ShowMessage(IntToStr(PByteArray(@V)[2]));   // Конструкция 2
end.


Не понятно мне вот что - по идее, конструкция 2 вообще "не должна" быть синтаксически верной, ведь PByteArray(@V) - это не массив, а только указатель на него (указатель на статический массив TByteArray), и поэтому никаких "элементов", к которым можно обращаться по индексам, у него нет! Тем не менее, результат выполнения - тот же самый, что и в случае 1.

Это - "поблажка" компилятора, или я совсем ничего не понял?


 
Sandman25 ©   (2004-12-31 09:36) [1]

Поблажка. Аналогично Form.Tag и Form^.Tag


 
Digitman ©   (2004-12-31 09:53) [2]


> begin...end ©   (31.12.04 09:35)


при генерации кода компилятор одинаково интерпретирует обе конструкции, считая 2-ю кострукцию логическим аналогом 1-й .. это относится ко всем указательным типам, предназначенным для работы с областями памяти как с массивами

например,
type
arr: array[..] of Char;
parr: PChar;
chr: Char;
..
//следующие конструкции так же эквивалентны
chr := PChar(@arr)^[i];
chr := PChar(@arr)[i];

см. [1]


 
begin...end ©   (2004-12-31 10:08) [3]

Всем спасибо, понятно!

> [1] Sandman25 ©   (31.12.04 09:36)

> Аналогично Form.Tag и Form^.Tag

Form^.Tag, как раз-таки, компилятор не пропускает...

Всех - с наступающим! :-)


 
Anatoly Podgoretsky ©   (2004-12-31 10:11) [4]

begin...end ©   (31.12.04 09:35)  
а только указатель на него (указатель на статический массив TByteArray), и поэтому никаких "элементов", к которым можно обращаться по индексам

Сам же говоршь - статический массив и как тогда понимать, что никаких элементов нет.
А насчет каре, оно просто не обязательно.


 
begin...end ©   (2004-12-31 10:14) [5]

> [4] Anatoly Podgoretsky ©   (31.12.04 10:11)

> Сам же говоршь - статический массив и как тогда понимать,
> что никаких элементов нет.

Говорю - указатель на статический массив :-)

> А насчет каре, оно просто не обязательно.

Да вот же ж... просто каким-то нелогичным это мне показалось :-)

Вас тоже - с наступающим! :-)


 
Sandman25 ©   (2004-12-31 10:17) [6]

[3] begin...end ©   (31.12.04 10:08)

Точно. Перепутал.


 
Anatoly Podgoretsky ©   (2004-12-31 10:52) [7]

begin...end ©   (31.12.04 10:08) [3]
Для динамических структур компилятор не должен пропускать, разве что только из за внутренних ошибок. Сие документировано по крайней мере для динамических массивов.


 
begin...end ©   (2004-12-31 12:13) [8]

Кстати, не только с массивами такое проходит...

type
 PMyRecord = ^TMyRecord;

 TMyRecord = record
   IntField: Integer
 end;

var
 pRec: PMyRecord;

begin
 New(pRec);
 pRec.IntField := 1;
 Dispose(pRec)
end.


Всю свою сознательную жизнь жил в неведении... :-)



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

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

Наверх




Память: 0.48 MB
Время: 0.027 c
6-1095247733
integral9
2004-09-15 15:28
2005.01.16
post из delphi


1-1104212175
Mate_ru
2004-12-28 08:36
2005.01.16
параметры


3-1102939925
Aleksandr.
2004-12-13 15:12
2005.01.16
Как совместить файловые форматы ADO и ClientDataSet?


1-1104141336
SbtON
2004-12-27 12:55
2005.01.16
Идентификатор потока.


1-1103972269
Volfram
2004-12-25 13:57
2005.01.16
TImageList : пара ламерских вопросов.