On Monday, 2 February 2015 at 12:42:24 UTC, FG wrote:
On 2015-02-02 at 13:16, irtcupc wrote:
The manual section about interfacing from c states that
"type[]" is inter-compatible from C to D,
however, I face this strange case:
- C declaration:
char identifier[64];
- D declaration:
char[64] identifier;
- the result is only correct if i slice by (- pointer size):
char[64] fromC(char[64] * thing)
{
const offs = size_t.sizeof;
return thing[-offs.sizeof .. $-offs];
}
Is this correct ?
So you have to shift the whole array right by 4 or 8 bytes?
Strange.
Looks like an alignment issue. Is identifier part of a bigger
structure?
Yes:
C struct:
#pragma pack(1)
typedef struct _Disasm {
UIntPtr EIP;
UInt64 VirtualAddr;
UInt32 SecurityBlock;
char CompleteInstr[INSTRUCT_LENGTH];
UInt32 Archi;
UInt64 Options;
INSTRTYPE Instruction;
ARGTYPE Argument1;
ARGTYPE Argument2;
ARGTYPE Argument3;
PREFIXINFO Prefix;
InternalDatas Reserved_;
} DISASM, *PDISASM, *LPDISASM;
#pragma pack()
D struct:
align(1)
struct _Disasm {
void * EIP;
ulong VirtualAddr;
uint SecurityBlock;
char [INSTRUCT_LENGTH] CompleteInstr;
uint Archi;
ulong Options;
INSTRTYPE Instruction;
ARGTYPE Argument1;
ARGTYPE Argument2;
ARGTYPE Argument3;
PREFIXINFO Prefix;
uint Reserved_[40];
}
my current understanding is that:
- C: char CompleteInstr[INSTRUCT_LENGTH] is actually a raw chunk
- D: defining the member as char[INSTRUCT_LENGTH] is an error
- the first member of a D array is the .length
- first char actually stands where .length uses to be, which
explains the shift.
- I cant use fromStringz because it's not a null terminated string