[英]How to fix “0xC0000005: Access violation reading location” in C++
我最近一直在学习如何在 c++ 中编写优化编程。 构建优化 model 后,我一直收到相同的消息:
有人可以帮助我或告诉我那里发生了什么吗? 非常感谢。
#include <ilcplex/ilocplex.h> ILOSTLBEGIN
typedef IloArray<IloNumVarArray> IloNumVarArray2;
int main(int argc, char ∗∗argv) {
IloEnv env;
try {
const char;
IloInt i, j;
IloModel mod(env);
IloNumVarArray2 x(env);
for (i = 0; i < 3; i++) {
x.add(IloNumVarArray(env, 2, 0.0, IloInfinity));
}
mod.add(IloMaximize(
env, 6.5 * x[0][0] + 11 * x[0][1] + 9.75 * x[1][0] + 12.25 * x[1][1] +
9.5 * x[1][2] + 4.75 * x[2][0] + 7.75 * x[2][1] +
8.5 * x[2][2] + 7.5 * x[3][0] + 8.5 * x[3][1]));
mod.add(x[0][0] + x[1][0] + x[2][0] + x[3][0] >= 500);
mod.add(x[0][1] + x[1][1] + x[2][1] + x[3][1] >= 600);
mod.add(x[0][2] + x[1][2] + x[2][2] + x[3][2] >= 500);
mod.add(x[0][0] + x[0][1] <= 600);
mod.add(x[1][0] + x[1][1] + x[1][2] <= 500);
mod.add(x[2][0] + x[2][1] + x[2][2] <= 300);
mod.add(x[3][0] + x[3][1] <= 400);
IloCplex cplex(mod);
if (!cplex.solve()) {
env.error() << "Failed to optimize LP." << endl;
throw(-1);
}
IloNumArray vals(env);
env.out() << "Solution status = " << cplex.getStatus() << endl;
env.out() << "Solution value = " << cplex.getObjValue() << endl;
env.out() << "Values = " << vals << endl;
} catch (IloException &e) {
cerr << "Error 2" << e << endl;
} catch (...) {
cerr << "Error 1" << endl;
}
env.end();
return 0;
}
就像评论中建议的人一样,使用调试器来追踪问题。 更好的是:在调试模式下编译你的程序。 IloCplex 代码在 header 文件中包含大量用于捕获常见错误的断言。 在调试模式下运行代码会导致此断言失败:
X& IloArray::operator[] (IloInt i) : Out of bounds operation: index superior to size of array
segfault2.bin++: concert/include/ilconcert/iloenv.h:2246: X& IloArray<X>::operator[](IloInt) [with X = IloNumVarArray; IloInt = long int]: Assertion `(i < _impl->getSize()) || (std:: cerr << "X& IloArray::operator[] (IloInt i) : Out of bounds operation: index superior to size of array" << std:: endl, ilo_stop_assert())' failed.
Aborted
这清楚地表明您正在访问一个超出其范围的数组(就像其中一条评论已经暗示的那样)。 追溯这一点,您可以看到代码中的违规行是:
mod.add(IloMaximize(
env, 6.5 * x[0][0] + 11 * x[0][1] + 9.75 * x[1][0] + 12.25 * x[1][1] +
9.5 * x[1][2] + 4.75 * x[2][0] + 7.75 * x[2][1] +
8.5 * x[2][2] + 7.5 * x[3][0] + 8.5 * x[3][1]));
尽管x
数组只有 3 个元素,但您正在访问x[3][*]
。 所以只有索引 0、1、2 对这个数组有效。 此外,您在某些地方访问x[*][2]
,尽管数组的第二维只有 2。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.