![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сшная структура из MSDN - как понимать такие поля ?
GuAV © (2005-09-03 22:13:00)typedef struct _DCB {
...
DWORD fBinary: 1;
DWORD fParity: 1;
DWORD fOutxCtsFlow:1;
DWORD fOutxDsrFlow:1;
DWORD fDtrControl:2;
DWORD fDsrSensitivity:1;
DWORD fTXContinueOnXoff:1;
DWORD fOutX: 1;
DWORD fInX: 1;
DWORD fErrorChar: 1;
DWORD fNull: 1;
DWORD fRtsControl:2;
DWORD fAbortOnError:1;
DWORD fDummy2:17;
...
В windows pas их вообще нет.
Это просто объявление несуществующего поля, и значения, которое оно якобы принимает, или же дело здесь сложнее ?
Anatoly Podgoretsky (2005-09-04 08:54:00) [1]GuAV © (04.09.05 00:26) [6]
Ничего, данная языковая конструкция не имеет ничего общего с количеством байт
GuAV © (04.09.05 01:31) [8]
В книгу приколов. Особенно интересно право/лево в памяти.
GuAV (2005-09-04 01:31:00) [2]Джо © (04.09.05 1:22) [7]
Спасибо.
"Some bit field members are stored left to right others are stored right to left in memory."
Весело.
Джо (2005-09-04 01:22:00) [3]http://www.cs.cf.ac.uk/Dave/C/node13.html
GuAV (2005-09-04 00:26:00) [4]Что в DWORD 32 бита я знаю.
Вопрос из [3]
> DWORD что значит ?
следовало бы сфорулировать так:
Если в структуре из [0] заменить DWORD на WORD или BYTE, поменялось бы что нибудь или нет ?
Anatoly Podgoretsky (2005-09-04 00:20:00) [5]GuAV © (03.09.05 23:25) [3]
DWORD = WORD*2 = BYTE/4 = 32 BITS
GuAV (2005-09-03 23:49:00) [6]Вроде так...
type
TExpandedDCBFlags = record
fBinary,
fParity,
fOutxCtsFlow,
fOutxDsrFlow,
fDtrControl,
fDsrSensitivity,
fTXContinueOnXoff,
fOutX,
fInX,
fErrorChar,
fNull,
fRtsControl,
fAbortOnError: DWORD
end;
function ExpandDcbFlags(Flags: DWORD): TExpandedDCBFlags;
begin
with Result do
begin
fBinary := Flags and 1 shl 0;
fParity := Flags and 1 shl 1;
fOutxCtsFlow := Flags and 1 shl 2;
fOutxDsrFlow := Flags and 1 shl 3;
fDtrControl := Flags and $3 shl 4;
fDsrSensitivity := Flags and 1 shl 6;
fTXContinueOnXoff := Flags and 1 shl 7;
fOutX := Flags and 1 shl 8;
fInX := Flags and 1 shl 9;
fErrorChar := Flags and 1 shl 10;
fNull := Flags and 1 shl 11;
fRtsControl := Flags and $3 shl 12;
fAbortOnError := Flags and 1 shl 14;
end;
end;
function PackDcbFlags(Flags: TExpandedDCBFlags): DWORD;
begin
with Flags do
begin
Result :=
fBinary shr 0 or
fParity shr 1 or
fOutxCtsFlow shr 2 or
fOutxDsrFlow shr 3 or
fDtrControl shr 4 or
fDsrSensitivity shr 6 or
fTXContinueOnXoff shr 7 or
fOutX shr 8 or
fInX shr 9 or
fErrorChar shr 10 or
fNull shr 11 or
fRtsControl shr 12 or
fAbortOnError shr 14;
end;
end;
GuAV (2005-09-03 23:25:00) [7]
> Турист
> Anatoly Podgoretsky ©
Спасибо.
DWORD что значит ? Тип к которому приводятся биты ? Или ещё и sizeof(DWORD) как-то учитывается ?
Биты в порядке от младшего к старшему ?
И зачем такое сделали, ввели несовместимость с другими языками ? В данном конкретном случае ведь можно было бы завести один DWORD, и константы для него, которые or-ятся. В windows.pas, получается, значения этих TDCB.Flags никак не отображены..
Anatoly Podgoretsky (2005-09-03 22:45:00) [8]Это битовые поля, аналога в Паскаль нет.
Турист (2005-09-03 22:30:00) [9]Описание битов поля TDCB.Flags