通过run_instance函数修改数组存储的实例error、control值实现问题
C++多实例数组更新问题修复方案
原有代码存在的问题
run_instance函数使用前未前置声明,编译会报错- 二维数组
arr定义为int类型,和需要存储的浮点型error、计算结果精度要求不匹配 arr是main函数的局部变量,run_instance默认无访问权限,需要作为参数传入- C++数组下标从0开始,你传入的
instance = 2对应数组第二行的话需要做索引转换
修正后完整可运行代码
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <time.h> using namespace std; // 函数前置声明,注意数组参数要指定第二维长度 double run_instance(int instance, double measured_error, int Kp, int Ki, double arr[][2]); int main() { int Ki = 6; int Kp = 4; const int n = 3; // 把数组类型改成double匹配浮点数据存储需求 double arr[n][2] = { {0.1, 11}, {0.001, 21}, {0.0001, 31} }; double measured_error = 0.3; int instance = 2; double new_control = run_instance(instance, measured_error, Kp, Ki, arr); cout << "实例" << instance << "计算得到的新control值为:" << new_control << endl; // 打印更新后的数组验证结果 cout << "更新后的数组:" << endl; for(int i=0; i<n; i++){ cout << "实例" << i+1 << ": error = " << arr[i][0] << ", control = " << arr[i][1] << endl; } return 0; } double run_instance(int instance, double measured_error, int Kp, int Ki, double arr[][2]) { // 转换为数组下标(用户传入的instance从1计数) int idx = instance - 1; // 取当前实例上一次存储的error double last_error = arr[idx][0]; // 按公式计算新的control值 double new_control = arr[idx][1] + Kp * measured_error + (Ki - Kp) * last_error; // 更新当前实例的error和control值 arr[idx][0] = measured_error; arr[idx][1] = new_control; // 返回计算得到的新control值 return new_control; }
关键修改说明
- 将数组类型从
int修改为double,避免浮点数据精度丢失 - 新增函数前置声明,将数组作为参数传入
run_instance,解决跨函数访问问题 - 对传入的实例编号做索引转换,适配C++数组从0开始的计数规则
- 保留原计算公式逻辑,计算完成后自动更新对应实例的两个存储值
内容的提问来源于stack exchange,提问作者v4lerO
相关产品推荐
相关产品推荐

