www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - convert int[][] to int**

reply "Andrea Fontana" <nospam example.com> writes:
I'm pretty sure I've just read about this, but search engines are 
not useful in this case.

I have a C api that need a int** params that represent a int[][]. 
How can I convert from d to c to pass it? For simple arrays, 
array.ptr seems to work...
Feb 20 2014
parent reply "bearophile" <bearophileHUGS lycos.com> writes:
Andrea Fontana:

 I have a C api that need a int** params that represent a 
 int[][]. How can I convert from d to c to pass it? For simple 
 arrays, array.ptr seems to work...
One way to do it (untested): int** pp = myDArray.map!(a => a.ptr).array.ptr; Bye, bearophile
Feb 20 2014
parent reply "Andrea Fontana" <nospam example.com> writes:
On Thursday, 20 February 2014 at 16:47:43 UTC, bearophile wrote:
 Andrea Fontana:

 I have a C api that need a int** params that represent a 
 int[][]. How can I convert from d to c to pass it? For simple 
 arrays, array.ptr seems to work...
One way to do it (untested): int** pp = myDArray.map!(a => a.ptr).array.ptr; Bye, bearophile
Ok, so it seems there's no "built-in" ways...
Feb 20 2014
next sibling parent "bearophile" <bearophileHUGS lycos.com> writes:
Andrea Fontana:

 Ok, so it seems there's no "built-in" ways...
Yeah, and this is a very good thing :-) Bye, bearophile
Feb 20 2014
prev sibling parent reply "Dicebot" <public dicebot.lv> writes:
On Thursday, 20 February 2014 at 16:55:51 UTC, Andrea Fontana 
wrote:
 On Thursday, 20 February 2014 at 16:47:43 UTC, bearophile wrote:
 Andrea Fontana:

 I have a C api that need a int** params that represent a 
 int[][]. How can I convert from d to c to pass it? For simple 
 arrays, array.ptr seems to work...
One way to do it (untested): int** pp = myDArray.map!(a => a.ptr).array.ptr; Bye, bearophile
Ok, so it seems there's no "built-in" ways...
You can't do it without allocation because memory layout is different for int** and int[][] in D - are.ptr in latter points to slice struct (pointer+length) as opposed to raw pointer in former.
Feb 20 2014
parent reply "Chris Williams" <yoreanon-chrisw yahoo.co.jp> writes:
On Thursday, 20 February 2014 at 17:02:15 UTC, Dicebot wrote:
 You can't do it without allocation because memory layout is 
 different for int** and int[][] in D - are.ptr in latter points 
 to slice struct (pointer+length) as opposed to raw pointer in 
 former.
You should only have to copy the top list, though. int*[] temp = new int*[ arr.length ]; for (size_t i = 0; i < arr.length; i++) { temp[i] = arr[i].ptr; } int** output = temp.ptr; Untested.
Feb 21 2014
parent "Chris Williams" <yoreanon-chrisw yahoo.co.jp> writes:
On Friday, 21 February 2014 at 19:13:13 UTC, Chris Williams wrote:
 On Thursday, 20 February 2014 at 17:02:15 UTC, Dicebot wrote:
 You can't do it without allocation because memory layout is 
 different for int** and int[][] in D - are.ptr in latter 
 points to slice struct (pointer+length) as opposed to raw 
 pointer in former.
You should only have to copy the top list, though. int*[] temp = new int*[ arr.length ]; for (size_t i = 0; i < arr.length; i++) { temp[i] = arr[i].ptr; } int** output = temp.ptr; Untested.
Addendum: Note that bearophile's code probably works out to the same thing.
Feb 21 2014