如何在C-PLEX软件中输入三维数组?代码报错求助
问题描述
需求:为14节点系统的每个节点、24小时的每个时段、连接的100辆车的荷电状态(SOC)建立数据输入,需按节点顺序查看对应车辆各时段的SOC。
编写代码后出现两个错误:
circular dependency of socoperator not available for range*range
原代码:
int nb=14; int t=24; int nv=100; range nbus=1..nb; range tavail =1..t; range nport=1..nv; float soc[nbus*tavail*nport]=...; float array[i in nbus,j in tavail,k in nport]=soc[k+nport*(j-1)+tavail*nport*(i-1)]; execute { writeln(array); };
问题分析与解决方案
错误原因拆解
operator not available for range*range:
代码中nbus*tavail*nport是直接对range类型做乘法运算,但range是集合类型,不支持乘法操作。应该用定义好的整数变量nb*t*nv来计算一维数组的长度。circular dependency of soc:
用...声明soc数组需要外部数据初始化,但同时定义array依赖soc,两者形成了循环依赖。另外手动计算一维数组的索引容易出错,也会加剧这类问题。
代码修正方案
建议直接使用三维数组存储SOC数据,避免手动索引计算,同时解决循环依赖问题:
int nb=14; int t=24; int nv=100; range nbus=1..nb; range tavail=1..t; range nport=1..nv; // 直接定义三维数组,对应节点、时段、车辆的SOC float soc[nbus, tavail, nport]=...; execute { // 按节点顺序输出各车辆各时段的SOC for(var i in nbus) { writeln("节点 ", i, " 的SOC数据:"); for(var k in nport) { writeln("车辆 ", k, " 各时段SOC:", soc[i][*][k]); } } };
数据文件设置(.dat格式)
数据文件需要和三维数组的维度对应,格式如下:
soc = [ // 节点1的所有时段、车辆SOC [ [soc_1_1_1, soc_1_1_2, ..., soc_1_1_100], // 时段1的100辆车SOC [soc_1_2_1, soc_1_2_2, ..., soc_1_2_100], // 时段2的100辆车SOC ... [soc_1_24_1, soc_1_24_2, ..., soc_1_24_100] // 时段24的100辆车SOC ], // 节点2的所有时段、车辆SOC [ [soc_2_1_1, ...], ... ], ... // 节点14的所有时段、车辆SOC [ [soc_14_1_1, ...], ... ] ];
如果数据是按节点→时段→车辆的顺序平铺的一维数据,也可以在代码中通过索引映射读取,但三维数组的方式更直观,不易出错。
内容的提问来源于stack exchange,提问作者Harip
相关产品推荐
相关产品推荐

