Выравнивание объектов класса на границу 1 байта на Delphi

Тема в разделе "WASM.BEGINNERS", создана пользователем EvilsInterrupt, 3 окт 2006.

  1. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Код (Text):
    1.   TdPwrite = class(TObject)
    2.   private
    3.     { Private declarations }
    4.     tValue : real;
    5.     tEd    : byte;
    6.     tFlag  : byte;
    7.     tScale : byte;
    8.     procedure SetValue(iValue : real);
    9.     procedure SetEd(iEd : byte);
    10.     procedure SetFlag(iFlag : byte);
    11.     procedure SetScale(iScale : byte);
    12.     function GetValue : real;
    13.     function GetEd : byte;
    14.     function GetFlag : byte;
    15.     function GetScale : byte;
    16.   public
    17.     { Public declarations }
    18.     property Value : real read GetValue write SetValue;
    19.     property Ed : byte read GetEd write SetEd;
    20.     property Flag : byte read GetFlag write SetFlag;
    21.     property Scale : byte read GetScale write SetScale;
    22.   end;
    Объекты этого класса хочу выравнять на границу 1 байта и не через ГУИ среды А программно через дерективы!

    На си есть: #pragma pack(push,1) и #pragma pack(pop), а как это на Дельфи?
     
  2. tmp_name_0001

    tmp_name_0001 New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    85
    Там вроде packed, для структур точно
     
  3. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    tmp_name_0001
    Это Структур! А классов и наверняка? :) Гугл не подсказал, ну нету у меня для него пива! :)
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
  5. tmp_name_0001

    tmp_name_0001 New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    85
  6. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    n0name
    Код (Text):
    1.   param := TdPwrite.Create;
    2.   ShowMessage(IntToStr(SizeOf(TdPwrite)));
    Отображеается цифра 4 !
     
  7. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    EvilsInterrupt
    Компилятор Дельфи выровняет тебе на границу 1 байта tFlag, tScale.
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Ну и что?
    Что странного в этом?
    this в С++ тоже 4 байта.
     
  9. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    n0name
    class Proba
    {
    public:
    int a,b;
    };

    Proba * pProba = new Proba;

    Тута Proba и pProba разные вещи! То что я писал это попытка сделать: SizeOf(Proba) а не siziof(pProba);

    Уточню, что хочу:
    эти вещи должны быть в объекте! и когда я задам массив объектов этого класса, каждый объект должен занимать память равный этим переменным и выравненный на 1 байт!
     
  10. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Type Switch
    Syntax {$A+}, {$A-}, {$A1}, {$A2}, {$A4}, or {$A8}
    {$ALIGN ON}, {$ALIGN OFF}, {$ALIGN 1}, {$ALIGN 2}, {$ALIGN 4}, or {$ALIGN 8}
    Default {$A8}
    {$ALIGN 8}
    Scope Local
    Remarks

    The $A directive controls alignment of fields in Delphi record types and class structures.
    In the {$A1} or {$A-} state, fields are never aligned. All record and class structures are packed.
    In the {$A2} state, fields in record types that are declared without the packed modifier and fields in class structures are aligned on word boundaries.
    In the {$A4} state, fields in record types that are declared without the packed modifier and fields in class structures are aligned on double-word boundaries.

    In the {$A8} or {$A+} state, fields in record types that are declared without the packed modifier and fields in class structures are aligned on quad word boundaries.
    Record type field alignment is described in the Delphi Language Guide. See Record types.
    Regardless of the state of the $A directive, variables and typed constants are always aligned for optimal access. In the {$A8} state, execution will be faster.
    Итого, получаем:
    ...
    {$A1}
    tEd : byte;
    tFlag : byte;
    tScale : byte;
    {$A-}
    ...
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    EvilsInterrupt
    Не получится. SizeOf(TObject) не равен 0. Вообще, ты не туда полез. У тебя 4 переменных, функциональность твоего класса ничем не отличается от простой структуры. Зачем тебе класс? ООП надо применять с умом, а не пытаться впихнуть его всюду.
     
  12. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    IceStudent
    Я только просил подсказать, а не учить как применять! :)
    Я знаю где надо ООП применять и знаю в каких местах. Я не буду объяснять, но ООП в том, что я сейчас делаю Самое то!

    зы:
    Более того слова: "ты не туда полез", напоминают мне Алтын в г.Казани, это комп. диски там продают целый этаж. Так вот там частенько приходишь за конкретной игрушой, к примеру Дум3. Ты знаешь по опыту где в этом магазине лучшее место, и лучший продавец. Ты идешь к этому место, а тебе чуть ли не дорогу перегораживают: "Вот появилась игрушка Крид, нежелаете поиграть?". Тупо, очень тупо, человек пришел не за этим и знает чего он хочет!
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    EvilsInterrupt
    Не ты первый, не ты последний, кто везде кричит про ООП. Ничего личного. Просто в том коде, что ты привёл, класс совершенно не нужен.
     
  14. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    IceStudent
    Что я достигаю с применинием ООП:
    1. Мне не надо писать талмуд по сопровождению, что да как вызвать! и какие структуры каким ф-циями использовать!
    2. Если человек захочет написать компонент в палитру компонентов используя мой класс у него не возникнет затруднений, че трудного применить TComponent ?
     
  15. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    EvilsInterrupt
    Код (Text):
    1. param := TdPwrite.Create;
    2.   ShowMessage(IntToStr(SizeOf(TdPwrite)));
    Попробуй
    ShowMessage(IntToStr(SizeOf(param)))
    param в данном случае экземпляр твоего класса.
     
  16. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    В файле идут подряд сущности, каждая сущность имеет:

    значение - вещественное, 4 байта
    Ед.измер.- 1 байт
    Флаг - 1байт

    Таких сущностей надо n число раз, гибко надо иметь возможностей, в зависимости от ситуации их может и 20 и 45 и 15 и др. кол-во!
    Я написал класс, который описывает одну сущность(В аттаче). Когда я буду читать из файла я хочу чтобы все поля выравнивались на 1 байт и сущности тоже! Пример:

    1 сущность:
    1й байт это значение,
    5й байт это ед. измер.
    6й байт это флаг
    7й байт - НАЧАЛО следующей сущности ( значение след.сущности)

    Хочу когда я читать и писать в файл объектами, т.е. задал адрес объекта класса для WriteFile и чтобы он записал 6 байт ибо стоко в байтах весит структура!

    Именно этого я и хочу добиться.

    Решения которые меня не устраивают по определенным причинам:
    1. создать структуру ее выравнять на границу 1 байта, в классе создать объект этой структуры
    2. Создать структуру ее выравнять на границу 1 байта, написать функции чтения, записи, чтения значения, записи значения и др. вещей по отедельности

    ЗЫ:
    Ради интереса попробуйте в Турбо дельфи присобачить иконку к разрабатываемому компоненту :)