2010-01-22 30 views
1

分段故障时:段故障时调用的Update_Multiplier和gdb调试器示出了这些调用函数

计划接收信号SIGSEGV,分割故障。 0x080b74e8在Update_Multiplier()()

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

嗯,可能需要40MB的堆栈空间。什么是平台,你知道有多少内存被分配给堆栈? – 2010-01-22 14:53:08

+0

我认为他正在编程其中一台具有256位处理器的计算机,其他人都不知道〜200TB的RAM。 – pyon 2010-01-22 15:00:58

+0

说实话,它甚至会出现段错误,这真是令人惊讶。我看不到cout,endl,noOfNodes,C,noOfCommodity,X,U,Y,Q,B,UpperBound的声明, ,'Objective','sqrt','LRA','LRB'。另外,从'main'调用的范围内没有Update_Multiplier的声明。 – 2010-01-22 15:04:47

回答

3

在猜测,你有一个堆栈溢出!您无法可靠地在堆栈上创建巨大的阵列。您需要动态或静态地创建它们。

3

你是从哪里定义的noOfNodes?这是什么初始值?或者,你是否从控制台读取了这些内容?如果这是未初始化的,它可能有垃圾数据 - 这可能或可能不会解释崩溃。

7

我在代码中看到两个可疑的东西。

首先,您要占用太多堆栈空间(大约40 MB)。
其次,你从数组的索引1,它应该是0:

for (int i=1; i<=noOfNodes; i++) 

将其更改为:

for (int i=0; i<noOfNodes; i++) 
+0

heh ..打我吧。虽然大堆是可能的,但我认为这是最可能的情况。 – Randolpho 2010-01-22 14:57:16

+0

有关从1开始的循环的注释也是有效的,但我们不知道noOfNodes的值。如果它少于1,000则该部分至少会没事。但如果它大于1,000呢?看起来这个函数只是假设noOfNodes永远不会那么大,只分配1,000 x 1,000个数组。它应该使用noOfNodes的实际值并从堆中动态分配它们。 – 2010-01-22 15:01:30

+0

@Willis Blackburn:即使noOfNodes设置为数组中的确切数量,从1开始并使用'i <= noOfNodes'将会出现段错误。 – Randolpho 2010-01-22 15:03:13

2

至少需要40兆字节的堆运行这个函数是因为你要分配五个一百万个八字节的数组。

更改函数以使用new从堆中分配双数组。

+0

+1雅是~40 MB。我第一次提到它是〜5 MB在我的职位:) – AraK 2010-01-22 14:59:03

1

你真的应该给我们整个代码,例如noOfNodes没有在任何地方定义。

只是在黑暗中刺:你可能溢出C因为你的指数(ij)从1noOfNodes

0

首先,尼尔说的是真的。

其次,C和C++数组从索引零开始。如果你声明

int a[100]; // 100 elements, from zeroth to ninety-ninth. 

那么它的元素是a[0]a[1] ... a[99]

0

我看不出什么毛病给出这个代码,但如果noOfNodes是1000

请记住,数组是0索引,所以你必须访问索引你可能有一个差一错误0 - 999而不是1 - 1000,因为你在做