Возможно ли?
От: Skyvox  
Дата: 12.06.08 08:08
Оценка:
Сделать на Delphi такую структуру из С++:

typedef struct _F_G_CTRL{
union{
struct{
DWORD A : 12;
DWORD B : 3;
DWORD C : 1;
DWORD D : 5;
DWORD E : 3;
DWORD F : 8;
}bits;
DWORD AS_ULONG;
};
}FG_GC *pFG_GC
Re: Возможно ли?
От: Danchik Украина  
Дата: 12.06.08 08:55
Оценка: 4 (1)
Здравствуйте, Skyvox, Вы писали:

S>Сделать на Delphi такую структуру из С++:


[Skip]

Это можно упростить
union FG_GC
{
    struct
    {
        DWORD A : 12;
        DWORD B : 3;
        DWORD C : 1;
        DWORD D : 5;
        DWORD E : 3;
        DWORD F : 8; 
    } bits;
    DWORD AS_ULONG;
};


Сразу скажу, Delphi не поддерживает битовых переменных.
Вам достаточно привести буффер который к вам приходит к DWORD. Все остальное побитовые операции:

type
  FG_GC = DWORD;

// функции доставания данных 

function FG_GC_GetA(const data : FG_GC) : Integer;
begin
  Result := data and $0FFF;
end;

function FG_GC_GetB(const data : FG_GC) : Integer;
begin
  Result := (data shr $0C) and $7;
end;

function FG_GC_GetC(const data : FG_GC) : Integer;
begin
  Result := (data shr $0F) and $1;
end;

function FG_GC_GetD(const data : FG_GC) : Integer;
begin
  Result := (data shr $10) and $1F;
end;

function FG_GC_GetE(const data : FG_GC) : Integer;
begin
  Result := (data shr $15) and $7;
end;

function FG_GC_GetF(const data : FG_GC) : Integer;
begin
  Result := (data shr $18) and $0FF;
end;

// функции записи

procedure FG_GC_SetA(var data : FG_GC; Value : Word);
begin
  data := (Value and $0FFF) or (data and $0FFFFF000);
end;

procedure FG_GC_SetB(var data : FG_GC; Value : Word);
begin
  data := ((Value and $7) shl $0C) or (data and $0FFFF8FFF);
end;

procedure FG_GC_SetC(var data : FG_GC; Value : Word);
begin
  data := ((Value and $1) shl $0F) or (data and $0FFFF7FFF);
end;

procedure FG_GC_SetD(var data : FG_GC; Value : Word);
begin
  data := ((Value and $1F) shl $10) or (data and $0FFE0FFFF);
end;

procedure FG_GC_SetE(var data : FG_GC; Value : Word);
begin
  data := ((Value and $7) shl $15) or (data and $0FF1FFFFF);
end;

procedure FG_GC_SetF(var data : FG_GC; Value : Word);
begin
  data := ((Value and $0FF) shl $18) or (data and $0FFFFFF);
end;


Удачи
Re[2]: Возможно ли?
От: Skyvox  
Дата: 12.06.08 09:02
Оценка:
Здравствуйте, Danchik, Вы писали:...

Спасибо за совет! Но проблема то в том, что мне нужно вот такую структуру передавать в функцию, которая импортируется из dll библиотеки. А что если просто передавать DWORD переменную? данное битовое поле в памяти все равно же распологается как DWORD?
Re[3]: Возможно ли?
От: Danchik Украина  
Дата: 12.06.08 09:07
Оценка:
Здравствуйте, Skyvox, Вы писали:

S>Здравствуйте, Danchik, Вы писали:...


S>Спасибо за совет! Но проблема то в том, что мне нужно вот такую структуру передавать в функцию, которая импортируется из dll библиотеки. А что если просто передавать DWORD переменную? данное битовое поле в памяти все равно же распологается как DWORD?


Вам достаточно передать вот этот DWORD, по моему я ясно выражался
В даном случае эта структура это 4 байта и ничего более, остольное просто указания компилятору к удобному доступу к битовым значениям.
Re[4]: Возможно ли?
От: Skyvox  
Дата: 12.06.08 09:10
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Здравствуйте, Skyvox, Вы писали:


S>>Здравствуйте, Danchik, Вы писали:...


S>>Спасибо за совет! Но проблема то в том, что мне нужно вот такую структуру передавать в функцию, которая импортируется из dll библиотеки. А что если просто передавать DWORD переменную? данное битовое поле в памяти все равно же распологается как DWORD?


D>Вам достаточно передать вот этот DWORD, по моему я ясно выражался

D>В даном случае эта структура это 4 байта и ничего более, остольное просто указания компилятору к удобному доступу к битовым значениям.

Сппсибо, попробую...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.