On Fri, 09 Sep 2011 17:43:04 +0200, Timon Gehr wrote: > On 09/09/2011 05:19 PM, teo wrote: >> Here is an example of what I am after: >> >> struct DATA >> { >> ubyte D1; >> ubyte D2; >> ubyte D3; >> ubyte D4; >> } >> >> void main() >> { >> ubyte[16] a = [ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, >> 0x01, >> 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 ]; >> auto b = (cast(DATA*)a.ptr)[0 .. 4]; >> auto c = (cast(DATA[]*)b.ptr)[0 .. 2][0 .. 2]; >> } >> >> I need to have a DATA[2][2]. That code compiles but gives me a >> segmentation fault. > > If you actually want a dynamic DATA[2][] array of length 2, this works: > auto b=(*(cast(DATA[2][2]*)a.ptr))[]; > > Otherwise: > > A simple reinterpret cast should do: > auto b=*(cast(DATA[2][2]*)a.ptr); > > but note that this copies the data, because static arrays have value > semantics. > > If you want to have refer the new array to the same location, you can > use a union. > > void main(){ > union Myunion{ > ubyte[16] a = [ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, > 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 ]; > DATA[2][2] b; > } > Myunion myunion; > assert(*(cast(DATA[2][2]*)myunion.a.ptr)==myunion.b); > }
Thank you Timon for the good explanation. Just one more question (I suspect the answer will be no, but let me ask): is it possible to directly cast to ubyte[][]?