Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Размер структуры (Record) ... 
:(
    Опции темы
Robus
  Дата 25.6.2009, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Entire



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 15.12.2005

Репутация: 1
Всего: 1



Здравствуйте.

Возник вопрос. Я хочу создать структуру(Record) фиксированного размера. Мне нужно получить структуру размером 512 байт, а полей в ней 64. Размеры полей по ходу написания программы меняются. Соответственно приходится сделать поле FREE из массива байт размером 512-(размер предыдущих описанных полей).
Например:
Код

TYPE TA=RECORD
       A:DWORD;
       B:BYTE;
       FREE:ARRAY[0..512-5-1] OF BYTE;
     END;


Это очень не удобно, поскольку постоянно нужно заниматься контролем размера. 

В идеале хотелось бы что-то вроде такого:
Код

TYPE TA=RECORD (SIZE:512)
       A:DWORD;
       B:BYTE;
     END;


Или на худой конец что-то вроде такого:
Код

TYPE TA=RECORD
       A:DWORD;
       B:BYTE;
       FREE:ARRAY[0..512-1-DWORD(TA)-DWORD(TA.FREE)] OF BYTE;
     END;


Как можно решить подобную проблему ?
PM MAIL   Вверх
1000000dollars
Дата 25.6.2009, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 6.10.2007

Репутация: нет
Всего: 8



Я вижу два варианта: 
1) работа с указателями и приведение типов (не люблю указатели, поэтому этот вариант не описываю)
2) использовать возможности языка для размещения разных переменных по одному адресу памяти (приведённый код делает именно так)


Код

PROGRAM Project2;
{$APPTYPE CONSOLE}

USES
 Windows,
 SysUtils;

TYPE
 T_512bytes = {отключает выравнивание}packed{/отключает выравнивание} array [0..511] of byte;
 T_A = {отключает выравнивание}packed{/отключает выравнивание} record
               A: Cardinal;
               B: Byte;
               C: boolean;
              end;

PROCEDURE Dump (data: T_512bytes);
           VAR
             i: integer;

           BEGIN
            WriteLn ('Dump: ');
            for i:=0 to 511 do
             Write (IntToHex (data[i],2));
            WriteLn;
           END;

VAR
 b : T_512bytes;
 r : T_A {расположить переменные по одному адресу}absolute{/расположить переменные по одному адресу} b;

BEGIN
 // забиваем память нулями, потому что менеджер памяти этого может и не сделать
 FillMemory (@b, 512, 0);

 // смотрим дамп памяти
 Dump (b);

 // запихиваем что-то в структуру
 r.A := $DEADC0DE;
 r.B := $FF;
 r.C := true;

 // смотрим дамп памяти
 Dump (b);

 // распечатываем размеры выделенного блока памяти и стурктуры 
 WriteLn ('Size of block = ', SizeOf (b));
 WriteLn ('Size of record = ', SizeOf (r));

 WriteLn ('Done.');
 ReadLn;
END.

PM MAIL   Вверх
CodeMonkey
Дата 25.6.2009, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Код
  TA = record
  case Byte of
    1: (
         A: DWord; 
         B: Byte
        );
    2: (_Dummy: array[0..511] of Byte);
  end;


Это сообщение отредактировал(а) CodeMonkey - 25.6.2009, 10:48


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Robus
Дата 25.6.2009, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Entire



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 15.12.2005

Репутация: 1
Всего: 1



Это оно !!! Низкий поклон для CodeMonkey !!! Работает как часы !!! Я правда не понимаю, для чего здесь case, и почему 1 а потом 2, а не 0 и 1. Но об этом я сейчас почитаю в сетях ... Теперь я хоть знаю что искать ...

Спасибо ещё раз !!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0437 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.