2014-06-11 246 views
0

我有以下包裝我的C++代碼暴露給C#轉換爲const char **的爲std :: vector的<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. 
} 

我怎麼能轉換我const char** fileListstd:vector<std::string>。我對C++相對來說比較陌生,這裏有一個明確的內存分配問題。我可以做類似

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

我該怎麼辦所需的轉換,是通過有互操作從C#字符串(string[])的數組傳遞給C++的一個更好的辦法?

謝謝你的時間。

+1

我們應該承擔的名單是由一個NULL指針終止轉換fileList? – WhozCraig

+1

需要有一些協議來確定數組的長度。它是什麼? –

+0

我希望在'fileList'變量中創建字符串的數量。因此,在C#中列出# fileList = new List {/ * some list * /};'然後在將數組傳遞給interop方法之前使用'ToArray()'。就像我說過的,我之前沒有這樣做過,所以對其他方法開放(如果有的話)。可以使用一個目錄來獲得'fileList',因爲它們都包含在一個文件夾中,所以我可以傳入另一個'const char *',它包含一個目錄路徑,而該目錄路徑又用於獲取所需的文件路徑? – MoonKnight

回答

1

你需要給非託管代碼一些方法來獲得長度。有兩種常用的方法:

  1. 傳遞數組的長度作爲額外的參數。
  2. 使用空終止數組。當您遇到空項目時數組結束。

這兩個選項都足夠簡單,您可以執行。這個選擇完全取決於你的個人喜好。

如果你選擇第一個選項,那麼你可以填充這樣的載體:

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

如果選擇第二個選項,那麼你會使用這樣一個循環:

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

非常感謝您的幫助,非常感謝。 – MoonKnight

1

你需要知道fileList陣列的長度。一旦你知道它,你可以使用

size_t length = ... ; 
std::vector<std::string> files(fileList, fileList + length); 
相關問題