2012-10-29 4 views
4

난 다음과 같이 D 주 복용 인수로 선언하는 C 기능 명령 라인 옵션 세트를 전달한다고 가정변환 문자열 [] **

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

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

첫번째 파라미터 충분히 쉽다는 char ,하지만 배열에 toStringz을 적용하려고 시도했지만 작동하지 않는 것 같습니다. 나는 cannot implicitly convert expression (map(args)) of type MapResult!(toStringz,string[]) to char**을 얻는다. string[]char** (또는 심지어 const(char)**)으로 어떻게 변환합니까?

+0

와는 char**에 주조되어 immutable(char**)을 반환 'argv' 필드를 C 함수에 넘깁니다. –

답변

4

std.algorithm.map 함수가 범위를 반환합니다.이 경우 범위를 배열로 변경해야합니다. std.array.array을 사용하여이 작업을 수행 할 수 있습니다. 그런 다음 .ptr을 사용하여 배열 포인터를 가져올 수 있습니다.

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

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

라이브 데모입니다 : 당신은`Core.runtime.cArgs`를 사용하고 직접`argc`을 통과 할 수있을 것이다 다음 릴리스에서 http://dpaste.dzfl.pl/ff81984c

+0

감사합니다. 훌륭한 작품입니다. 여러분은'cast (int) '가 필요 없다는 것을 알 수 있습니다. – jarmond

+0

'args.length'는'size_t' 유형입니다. – DejanLekic

+0

좋아, 캐스팅이 제거되었습니다. – Robik