проблемы импорта DLL C ++ - PullRequest
0 голосов
/ 17 мая 2011

Я пытаюсь получить доступ к этой функции C ++ из кода C # в моей программе

Tridiagonal3 (float** mat, float* diag, float* subd)
{
   float a = mat[0][0], b = mat[0][1], c = mat[0][2],
                        d = mat[1][1], e = mat[1][2],
                                       f = mat[2][2];

}

Вызов, как показано ниже

tred2(tensor, eigenValues, eigenVectors);

, где тензор float[,], а собственные значения и собственные векторы float[] массивы.

Когда я пытаюсь это сделать, я получаю исключение

Access violation reading location 0x3f5dce99

когда я пытаюсь получить доступ к

float a = mat[0][0]

Что может происходить?

Ответы [ 3 ]

5 голосов
/ 17 мая 2011

Tridiagonal3 (float** mat, float* diag, float* subd)

mat - тип двойного указателя (указатель на указатель). В C # float [,] это , а не двойной указатель. Это просто синтаксический сахар для доступа к многомерному массиву, как если бы вы делали mat[x + y * width] вместо mat[y][x];

Другими словами, вы передаете float* вашему приложению C ++, а не float**.

Вы должны изменить способ использования mat для доступа к элементам, используя ручное смещение, например mat[y + 2 * x]

0 голосов
/ 17 мая 2011

Сначала нужно выделить массив с 3 указателями, которые можно сделать с помощью класса:

class Pointer3
{
     IntPtr p1, p2, p3;
}

, затем вам нужно определить строку с помощью класса:

class Row3
{
     float a, b, c;
}

все это в C #.тогда вам нужно выделить их:

Row3 row1, row2, row3;
// todo: init values
Pointer3 mat;
// allocate place for the rows in the matrix
mat.p1 = Marshal.AllocHGlobal(sizeof(Row3));
mat.p2 = Marshal.AllocHGlobal(sizeof(Row3));
mat.p3 = Marshal.AllocHGlobal(sizeof(Row3));
// store the rows
Marshal.StructureToPtr(row1, mat.p1, false);
Marshal.StructureToPtr(row2, mat.p2, false);
Marshal.StructureToPtr(row3, mat.p3, false);
// allocate pointer for the matrix
IntPtr matPtr = Marshal.AllocHGlobal(sizeof(Pointer3));
// store the matrix in the pointer
Marsha.StructureToPtr(mat, matPtr, false);

Теперь можно безопасно вызывать функцию, используя matPtr в качестве матрицы.
Чтобы получить значения из модифицированной матрицы:

Marshal.PtrToStructure(matPtr, mat);
0 голосов
/ 17 мая 2011

Либо mat, либо mat[0] - неверный указатель.Проблема заключается в коде, который выделяет mat.

...