передача двумерного массива из управляемого C ++ в неуправляемый C ++ - PullRequest
2 голосов
/ 15 июня 2011

Я работаю над управляемой оболочкой 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. Ошибка, которую я получил сейчас, следующая:

Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена.

Любые идеи приветствуются.

Ответы [ 2 ]

3 голосов
/ 15 июня 2011
void MNumeric::ChangeArray(cli::array&ltint,2> ^arr, int mySize) 
{
    pin_ptr&ltint> p = &arr[0,0];   // pin pointer to first element in arr
    int* np = p;   // pointer to the first element in arr
    UNumeric::ChangeArray((int**)np, mySize);
}
2 голосов
/ 16 июня 2011

Вы не должны использовать приведение здесь, это может скрыть потенциально важные предупреждения.Примечательно, что двумерный массив не может быть преобразован в int**.int** - это указатель на массив указателей .int*[] - указатель на массив массивов .У вас есть функция, которая принимает массив указателей .Ему нужен управляемый int[][], а не int[,].Ваш компилятор полностью крикнул бы на вас за попытку этого, если бы вы не произвели каст.

...