On Fri, 09 Sep 2011 11:43:04 -0400, Timon Gehr <timon.g...@gmx.ch> 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);
}

You can also use ref, but you have to use a function, as it's impossible to declare a ref local variable except as a function parameter.

void main()
{
   ubyte[16] a = ...;
   void foo(ref DATA[2][2] b)
   {
      ...
   }
   foo(*(cast(DATA[2][2]*)a.ptr));
}

-Steve

Reply via email to