Главная страница
    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.043 c
3-1102591130
Guitar
2004-12-09 14:18
2005.01.16
Ошибка при создании файла UDL


1-1104144168
lexis
2004-12-27 13:42
2005.01.16
Нужен хитрый chart


1-1104141949
Vyacheslav
2004-12-27 13:05
2005.01.16
Как определить тип операционной системы ???


1-1103923596
Drema
2004-12-25 00:26
2005.01.16
вывод информации


11-1085626346
hammer
2004-05-27 06:52
2005.01.16
Как выключить, перезагрузить ПК прогой на kol





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