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
相关产品推荐
相关产品推荐

