Thread overview | ||||||
---|---|---|---|---|---|---|
|
December 30, 2009 c to d: types + struct/union alignment | ||||
---|---|---|---|---|
| ||||
I'm converting some C headers into D, and had some questions. 1. What is the equivalent of a 'short int' in D? e.g: struct ScePspSRect { short int x; short int y; short int w; short int h; } 2. If I have this union in C: typedef union ScePspUnion128 { /* SceULong128 qw;*/ /* Missing compiler support. */ /* SceULong128 uq;*/ /* SceLong128 q;*/ SceULong64 ul[2]; SceLong64 l[2]; unsigned int ui[4]; int i[4]; unsigned short us[8]; short int s[8]; unsigned char uc[16]; char c[16]; float f[4]; ScePspFRect fr; ScePspIRect ir; ScePspFVector4 fv; ScePspIVector4 iv; ScePspFQuaternion fq; ScePspFColor fc; ScePspRGBA8888 rgba8888[4]; ScePspRGBA4444 rgba4444[8]; ScePspRGBA5551 rgba5551[8]; ScePspRGB565 rgb565[8]; } ScePspUnion128 __attribute__((aligned(16))); Does it convert to this: union ScePspUnion128 { /* SceULong128 qw;*/ /* Missing compiler support. */ /* SceULong128 uq;*/ /* SceLong128 q;*/ align(16) { SceULong64 ul[2]; SceLong64 l[2]; uint ui[4]; int i[4]; ushort us[8]; short int s[8]; //What type??? ubyte uc[16]; char c[16]; //should it be byte or char? float f[4]; ScePspFRect fr; ScePspIRect ir; ScePspFVector4 fv; ScePspIVector4 iv; ScePspFQuaternion fq; ScePspFColor fc; ScePspRGBA8888 rgba8888[4]; ScePspRGBA4444 rgba4444[8]; ScePspRGBA5551 rgba5551[8]; ScePspRGB565 rgb565[8]; } } Are those type changes correct? Can I use the same way to align structs defined like that? 3. typedef uint8_t u8; typedef uint16_t u16; typedef uint32_t u32; typedef uint64_t u64; typedef int8_t s8; typedef int16_t s16; typedef int32_t s32; typedef int64_t s64; Would it be okay to be make/alias all of the uintxx_t to 'uint' and all of the intxx_t to 'int'? P.S. If anyone is wondering, this is taken from the homebrew PSP SDK. Thanks, Michael P. |
December 30, 2009 Re: c to d: types + struct/union alignment | ||||
---|---|---|---|---|
| ||||
Posted in reply to Michael P. | Hello Michael P., > I'm converting some C headers into D, and had some questions. > 1. What is the equivalent of a 'short int' in D? > e.g: > struct ScePspSRect { > short int x; > short int y; > short int w; > short int h; > } short > 3. > typedef uint8_t u8; > typedef uint16_t u16; > typedef uint32_t u32; > typedef uint64_t u64; > typedef int8_t s8; > typedef int16_t s16; > typedef int32_t s32; > typedef int64_t s64; > Would it be okay to be make/alias all of the uintxx_t to 'uint' and > all of the intxx_t to 'int'? no, uint16_t is (I assume) 16 bits long and uint32_t is 32 bits long. if you get them mixed up (as the aliasing you proposed would do) you will get problems passing struct to non-D code. |
December 30, 2009 Re: c to d: types + struct/union alignment | ||||
---|---|---|---|---|
| ||||
Posted in reply to BCS | BCS Wrote:
> Hello Michael P.,
>
> > I'm converting some C headers into D, and had some questions.
> > 1. What is the equivalent of a 'short int' in D?
> > e.g:
> > struct ScePspSRect {
> > short int x;
> > short int y;
> > short int w;
> > short int h;
> > }
>
> short
>
> > 3.
> > typedef uint8_t u8;
> > typedef uint16_t u16;
> > typedef uint32_t u32;
> > typedef uint64_t u64;
> > typedef int8_t s8;
> > typedef int16_t s16;
> > typedef int32_t s32;
> > typedef int64_t s64;
> > Would it be okay to be make/alias all of the uintxx_t to 'uint' and
> > all of the intxx_t to 'int'?
>
> no, uint16_t is (I assume) 16 bits long and uint32_t is 32 bits long. if you get them mixed up (as the aliasing you proposed would do) you will get problems passing struct to non-D code.
>
>
Okay. I'll look at where they came from and see what they are defined as. They come from a file called stdint.h. Also, would short unsigned int be a 'ushort' then?
|
December 31, 2009 Re: c to d: types + struct/union alignment | ||||
---|---|---|---|---|
| ||||
Posted in reply to Michael P. | Michael P.:
>Also, would short unsigned int be a 'ushort' then?<
In D ushort is an unsigned integer 16 bits long. While I think in C short unsigned int is not guaranteed to be 16 bit wide. The same is true for unsigned short / uint.
Bye,
bearophile
|
Copyright © 1999-2021 by the D Language Foundation