繁体   English   中英

如何修复 C++ 中的“0xC0000005:访问冲突读取位置”

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM