Thread overview
char ***argc problems.
Aug 12, 2012
Andrew
Aug 12, 2012
Timon Gehr
Aug 12, 2012
Andrew
Aug 12, 2012
Timon Gehr
August 12, 2012
I'm attempting to create a wrapper for MPI, however, MPI_Init
wants to read the arguments for main():

MPI_Init(int *argv, char ***argc);

How do I get this last level of pointer reference?

So far, I have:

void main (string[] args)
{
      auto argarr = new char*[args.length];
      foreach(i, a; args)
          argarr[i] = (a.dup ~ '\0').ptr;

      int argc = to!(int)(argarr.length);
      MPI_Init(&argc, argarr.ptr);
}

Any ideas?

-Andrew
August 12, 2012
On 08/12/2012 10:33 PM, Andrew wrote:
> I'm attempting to create a wrapper for MPI, however, MPI_Init
> wants to read the arguments for main():
>
> MPI_Init(int *argv, char ***argc);
>
> How do I get this last level of pointer reference?
>
> So far, I have:
>
> void main (string[] args)
> {
>     auto argarr = new char*[args.length];
>     foreach(i, a; args)
>     argarr[i] = (a.dup ~ '\0').ptr;
>
>     int argc = to!(int)(argarr.length);
>     MPI_Init(&argc, argarr.ptr);
> }
>
> Any ideas?
>
> -Andrew

Maybe like this?

import std.algorithm, std.array, std.conv;
void main(string[] args){
    auto argarr = args.map!(a=>(a ~ '\0').ptr).array;

    int argc = to!(int)(argarr.length);
    auto argv = argarr.ptr;

    MPI_Init(&argc, &argv);

    args = argv[0..argc].map!(to!string).array;

    // ...
}
August 12, 2012
On Sunday, 12 August 2012 at 20:57:34 UTC, Timon Gehr wrote:
> On 08/12/2012 10:33 PM, Andrew wrote:
>> I'm attempting to create a wrapper for MPI, however, MPI_Init
>> wants to read the arguments for main():
>>
>> MPI_Init(int *argv, char ***argc);
>>
>> How do I get this last level of pointer reference?
>>
>> So far, I have:
>>
>> void main (string[] args)
>> {
>>    auto argarr = new char*[args.length];
>>    foreach(i, a; args)
>>    argarr[i] = (a.dup ~ '\0').ptr;
>>
>>    int argc = to!(int)(argarr.length);
>>    MPI_Init(&argc, argarr.ptr);
>> }
>>
>> Any ideas?
>>
>> -Andrew
>
> Maybe like this?
>
> import std.algorithm, std.array, std.conv;
> void main(string[] args){
>     auto argarr = args.map!(a=>(a ~ '\0').ptr).array;
>
>     int argc = to!(int)(argarr.length);
>     auto argv = argarr.ptr;
>
>     MPI_Init(&argc, &argv);
>
>     args = argv[0..argc].map!(to!string).array;
>
>     // ...
> }

I don't know why I didn't think of this:

auto argv = argarr.ptr;

Which fixed it.

Unfortunately, using args.map! doesn't work, because it returns
an immutable, which MPI_Init can't take.

Thanks for the help

-Andrew

August 12, 2012
On 08/12/2012 11:38 PM, Andrew wrote:
> On Sunday, 12 August 2012 at 20:57:34 UTC, Timon Gehr wrote:
>> On 08/12/2012 10:33 PM, Andrew wrote:
>>> I'm attempting to create a wrapper for MPI, however, MPI_Init
>>> wants to read the arguments for main():
>>>
>>> MPI_Init(int *argv, char ***argc);
>>>
>>> How do I get this last level of pointer reference?
>>>
>>> So far, I have:
>>>
>>> void main (string[] args)
>>> {
>>>    auto argarr = new char*[args.length];
>>>    foreach(i, a; args)
>>>    argarr[i] = (a.dup ~ '\0').ptr;
>>>
>>>    int argc = to!(int)(argarr.length);
>>>    MPI_Init(&argc, argarr.ptr);
>>> }
>>>
>>> Any ideas?
>>>
>>> -Andrew
>>
>> Maybe like this?
>>
>> import std.algorithm, std.array, std.conv;
>> void main(string[] args){
>>     auto argarr = args.map!(a=>(a ~ '\0').ptr).array;
>>
>>     int argc = to!(int)(argarr.length);
>>     auto argv = argarr.ptr;
>>
>>     MPI_Init(&argc, &argv);
>>
>>     args = argv[0..argc].map!(to!string).array;
>>
>>     // ...
>> }
>
> I don't know why I didn't think of this:
>
> auto argv = argarr.ptr;
>
> Which fixed it.
>
> Unfortunately, using args.map! doesn't work, because it returns
> an immutable, which MPI_Init can't take.
>

oops.
auto argarr = args.map!(a=>(a.dup ~ '\0').ptr).array;

> Thanks for the help
>
> -Andrew
>