How can I map bytes to a matrix of structures?
Timon Gehr
timon.gehr at gmx.ch
Fri Sep 9 08:43:04 PDT 2011
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);
}
More information about the Digitalmars-d-learn
mailing list