Entwickler-Ecke
Sonstiges (Delphi) - C -> Delphi
chrisw - Mo 07.03.11 16:12
Titel: C -> Delphi
Hallo Leute,
ich habe für eine synchrone RS232 Karte eine mitgelieferte DLL + Headerdateien.
Die meisten Typen kann ich selber in Delphi Typen umsetzen, nur bei diesen Zweien benötige ich eure Hilfe !
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104:
| typedef struct tagMPA_CONFIG { ULONG structLen; union { struct { // Set the following bits to indicate which parameter(s) are to be // set. Parameter value(s) with corresponding bits set to zero are // not changed. // Tx does not require buffers since pending IRPs provide buffers. UCHAR FrameBufferSizeRx : 1; UCHAR NumFrameBuffersRx : 1; UCHAR BaudRate : 1; UCHAR ClockRate : 1; UCHAR ClockMode : 1; UCHAR InternalLoopback : 1; UCHAR RxClockSource : 1; UCHAR TxClockSource : 1; UCHAR TRXCOutput : 1; UCHAR Encoding : 1; UCHAR DPLLClockSource : 1; UCHAR DPLLMode : 1; UCHAR AutoRTSDeact : 1; UCHAR CRCPreset : 1; UCHAR IdleLineControl : 1; ULONG pad : (8*sizeof(ULONG) - 13); } bits; ULONG all; // Used to clear/set all bits at once. } set;
ULONG FrameBufferSizeRx; // In bytes. ULONG NumFrameBuffersRx; ULONG BaudRate; ULONG ClockRate; ULONG ClockMode; BOOLEAN InternalLoopback; CLOCK_SOURCE RxClockSource; CLOCK_SOURCE TxClockSource; TRXC_OUTPUT TRXCOutput; ENCODING Encoding; DPLL_CLOCK_SOURCE DPLLClockSource; DPLL_MODE DPLLMode; BOOLEAN AutoRTSDeact; BOOLEAN CRCPreset; IDLE_LINE_CONTROL IdleLineControl; } MPA_CONFIG, *PMPA_CONFIG;
typedef struct tagMPA_MODEM_CNTL_SIG { ULONG structLen; union { struct { // Set the following bits to indicate which parameter(s) are to be // set. Parameter value(s) with corresponding bits set to zero are // not changed. // removed support for the following three bits of the COMM register // UCHAR testModeStatus : 1; // UCHAR localLoopbackEn : 1; // UCHAR remoteLoopbackEn : 1;
UCHAR extSyncEn : 1; UCHAR rxClkSource : 1; UCHAR txClkSource : 1; UCHAR rxBufEnable : 1; // enable RX buffers UCHAR txBufEnable : 1; // enable TX buffers
UCHAR rts : 1; UCHAR dtr : 1; UCHAR cts : 1; UCHAR dcd : 1; ULONG pad : (8*sizeof(USHORT) - 10); } bits; USHORT all; // Used to clear/set all bits at once. } set;
union { struct { // On-board modem control signals in Communications Register. // removed support for the following three bits of the COMM register // UCHAR testModeStatus : 1; // UCHAR localLoopbackEn : 1; // UCHAR remoteLoopbackEn : 1;
UCHAR extSyncEn : 1; UCHAR rxClkSource : 1; UCHAR txClkSource : 1; UCHAR rxBufEnable : 1; // enable rx buffers on card UCHAR txBufEnable : 1; // enable tx buffers on card
// On-chip modem control signals UCHAR rts : 1; UCHAR dtr : 1; UCHAR cts : 1; UCHAR dcd : 1; UCHAR pad : (8*sizeof(USHORT) - 10); } bits; USHORT all; // Used to clear/set all bits at once. } signals; } MPA_MODEM_CNTL_SIG, *PMPA_MODEM_CNTL_SIG; |
Danke schonmal !!
Bergmann89 - Mo 07.03.11 16:41
Hey,
union geht in Delhi so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| type TSet = packed record case Integer of 0: (bits: packed record FrameBufferSizeRx: Byte; NumFrameBuffersRx: Byte; BaudRate: Byte; ClockRate: Byte; ClockMode: Byte; InternalLoopback: Byte; RxClockSource: Byte; TxClockSource: Byte; TRXCOutput: Byte; Encoding: Byte; DPLLClockSource: Byte; DPLLMode: Byte; AutoRTSDeact: Byte; CRCPreset: Byte; IdleLineControl: Byte; pad:Longword; end); 1: (all: Longword); end; |
Allerdings wunder ich mich, wie man 13 Byte-Werte mit einem Longword (4Byte) abdecken will um alle auf einmal zu setzen. Dazu müsste UCHAR schon 1Bit groß sein. Aber laut Doku ist es ein Byte.
Mfg Bergmann
OlafSt - Do 10.03.11 12:11
Entscheidend sind die von dir geflisstentlich überlesenen ":1" im C-Code ;). Damit wird festgelegt, das hier tatsächlich nur ein einziges Bit belegt wird, während die Delphi-Portierung für jedes Element ein komplettes Byte nutzt.
Folglich ist der Delphi-Record auch drastisch größer. Wenn ich mich recht entsinne, sind solche Bitfelder in Delphi nicht möglich.
BenBE - Do 10.03.11 12:21
Bit-Felder werden in Delphi nicht direkt supportet. Stattdessen muss man hier über entsprechende Konstanten und ein wenig Bit-Arithmetik manuell nachhelfen. Entsprechend kann der entsprechende Zweig entfallen und die Union durch einen einzigen Wert ersetzt werden.
Bergmann89 - Do 10.03.11 13:59
Hey,
irgendwie hab ich mir sowas schon gedacht^^ Aber mal noch ne Frage: Wenn ich da nur 1 Bit festgelegt hab und jetzt der Variablen nen Wert > 1 geben will. Meckert da dann der Compiler, oder schreibt der einfach in die anderen Variablen rein?
MfG Bergmann.
BenBE - Sa 12.03.11 21:56
Es gibt da einfach einen stillen Überlauf, ggf. auch ne Warnung vom Compiler, wenn der das statisch feststellen kann), aber die anderen Bit-Felder werden nicht verändert. Es steht halt von dem zugewiesenen Wert nur die niedrigsten X Bit in deinem Feld dann drin.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!