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

C++二维数组用数组作维度报错及M(h)循环使用求助

代码错误修复与M(h)用法指导

错误原因

C++要求静态数组的维度必须是编译期常量,你定义Pjob[J][M[J]]时,M[J]是运行期变量(即便初始化了,编译器也无法在编译阶段确定它的值),因此触发编译错误。

修复方案

方案1:使用动态容器vector(推荐)

vector支持运行期确定大小,完美适配每个作业模式数量不同的场景:

#include <iostream>
#include <vector>
using namespace std;

#define J 10

int main() {
    int M[J] = {2, 2, 3, 4, 5, 1, 3, 3, 2, 1};
    // 二维vector,每个作业h对应M[h]个模式的加工时间
    vector<vector<int>> Pjob(J);
    // 为每个作业分配对应模式数量的空间,这里默认初始化为0
    for (int h = 0; h < J; ++h) {
        Pjob[h].resize(M[h], 0);
    }

    // 示例:给作业0的模式1赋值加工时间
    Pjob[0][1] = 15;
    cout << "作业0的模式1加工时间:" << Pjob[0][1] << endl;

    return 0;
}

方案2:固定大小静态数组(仅适用于模式数量有明确上限时)

如果能确定所有作业的模式数量最大值(比如这里最大是5),可以定义固定维度的数组:

#include <iostream>
using namespace std;

#define J 10
#define MAX_MODES 5 // 所有作业的模式数量最大值

int main() {
    int M[J] = {2, 2, 3, 4, 5, 1, 3, 3, 2, 1};
    int Pjob[J][MAX_MODES] = {0}; // 初始化所有元素为0

    // 示例:给作业4的模式4赋值加工时间
    Pjob[4][4] = 20;
    cout << "作业4的模式4加工时间:" << Pjob[4][4] << endl;

    return 0;
}

注意:这种方式会浪费部分空间,因为部分作业的模式数量小于MAX_MODES。

For循环中使用M(h)的示例

遍历所有作业的所有模式

// 遍历每个作业h
for (int h = 0; h < J; ++h) {
    cout << "作业" << h << "的模式数量:" << M[h] << endl;
    // 遍历作业h的每个模式m(索引从0到M[h]-1)
    for (int m = 0; m < M[h]; ++m) {
        cout << "  模式" << m << "的加工时间:" << Pjob[h][m] << endl;
    }
}

批量赋值加工时间(以随机值为例)

#include <cstdlib>
#include <ctime>

int main() {
    // 初始化随机数种子
    srand(time(0));
    int M[J] = {2, 2, 3, 4, 5, 1, 3, 3, 2, 1};
    vector<vector<int>> Pjob(J);
    for (int h = 0; h < J; ++h) {
        Pjob[h].resize(M[h]);
        // 为每个模式生成1-50的随机加工时间
        for (int m = 0; m < M[h]; ++m) {
            Pjob[h][m] = rand() % 50 + 1;
        }
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者Siw Mni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 00:05:19