Hi, I wrote some code using multidimensional arrays yesterday and realized it is not .... perfect, especially if you use strings. Every array uses an additional _length and and _size gint. size is the allocated size, length the actual use fields. Because every array uses such data, why not pack them into a struct? Let's call it ArrayDim[ension]: typedef ArrayDim struct ArrayDim; struct ArrayDim { gint length; gint size; } This is enugh for 1 dimensional arrays, but what about multidimensional ones? I suggest to add an addional field for the next dimension so you can chain up to arbitary array sizes. : typedef MultiArrayDim struct MultiArrayDim; struct MultiArrayDim { ArrayDim dim; ArrayDim[] next; } In the last dimenstion you'll only need a normal ArrayDim, else you have to use a MultiArrayDim to have the metadata for the next dimension. Last but not least an short example: vala code: //1 int[][] foo = null; //2 foo = new int[][2]; //3 foo[0] = new int[2]; //4 foo[1] = new int[6]; C code: //1 gint** foo = NULL; MultiArrayDim foo_meta = { 0, 0, NULL }; //2 foo = g_new0( gint*, 2 + 1 ); foo_meta.size = 2; foo_meta.next = g_new0( ArrayDim, 2 ); //3 foo[0] = g_new0( gint, 2 + 1 ); foo_meta.next[0].size = 2 + 1; //4 foo[1] = g_new0( gint, 6 + 1 ); foo_meta.next[1].size = 6 + 1; this even makes it possible to check the array ranges on accessing the elements and maybe resizing. Comments welcome. Regards, Frederik -- IRC: playya @ Freenode, Gimpnet xmpp: playya draugr de
Attachment:
signature.asc
Description: Digital signature