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

Reply via email to