2014-06-11 2 views
0

내가 내 const char** fileListstd:vector<std::string>에 변환 할 수있는 방법 C#변환 ** 성병 : 벡터 <std::string>

extern "C" { 
    LIBRARY_API void GenerateTables(
     const char* version, 
     const char* baseDir, 
     const char** fileList); 
} // end extern "C" 

void GenerateTables(
    const char* version, 
    const char* baseDir, 
    const char** fileList) 
{ 
    std::string strVersion(version); 
    std::string strBaseDir(baseDir); 

    // I now need to convert my const char** to std::vector<std::string> 
    // so it can be passed to another internal method. 
} 

내 C++ 코드를 노출하기 위해 다음과 같은 래퍼가 있습니다. 저는 C++에 비교적 익숙하지 않습니다. 여기에 메모리 할당에 대한 명확한 문제가 있습니다. 나는

std::vector<std::string> vec; 
for (int i = 0; i < fileList.length() /* length() of what!? */; i++) 
    vec.push_back(/* what!? */); 

어떻게 필요한 변환을 수행하고 상호 운용성을 통해 C++로 C에서 # 문자열 (string[])의 배열에 전달하는 더 나은 방법이있을 수 있습니다 뭔가를 할 수 있을까?

감사합니다.

+1

목록이 NULL 포인터로 종료된다고 가정해야합니까? – WhozCraig

+1

배열의 길이를 결정하기위한 프로토콜이 필요합니다. 이게 뭐야? –

+0

필자는'fileList' 변수에 문자열의 개수를 만들기를 희망했습니다. 그래서 C 배열을fileList = new List {/ * some list * /};와 ToArray()를 사용하여 배열을 interop 메서드에 전달하기 전에. 내가 말했듯이, 나는 전에 이것을 한 적이 없기 때문에 다른 방법들에 열려있다. 디렉토리를 사용하여'fileList'를 얻는 것이 가능합니다. 그래서 하나의 폴더에 모두 들어 있기 때문에 필요한 파일 경로를 얻기 위해 사용되는 디렉토리 경로를 가지고있는 또 다른'const char *'를 전달할 수 있습니까? – MoonKnight

답변

1

길이를 얻기 위해 언 매니지 코드를 제공해야합니다. 일반적으로 사용되는 두 가지 방법이 있습니다.

  1. 추가 매개 변수로 배열의 길이를 전달하십시오.
  2. null로 끝나는 배열을 사용하십시오. 널 (null) 항목을 만날 때 배열이 끝납니다.

두 옵션 중 어느 것이 든 구현하기 쉽습니다. 선택은 전적으로 귀하의 개인 취향에 달려 있습니다.

당신은 다음과 같이 벡터 채울 수 있습니다 첫 번째 옵션을 선택하는 경우 :

std::vector<std::string> files; 
const char** filePtr = fileList; 
while (*filePtr != nullptr) 
    files.push_back(*filePtr++); 
+0

도움 주셔서 대단히 감사합니다. – MoonKnight

1

당신에게 : 두 번째 옵션을 선택하면

std::vector<std::string> files(fileList, fileList + length); 

는 다음과 같은 루프를 사용하는 것을 fileList 어레이의 길이를 알아야합니다. 당신이 그것을 알고 있다면 fileList을 사용하여 변환 할 수 있습니다.

size_t length = ... ; 
std::vector<std::string> files(fileList, fileList + length); 
관련 문제