Thread overview | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
February 20, 2014 convert int[][] to int** | ||||
---|---|---|---|---|
| ||||
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... |
February 20, 2014 Re: convert int[][] to int** | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrea Fontana | 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
|
February 20, 2014 Re: convert int[][] to int** | ||||
---|---|---|---|---|
| ||||
Posted in reply to bearophile | 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...
|
February 20, 2014 Re: convert int[][] to int** | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrea Fontana | Andrea Fontana:
> Ok, so it seems there's no "built-in" ways...
Yeah, and this is a very good thing :-)
Bye,
bearophile
|
February 20, 2014 Re: convert int[][] to int** | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrea Fontana | 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.
|
February 21, 2014 Re: convert int[][] to int** | ||||
---|---|---|---|---|
| ||||
Posted in reply to Dicebot | 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.
|
February 21, 2014 Re: convert int[][] to int** | ||||
---|---|---|---|---|
| ||||
Posted in reply to Chris Williams | 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.
|
Copyright © 1999-2021 by the D Language Foundation