调用Update_Multiplier和gdb调试器时出现分段错误:
编程接收信号SIGSEGV,分段故障。 Update_Multiplier()()
中的0x080b74e8
double upperbound = 116325;
double objective = 1.1707e+07;
int main()
{
Update_Multiplier();
}
void Update_Multiplier()
{
cout << "function 0" << endl;
// Determine subgradient vectors
double gra[1000][1000];
double grb[1000][1000];
double dumX = 0;
double stepsize[1000][1000];
double tuning=2;
double LRADum[1000][1000];
double LRBDum[1000][1000];
cout << "function 1" << endl;
// update subgradient vectors
for (int i=1; i<=noOfNodes; i++)
{
for (int j=1; j<=noOfNodes; j++)
{
if (C[i][j] != 0)
{
dumX=0;
for (int p=1; p<=noOfCommodity; p++)
{
dumX += X[i][j][p];
}
gra[i][j]=dumX-U[i][j]*Y[i][j]-Q[i][j];
grb[i][j]=Q[i][j]-B[i][j]*Y[i][j];
}
}
}
// update stepsize
cout << "function 2" << endl;
for (int i=1; i<=noOfNodes; i++)
{
for (int j=1; j<=noOfNodes; j++)
{
if (C[i][j] != 0)
{
stepsize[i][j]=(tuning*(UpperBound-Objective))/sqrt((gra[i][j]*gra[i][j])*(grb[i][j]*grb[i][j]));
LRADum[i][j]=LRA[i][j]+stepsize[i][j]*gra[i][j];
LRA[i][j]=LRADum[i][j];
LRBDum[i][j]=LRB[i][j]+stepsize[i][j]*grb[i][j];
LRB[i][j]=LRBDum[i][j];
}
}
}
}
答案 0 :(得分:7)
我在你的代码中看到两个可疑的东西。
首先,你占用了太多的堆栈空间(约40 MB) 其次,你将数组的索引从1开始,它应该是0:
for (int i=1; i<=noOfNodes; i++)
将其更改为:
for (int i=0; i<noOfNodes; i++)
答案 1 :(得分:3)
猜测,你有一个堆栈溢出!您无法在堆栈上可靠地创建巨大的数组。您需要动态或静态地创建它们。
答案 2 :(得分:3)
您在哪里定义noOfNodes
?这个的初始值是多少?或者,你从控制台读到这个吗?如果这是未初始化的,它可能有垃圾数据 - 这可能会或可能不会解释崩溃。
答案 3 :(得分:2)
你需要一个至少40兆字节的堆栈才能运行这个功能,因为你要分配五个数组,每个数组包含一百万个八字节双精度数。
更改函数以使用new从堆中分配双数组。
答案 4 :(得分:1)
你应该给我们整个代码,例如noOfNodes没有在任何地方定义。
只是在黑暗中刺伤:你的指数(C
和i
)从j
变为1
,你可能会溢出noOfNodes
吗? / p>
答案 5 :(得分:0)
首先,尼尔说的是真的。
其次,C和C ++数组从索引0开始。如果你宣布
int a[100]; // 100 elements, from zeroth to ninety-ninth.
然后它的元素是a[0]
,a[1]
... a[99]
。
答案 6 :(得分:0)
我看不出这个代码有什么问题,但是:如果noOfNodes是1000,你可能会有一个一个错误。
请记住,数组是0索引的,因此您必须在执行时访问索引0 - 999而不是1 - 1000
答案 7 :(得分:-1)
我也有这个问题,我的函数返回了std :: string现在我只是引用了这样的dreturn类型void:
void readOnDicoFile(std::ifstream file/*If you have "using namespace std;" instruction, put ifstream, not std::ifstream (you can put both)*/)
及之前:
std::string readOnDicoFile(std::string fileName/*If you have "using namespace std;" instruction, put ifstream, not std::ifstream (you can put both)*/)