![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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