Как преобразовать массив фиксированного размера в указатель на массив указателей - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь вычислить определитель, но сборка не удалась.Там есть код, где ошибка падает.

void getCofactor(double mat[N][N], double temp[N][N], int p, int q, int n)
    {
        int i = 0, j = 0;

        // Looping for each element of the matrix
        for (int row = 0; row < n; row++)
        {
            for (int col = 0; col < n; col++)
            {
                //  Copying into temporary matrix only those element
                //  which are not in given row and column
                if (row != p && col != q)
                {
                    temp[i][j++] = mat[row][col];

                    // Row is filled, so increase row index and
                    // reset col index
                    if (j == n - 1)
                    {
                        j = 0;
                        i++;
                    }
                }
            }
        }
    }

    double determinant(double **mat, int n)
    {
        double D = 0; // Initialize result

        //  Base case : if matrix contains single element
        if (n == 1)
            return mat[0][0];

        double temp[N][N]; // To store cofactors

        int sign = 1;  // To store sign multiplier

        // Iterate for each element of first row
        for (int f = 0; f < n; f++)
        {
            // Getting Cofactor of mat[0][f]
            getCofactor(mat, temp, 0, f, n);    //ERORRRRRRRRRRR
            D += sign * mat[0][f] * determinant(temp, n - 1);

            // terms are to be added with alternate sign
            sign = -sign;
        }

        return D;
    }

Как решить эту проблему? main.cpp: 49: 50: ошибка: невозможно преобразовать «double (*) [4]» в «double » для аргумента «1» в «двойной определитель (double **, int)» **D + = знак * mat [0] [f] * определитель (temp, n - 1);

1 Ответ

0 голосов
/ 13 декабря 2018

Массив с двумя измерениями и указатель на другой указатель - это не одно и то же.Почему вам нужно по-разному использовать mat для двух разных функций, таких как double mat[N][N] в функции getCofactor() и double **mat в функции determinant()?Поскольку вы знаете, каково значение переменной N, вы можете использовать ее как double mat[N][N] в функции determinant().

double determinant(double mat[N][N], int n)
    {
        double D = 0; // Initialize result

        //  Base case : if matrix contains single element
        if (n == 1)
            return mat[0][0];

        double temp[N][N]; // To store cofactors

        int sign = 1;  // To store sign multiplier

        // Iterate for each element of first row
        for (int f = 0; f < n; f++)
        {
            // Getting Cofactor of mat[0][f]
            getCofactor(mat, temp, 0, f, n);    //ERORRRRRRRRRRR
            D += sign * mat[0][f] * determinant(temp, n - 1);

            // terms are to be added with alternate sign
            sign = -sign;
        }

        return D;
    }

Как только вы внесете упомянутое изменение, ваша ошибка будетбыть исправленным.Надеюсь, это поможет.

Дополнение: Я хочу исправить то, что может вызвать недоразумение;

Массив с двумя измерениями и указатель на другой указатель не являютсято же самое.

Обратите внимание, что у вас может быть что-то, что действует как многомерный массив с указателями.Но то, как они занимают и хранят в оперативной памяти, не одно и то же.Обратите внимание, что многомерный массив представляет собой один блок памяти.Чтобы понять это лучше, проверьте следующий вопрос:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...