Возвращает многомерный массив из функции указателя в C ++ - CLI - PullRequest
2 голосов
/ 28 мая 2009

Я написал следующий код для возврата многомерного массива из функции указателя. Входным параметром этой функции является одномерный массив, выводом является указатель, указывающий многомерный массив.

double  **function( array< double>^ data,int width,int height ) {
    int i;
    double **R = new double *[height];
    for (i=0;i<=height;i++)
        R[i]=new double [width];

    // ....

    return R;
}

int main( void ) {
    int M=2, N=10, i,j;
    // define multimensional array 2x10

    array< array< double >^ >^ input = gcnew array< array< double >^ >(M);

    for (j=0; j<input->Length; j++) {
        input[j]=gcnew array<double>(N);}
        double **result1 = new double *[N];
        for(i=0; i<=N; i++)
            result1[i]=new double [M];
        double **result2 = new double *[N];
        for(i=0; i<=N; i++)
            result2[i]=new double [M];

        //............

        // send first row array of multidimensional array to function

        result1=function(input[0],M,N);

        // send second row array of multidimensional array to function

        result2=function(input[1],M,N);

        for (i=0;i<=N;i++)
            delete R[k];
        delete R;}*/

    return 0;
 }

Я успешно построил эту программу в Visual Studio 2008. Когда я отлаживаю этот код, программа вычисляет переменную pinter result1, но во время вычисления result2 в функции здесь:

R=new double *[height];
for (i=0; i<=height; i++)
    R[i]=new double [width];

Visual Studio выдает эту ошибку:

Произошло необработанное исключение типа «System.Runtime.InteropServices.SEHException» в stdeneme.exe
Дополнительная информация: Внешний компонент выдал исключение.

К сожалению, я не знаю, что делать.

Ответы [ 2 ]

9 голосов
/ 28 мая 2009

С первого взгляда вижу одну ошибку

for (i=0;i<=height;i++)
 {
 R[i]=new double [width];
 }

вы выделили R [высоту] но петля идет высота + 1

вы должны написать цикл

for (i=0; i<height; i++)

Еще одна вещь, которую я вижу, это то, что когда ты хочешь уничтожить свою матрицу, ты пишешь

delete R[k];

но это должно быть

delete [] R[k];
3 голосов
/ 28 мая 2009

<= s - ваша проблема. Допустимые индексы массива идут от 0 до N-1. Назначение result1[N] является нарушением прав доступа - это исключение, на которое он жалуется.

...