You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)是不合法的——编译器无法推断二维数组的第二维大小,所以会直接报错。

二、你的代码中其他需要修正的问题

除了数组参数的问题,代码里还有不少拼写错误、类型不匹配、索引越界等问题,我逐一给你指出并修正:

  1. 变量名拼写不一致:代码里混用了order和ordem,比如determinante函数里的ordem应该是order,否则会触发未定义标识符错误。
  2. 变长数组使用错误:cofator函数里的submatriz[C][C]中C未定义,应该用n = order - 1作为维度,声明为int submatriz[n][n];。
  3. 函数调用参数顺序错误:
    • cofator调用determinante(submatriz, n)应该改成determinante(n, submatriz)(符合函数声明的参数顺序)。
    • determinante调用cofator(matriz, ordem, 0, j)应该改成cofator(order, matriz, 0, j)(参数顺序要和cofator的声明一致)。
  4. 类型不匹配问题:
    • cofator返回int,但内部用了pow返回的double,还乘了determinante返回的double,应该把cofator的返回类型改成double。
    • determinante里的det声明为int,但赋值的是0.0,应该改成double det = 0.0;,对应的printf格式符要从%d改成%f。
  5. 数组索引越界:ehConvergente函数里数组从索引1开始赋值,但C数组是从0开始的,会导致越界,要改成从0开始遍历。
  6. 循环逻辑错误:ehConvergente里的while(n == ordem)条件错误,应该是while(n <= order),否则循环只会执行一次。
  7. 缺少必要头文件:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:35:38