C语言传递非静态阶数数组报错,如何实现n阶行列式计算?
解决C语言中传递非静态阶数数组的编译错误及代码修正
首先,你遇到的expected ')' before ',' token编译错误,核心原因是二维数组作为函数参数时的语法不正确。C语言中,二维数组的第二维(及以后的维度)必须是确定的,或者使用C99引入的变长数组(VLA)——这时候需要把数组的阶数参数放在数组参数的前面,让编译器能推断数组的维度。
一、正确传递非静态阶数数组的方法
在C99及以后的标准中,支持变长数组,你可以这样声明函数:
// 方式1:变长数组参数,order在前,数组维度用order指定 double determinante(int order, int matriz[order][order]); // 方式2:用指针指向变长数组(和方式1等价) double determinante(int order, int (*matriz)[order]);
而你原来的double determinante(int matriz[][], int order)是不合法的——编译器无法推断二维数组的第二维大小,所以会直接报错。
二、你的代码中其他需要修正的问题
除了数组参数的问题,代码里还有不少拼写错误、类型不匹配、索引越界等问题,我逐一给你指出并修正:
- 变量名拼写不一致:代码里混用了
order和ordem,比如determinante函数里的ordem应该是order,否则会触发未定义标识符错误。 - 变长数组使用错误:
cofator函数里的submatriz[C][C]中C未定义,应该用n = order - 1作为维度,声明为int submatriz[n][n];。 - 函数调用参数顺序错误:
cofator调用determinante(submatriz, n)应该改成determinante(n, submatriz)(符合函数声明的参数顺序)。determinante调用cofator(matriz, ordem, 0, j)应该改成cofator(order, matriz, 0, j)(参数顺序要和cofator的声明一致)。
- 类型不匹配问题:
cofator返回int,但内部用了pow返回的double,还乘了determinante返回的double,应该把cofator的返回类型改成double。determinante里的det声明为int,但赋值的是0.0,应该改成double det = 0.0;,对应的printf格式符要从%d改成%f。
- 数组索引越界:
ehConvergente函数里数组从索引1开始赋值,但C数组是从0开始的,会导致越界,要改成从0开始遍历。 - 循环逻辑错误:
ehConvergente里的while(n == ordem)条件错误,应该是while(n <= order),否则循环只会执行一次。 - 缺少必要头文件:使用
pow需要包含<math.h>,使用bool需要包含<stdbool.h>。
三、修正后的完整代码
#include <stdio.h> #include <math.h> #include <stdbool.h> // 函数声明 double cofator(int order, int matriz[order][order], int linha, int coluna); double determinante(int order, int matriz[order][order]); double cofator(int order, int matriz[order][order], int linha, int coluna) { int n = order - 1; int submatriz[n][n]; // 变长数组,用n作为维度 int i, j; int x = 0; int y = 0; for (i = 0; i < order; i++) { for (j = 0; j < order; j++) { if (i != linha && j != coluna) { submatriz[x][y] = matriz[i][j]; y++; if (y >= n) { x++; y = 0; } } } } // 修正参数顺序,返回double类型 return pow(-1.0, linha + coluna) * determinante(n, submatriz); } double determinante(int order, int matriz[order][order]) { double det = 0.0; // 改成double类型 int j; if (order == 1) { det = matriz[0][0]; } else { for (j = 0; j < order; j++) { // 修正cofator的参数顺序 det = det + matriz[0][j] * cofator(order, matriz, 0, j); } } printf("O determinante da matriz eh %f \n", det); // 格式符改成%f return det; } bool ehConvergente(int order, int matriz[order][order]) { int n = 1; int value = 1; do { int submatriz[n][n]; // 数组索引从0开始,避免越界 for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { submatriz[i][j] = matriz[i][j]; } } if(determinante(n, submatriz) == 0) { value++; } n++; } while(n <= order); // 修正循环条件,遍历到n等于order return value <= 1; // 简化返回逻辑 } // 测试示例(可选) int main() { int mat[3][3] = {{1,2,3}, {4,5,6}, {7,8,9}}; determinante(3, mat); printf("Convergente? %s\n", ehConvergente(3, mat) ? "Sim" : "Não"); return 0; }
注意事项
- 变长数组(VLA)是C99的特性,如果你使用的是较老的编译器(比如MSVC),可能不支持这种语法。这时候可以改用动态内存分配(
malloc)来创建二维数组,比如:int **submatriz = malloc(n * sizeof(int*)); for(int i=0; i<n; i++) { submatriz[i] = malloc(n * sizeof(int)); } // 使用完后记得free for(int i=0; i<n; i++) { free(submatriz[i]); } free(submatriz); - 确保编译器开启C99或更高标准的支持(比如GCC用
-std=c99参数)。
内容的提问来源于stack exchange,提问作者laaf
相关产品推荐
相关产品推荐

