Я пытался вычислить определитель матрицы N x N, так что это то, что у меня есть до сих пор. Результат, если это -378029970
. Я не знаю, что происходит, потому что, если я изменю значение N для размера матрицы, он отлично работает и печатает правильный результат, который равен -20
. Я отладил весь скрипт и обнаружил, что проблема заключается в изменении значения N. Я новичок в языке C, поэтому буду признателен, если вы поможете мне с этим. Спасибо!
void getCofactor(int q, int n, int matrix[][n], int temp[][n]) {
int i = 0;
int j = 0;
int p = 0;
for (int row = 0; row < n; row++) {
for (int col = 0; col < n; col++) {
if (row != p && col != q) {
temp[i][j++] = matrix[row][col];
if (j == n - 1) {
j = 0;
i++;
}
}
}
}
}
int determinante(int n, int matrix[][n]) {
int D = 0;
if (n == 1) {
return matrix[0][0];
}
int temp[n][n];
int sign = 1;
for (int f = 0; f < n; f++) {
getCofactor(f, n, matrix, temp);
D += sign * matrix[0][f] * determinante(n - 1, temp);
sign = -sign;
}
return D;
}
int main() {
int matrix[3][3] = { { 3, -2, 5}, { -2, 8, 10}, { 3, -2, 4 }};
int LINHA = 3;
printf("Determinante: %d", determinante(LINHA, matrix));
return 0;
}
getCofactor()
массивtemp
имеет ту же ширину строки, что иmatrix
, но вы не увеличиваете его индексацию, если условие не выполняется. Как вызывающая сторона узнает, сколько строк вtemp
нужно использовать? Обратите внимание, что неиспользуемые элементы вint temp[n][n];
не были инициализированы. - person Weather Vane   schedule 30.08.2020int temp[n][n];
не инициализирован. Вы ожидаете, что неписаные элементы будут0
? И должны ли приращенияj
иi
быть вне блока кода с условной записью вtemp
? - person Weather Vane   schedule 30.08.2020determinante()
рекурсирует, он передает массивtemp
себе в качестве аргументаmatrix
. Это передается вgetCofactor()
, который проверяет каждый элемент, однако не каждый элемент массиваtemp
имеет какое-либо значение. - person Weather Vane   schedule 30.08.2020getCofactor(f, N, matrix, temp);
. Я думаю, что проблема может быть в инициализации функции, как вы упоминали ранее. - person Rafael Rossales   schedule 30.08.2020temp
не являются проблемой, несовместимые измерения в вызовеdeterminante(n - 1, temp)
дают неверный результат. Поведение не определено, и компилятору сложно обнаружить эту ошибку. - person chqrlie   schedule 30.08.2020n-1
наn-1
в верхнем левом углуtemp
, оставив последний столбец и последнюю строку неинициализированными. Это не было проблемой, так как геометрия матрицы была исправлена путем созданияN
глобального. VLA C99 подвержены ошибкам, а 2D VLA должны быть запрещены или реализованы с другой схемой, где размеры являются частью структуры, а не отдельным аргументом. - person chqrlie   schedule 30.08.2020