Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.042 c
1-1104440915
Kolan
2004-12-31 00:08
2005.01.16
Как проверить истек ли TimeOut при работе с портом


1-1104350997
Алексей
2004-12-29 23:09
2005.01.16
Первая буква в слове.


1-1104159928
Фёдор Мегатронов
2004-12-27 18:05
2005.01.16
Пара вопросов на счёт винча и файлов.


1-1104217745
Cosinus
2004-12-28 10:09
2005.01.16
Как в IE определяет, что под курсором именно картинка?


14-1104411165
syte_ser78
2004-12-30 15:52
2005.01.16
вопрос по Treeview





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский