2012-10-29 72 views
4

假設我要的一組命令行選項轉發到C函數,聲明如下,與d主要服用ARGS轉換串[]到char **

extern (C) void init(int argc, char** argv); 

void main(string[] args) { 
    init(args.length, map!(toStringz)(args)); 
} 

的第一個參數是很容易,但我嘗試將toStringz應用於args陣列似乎不起作用。我得到cannot implicitly convert expression (map(args)) of type MapResult!(toStringz,string[]) to char**。如何將string[]轉換爲char**(或甚至const(char)**)。

+0

在接下來的版本中,您就可以使用'Core.runtime.cArgs'並直接通過它'argc'和'argv'字段爲C函數。 –

回答

4

std.algorithm.map函數返回範圍,這在你的情況下必須改爲數組。您可以使用std.array.array來完成此操作。然後你可以使用.ptr獲得數組指針。它返回immutable(char**)被鑄造成char**

extern (C) void init(int argc, char** argv); 

void main(string[] args) { 
    init(cast(int)args.length, cast(char**)map!(toStringz)(args).array.ptr); 
} 

這裏的現場演示:http://dpaste.dzfl.pl/ff81984c

+0

謝謝,效果很好。原來你不需要'cast(int)'。 – jarmond

+0

因爲'args.length'的類型是'size_t'。 – DejanLekic

+0

好的,鑄件已移除。 – Robik