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

Вниз

Условное описание   Найти похожие ветки 

 
Sung   (2005-12-07 09:53) [0]

В книге С. Бобровского "Delphi 7" натолкнулся на такой пример.

type
 TIntDetail = record
   case V : Byte of
     1 : (I : integer);
     2 : (B1, B2, B3, B4 : Byte);
   end;
var
 ID : TIntDetail;
begin
 ID.I := $FFFF;
 ...
end

Автор утверждает, что под I и B1, B2, B3, B4 отведена одна общая область памяти. Реально же в этом примере только B4 равно $FF, а B1, B2, B3 равны нулю.
Под отладчиком (включив окно CPU) я обнаружил, что поле B1 находится по смещению 1, B2 - 2, B3 - 3, B4 - 4. Поле I тоже 4. Т.е. перекрываются только I и B4.
Теперь я вообще ничего не понимаю. То ли я что-то не так сделал, то ли это такая хитрая оптимизация компилятора. Объясните, пожалуйста.


 
MBo ©   (2005-12-07 10:03) [1]

попробуй так:
TIntDetail =  packed record

заодно посмотри SizeOf(ID) при упакованной записи и без packed

кроме того, изучи влияние директивы компилятора {$A} (без packed)


 
Sung   (2005-12-07 10:24) [2]

Вот спасибо. Все понял.


 
Sapersky   (2005-12-07 13:58) [3]

Видимо, "аффтар" не учёл, что V включается в запись как ещё одно поле (для меня, признаюсь, тоже неожиданность). Из-за этого при включённом выравнивании I съезжает на 3 байта.
Вот так всё получается:

TIntDetail = record
  case Byte of
    1 : (I : integer);
    2 : (B1, B2, B3, B4 : Byte);
  end;



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2005.12.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.44 MB
Время: 0.011 c
4-1130302678
HardMan
2005-10-26 08:57
2005.12.25
Определение модели винта и его скорости чтения/записи


2-1134256939
Antony17
2005-12-11 02:22
2005.12.25
Запуск стандартных процедур


14-1133550555
AlexWlad
2005-12-02 22:09
2005.12.25
неопределенность понятий...


14-1133402215
Grom PE
2005-12-01 04:56
2005.12.25
Есть ли на Delphi SDL? (Simple Directmedia Layer)


14-1133622497
Piter
2005-12-03 18:08
2005.12.25
Ну блин, долбанный дос, долбанные программисты





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