2014-06-11 4 views
0

У меня есть следующая обертка, чтобы выставить мои C++ кода на C#Преобразования сопзЬ гольца ** в StD :: вектора <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** fileList в std:vector<std::string>. Я относительно новичок в C++, и здесь есть явная проблема с распределением памяти. Я мог бы сделать что-то вроде

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

Как я могу сделать необходимое преобразование и есть лучший способ передачи в массиве строк (string[]) из C# для C++ через Interop?

Спасибо за ваше время.

+1

Следует ли считать, что список заканчивается указателем NULL? – WhozCraig

+1

Должен быть протокол для определения длины массива. Что это? –

+0

Я надеялся сделать число строк в переменной 'fileList'. Поэтому, имея в C# 'List fileList = новый список {/ * some list * /};', а затем используя 'ToArray()' перед передачей массива методу interop. Как я уже сказал, я не делал этого раньше, поэтому открываю другие методы (если они есть). Можно получить '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

You необходимо знать длину массива fileList. Как только вы это знаете, вы можете конвертировать fileList с использованием

Смежные вопросы