Как конвертировать строку ^ массив в пустоту * массив - PullRequest
0 голосов
/ 11 сентября 2018

Среда разработки: Win32 Настольное приложение C ++ / CLI

Давайте получим массив, подобный этому:

array<String^>^ strArr = gcnew array<String^>(100);

Массив, подобный этому:

void* ptrArr[100];

Iдолжны скопировать все элементы первого массива во второй массив.Как это сделать?

1 Ответ

0 голосов
/ 11 сентября 2018

Я предполагаю, что void* ptrArr[100] на самом деле const char* ptrArr[100]. void* может быть буквально чем угодно, поэтому невозможно ответить на вопрос без предположения о типе.

Итак, вам нужны две вещи: вам нужно выполнить преобразование между типами (в том числе из кодовых точек Unicode в символы ANSI), и у вас должно быть что-то, владеющее этой памятью.

Есть несколько вариантов того, что должно удерживать неуправляемую память для const char*. Самым дорогим маршрутом является Marshal.StringToHGlobalAnsi, но это боль, поэтому мы собираемся пропустить это. (Для этого потребуется вручную отслеживать группу IntPtr и вручную вызывать FreeHGlobal, когда закончите.)

Другие варианты - это различные вызовы marshal_as.

Вы можете преобразовать все String^ экземпляры в std::string экземпляры и извлечь из них const char*. Я рекомендую marshal_as<std::string> для этого. В этом случае память принадлежит экземплярам std:string, поэтому ptrArr будет действовать только до тех пор, пока stdStrArr.

#include <msclr\marshal_cppstd.h>

array<String^>^ strArr = gcnew array<String^>(100);
std::string stdStrArr[100];
const char* ptrArr[100];

for (size_t i = 0; i < 100; i++)
{
    stdStrArr[i] = marshal_as<std::string>(strArr[i]);
    ptrArr[i] = stdStrArr[i].c_str();
}
// Memory for ptrArr deallocated when stdStrArr goes out of scope. 

Другой вариант - использовать marshal_as для прямого преобразования в const char*. Для этого вы выделяете вспомогательный объект. В этом случае память принадлежит экземпляру marshal_context, поэтому ptrArr будет действовать только до тех пор, пока context.

#include <msclr\marshal.h>

array<String^>^ strArr = gcnew array<String^>(100);
marshal_context^ context = gcnew marshal_context();
char* ptrArr[100];

for (size_t i = 0; i < 100; i++)
{
    ptrArr[i] = context->marshal_as<const char*>(strArr[i]);
}
// Memory for ptrArr deallocated when you call `delete context`, or when it's garbage collected. 

Дальнейшее чтение:

Примечания:

  • Я не проверял свой синтаксис с помощью компилятора. Там могут быть небольшие ошибки.
  • Кажется, должен быть вопрос, чтобы пометить этот как дубликат. Однако мне не удалось найти вопрос «преобразовать строку в символ *», который был бы высоко оценен, в ответе использовался marshal_as и показал хороший пример его использования.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...