Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

PByteArray: непонятности [D7, Win2k]


begin...end ©   (2004-12-31 09:35:00) 

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

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

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.

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


begin...end   (2004-12-31 12:13:00) [1]

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

type
 PMyRecord = ^TMyRecord;

 TMyRecord = record
   IntField: Integer
 end;

var
 pRec: PMyRecord;

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


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


Anatoly Podgoretsky   (2004-12-31 10:52:00) [2]

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


Sandman25   (2004-12-31 10:17:00) [3]

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

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


begin...end   (2004-12-31 10:14:00) [4]

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

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

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

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

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

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


Anatoly Podgoretsky   (2004-12-31 10:11:00) [5]

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

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


begin...end   (2004-12-31 10:08:00) [6]

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

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

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

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

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


Digitman   (2004-12-31 09:53:00) [7]


> 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]


Sandman25   (2004-12-31 09:36:00) [8]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо