2010-01-22 2 views
1

분할 오류를 호출했을 때세그먼트의 결함 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

흠, 아마도 40MB의 스택 공간이 필요합니다. 플랫폼이란 무엇이며 스택에 할당 된 메모리 양을 알고 있습니까? –

+0

그는 다른 누구도 알지 못하는 256 비트 프로세서, ~ 200TB RAM이있는 컴퓨터 중 하나를 프로그래밍하고 있다고 생각합니다. – pyon

+0

솔직히 말해서, 그것이 세그 폴트 (segfault)가되는 것은 꽤 놀랍습니다. Cout, endl, noOfNodes, C, noOfCommodity, X, U, Y, Q, B, UpperBound 선언을 볼 수 없습니다. ,'Objective','sqrt','LRA','LRB'입니다. 또한 'main'에서 호출 된 Update_Multiplier에 대한 선언이 없습니다. –

답변

3

, 당신은 스택 오버플로가! 스택에 거대한 배열을 안정적으로 만들 수는 없습니다. 그것들을 동적으로 또는 정적으로 생성해야합니다.

3

어디에서 noOfNodes을 정의 했습니까? 이것의 초기 값은 무엇입니까? 아니면, 콘솔에서 이것을 읽으십니까? 이것이 초기화되지 않은 경우에는 충돌을 설명 할 수도 있고 그렇지 않을 수도있는 정크 데이터가있을 것입니다.

7

코드에 의심스러운 2 가지가 있습니다.

첫째, 너무 많은 스택 공간 (약 40MB)을 사용하고 있습니다. 그것이 있어야 할 곳에
둘째, 당신은, 1에서 0을 배열의 인덱스를 시작 :

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

변경 그것을 :

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

ㅎ .. 나를 때려.큰 스택이 가능할지라도 이것이 가장 가능성있는 시나리오라고 생각합니다. – Randolpho

+0

1에서 시작하는 루프에 대한 주석도 유효하지만 noOfNodes의 값을 알 수는 없습니다. 그것이 1,000보다 작 으면 적어도 그 부분은 괜찮을 것입니다. 하지만 1,000 명이 넘으면 어떨까요? noOfNodes가 결코 커질 수 없다는 가정하에 함수가 1,000 x 1,000 배열을 할당하는 것 같습니다. noOfNodes의 실제 값을 사용하여 힙에서 동적으로 할당해야합니다. –

+0

@Willis Blackburn : noOfNodes가 배열의 정확한 항목 수로 설정 되더라도, 1에서 시작하고'i <= noOfNodes'를 사용하면 segfault가됩니다. – Randolpho

2

당신은 실행하는 데 적어도 40 메가 바이트 스택이 필요합니다 이 함수는 1 개의 8 바이트 2 배의 배열을 5 개 할당하기 때문에 가능합니다.

new를 사용하여 힙에서 이중 배열을 할당하는 함수를 변경하십시오.

+0

+1 Ya it is ~ ~ 40 MB. 나는 그것이 ~ 5 메가 바이트 내 게시물에 처음 언급했다 :) – AraK

1

전체 코드를 제공해야합니다. noOfNodes는 어디에도 정의되어 있지 않습니다.

그냥 어둠 속에서 자상가 : noOfNodes1에서 당신이 가능하게 당신의 인덱스 (ij) 이후 C을 넘쳐 이동?

0

먼저 닐이 말한 사실은 사실입니다.

둘째, C 및 C++ 배열은 인덱스 0부터 시작합니다. 당신이

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

를 선언하면 그 다음 요소는 a[0], a[1] ... a[99]이다.

나는 주어진이 코드로 잘못 아무것도 볼 수는 없지만
0

: noOfNodes 당신이 인덱스에 액세스 할 수 있도록 1000

이 배열은 0 색인 것을 기억하는 경우 당신은 off-by-one 오류가있을 수 있습니다 당신이하고있는 것처럼 1 - 1000 대신에 0 - 999