C ++: доступ к значениям 2D-массива, передаваемого как параметр / указатель в функцию - PullRequest
0 голосов
/ 27 сентября 2019

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

Я понимаю концепцию указателя, однако у меня возникли проблемы с концепцией двойного указателя 2D-массивов.Если я правильно понимаю, итерации по первому измерению массива указывают на позицию в памяти компьютера, которая сама указывает на другую позицию памяти в компьютере, где находится значение.Этот процесс 2 наведения представляет 2D.

Теперь в моем коде мне не удается получить доступ к значениям этого второго указателя, и я не понимаю, почему.

extern "C" double cfun(double **indatav, int rows, int cols)
{

    double* *outdatav = new double*[rows];
    for (int i=0; i < rows; i++){
        outdatav[i] = new double*[cols];
        }

    for (int i=0; i < rows; i++){
        for (int j=0; j < cols; j++){
            outdatav[i][j] = indatav[i][j];
            }
        }
    return outdatav;
}

Приведенный выше код вызывается через ctypes в Python, и поэтому он имеет extern... Однако эквивалент в C++ будет состоять в удалении extern "C". Я потратил довольно много времени наэта проблема, и я не думаю, что смогу решить ее в одиночку, поэтому любая помощь будет высоко оценена.

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

кажется неправильным выделение памяти в двойном указателе

double* *outdatav = new double*[rows];
for (int i=0; i < rows; i++){
    // outdatav[i] = new double*[cols]; // <- typo here
    outfatav[i] = new double [cols]; // <- replace with this
}

ADD

тип возвращаемого значения функции не совпадает с возвращаемой переменной, поэтому необходимо изменить тип возвращаемого значения на double**

extern "C" double** cfun(double **indatav, int rows, int cols)
1 голос
/ 27 сентября 2019

extern "C" double cfun (double ** indatav, int row, int cols)

{

    double**outdatav = new double*[rows];
    for (int i=0; i < rows; i++){
        outdatav[i] = new double[cols];
        }

    for (int i=0; i < rows; i++){
        for (int j=0; j < cols; j++){
            outdatav[i][j] = indatav[i][j];
            }
        }
    return outdatav;
}

Теперь это будет работать правильно.

 outdatav[i] = new double[cols];

В этой строке кодаВы назначали массив указателей на указатель.Вместо этого вы должны назначить массив каждому указателю.

...