Я работаю над управляемой оболочкой C ++ для неуправляемого кода C ++ и у меня есть вопрос.
Просто для простоты скажем, что мне нужно передать двумерный массив из кода C # в Managed C ++ в Unmanaged C ++. У меня нет проблем с 1D массивом, но я застрял с 2D версией. Преобразование в 1D - вариант, но я хочу посмотреть, есть ли другие способы.
Для простоты, скажем, я хочу отправить двумерный массив в неуправляемый код с использованием промежуточной оболочки и изменить его значения.
так вот код C # с вызовом управляемого C ++:
MNumeric wrapper = new MNumeric(); //managed C++ object
int[,] dArr = new int[10, 10];
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
dArr[i, j] = 10;
}
}
wrapper.ChangeArray(dArr, Convert.ToInt32(Math.Sqrt(dArr.Length)))
Управляемый C ++:
void MNumeric::ChangeArray(cli::array<int,2> ^arr, int mySize)
{
//some code to call Unmanaged C++ passing managed 2D array ???
}
Неуправляемый C ++
void UNumeric::ChangeArray(int** arr, int mySize)
{
for(int i=0;i<mySize;i++)
{
for(int j=0;j<mySize;j++)
{
arr[i][j]=i;
}
}
}
Большое спасибо за вашу помощь.
Похоже, я исправил одну ошибку, но получил другую. Мой код на C ++ теперь выглядит так.
void MNumeric::ChangeArray(cli::array<int,2> ^arr, int mySize)
{
pin_ptr<int> p_arr = &arr[0,0];
u_num->ChangeArray((int**)p_arr, mySize);
}
где u_num - просто указатель на класс UNumeric.
Ошибка, которую я получил сейчас, следующая:
Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена.
Любые идеи приветствуются.