Главная страница
    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.037 c
1-1104136529
Sash
2004-12-27 11:35
2005.01.16
excel


14-1103884084
Skier
2004-12-24 13:28
2005.01.16
Дума и Новый Год


14-1104132785
Narik
2004-12-27 10:33
2005.01.16
Разгатка!!! Связь с файлами!!!


1-1103874094
Steepe Wolf
2004-12-24 10:41
2005.01.16
UTF-8 -> Win1251


9-1096173815
Mitay
2004-09-26 08:43
2005.01.16
Как определить частоту звука?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский