2014-01-22 3 views
0

다음 코드에 몇 가지 문제가 있습니다. newrows는 내가 일하고있는 함수에 직접 주어지는 매개 변수입니다. 다른 매개 변수를 사용하여 요소가 조금 더 빨리 계산됩니다. 여하튼, newrows 및 요소에 대한 값의 일부 조합에 대해서는 코어 덤프를 얻는 반면 다른 조합은 정상적으로 작동합니다. 일반적으로 코어 덤프가 발생하면 반복 횟수는 20000 ~ 25000 회입니다. 그러나 모든 것이 잘 작동하면 최대 40000 번의 반복 작업이 수행됩니다. 잘 작동배열을 반복하는 동안 코어 덤프가 발생했습니다.

int32_t newimage[newrows][elements][3]; 
    int32_t pixelcounter[newrows][elements]; 

    //int32_t norm, angle, rohmax; 
    //double r, alpha, beta, m, mu; 



    //initialize arrays 

    for(i=0; i<newrows; i++){ 
     for(j=0; j<elements; j++){ 
      pixelcounter[i][j] = 0; 
      newimage[i][j][0] = 0; 
      newimage[i][j][1] = 0; 
      newimage[i][j][2] = 0; 

     } 
    } 

조합 : 200 : 188

조합 코어 덤프에 이르게 : 200 : 나는 리눅스를 사용하고 376

은 BTW :-)

답변

0

이 가장 가능성이있다 스택 공간 문제. newimagepixelcounter은 선언 된 함수의 스택 프레임에 할당됩니다. 많은 양의 데이터를 할당하려고하면 공간이 부족할 수 있습니다. 귀하의 3 차원 배열 newimage 내가 프로그램을 정리

#bytes = newrows * elemets * 3

로 (조언의 좋은 조각을 시도하고 컴파일있는 프로그램입니다, 그래서 사람들이 빨리 당신을 도울 수 있습니다!) 성장 :

#include <stdio.h> 
#include <stdint.h> 

void test(size_t newrows, size_t elements) { 
    int32_t newimage[newrows][elements][3]; 
    int32_t pixelcounter[newrows][elements]; 

    //initialize arrays 

    for(size_t i=0; i<newrows; i++) { 
     for(size_t j=0; j<elements; j++) { 
      pixelcounter[i][j] = 0; 
      newimage[i][j][0] = 0; 
      newimage[i][j][1] = 0; 
      newimage[i][j][2] = 0; 
     } 
    } 
} 

int main(void) { 
    printf("Size of integer = %ld\n", sizeof(int)); 
    for (size_t i = 700; ; i += 10) { 
      printf("Testing (%ld, %ld)\n", i, i); 
      test(i, i); 
    } 
    return 0; 
} 

그리고이 실행, 나는 참조 : 그래서 어딘가 720^2 * 3 * 4730^2 * 3 * 4 바이트 사이

Size of integer = 4 
Testing (700, 700) 
Testing (710, 710) 
Testing (720, 720) 
Testing (730, 730) 
[3] 13482 segmentation fault (core dumped) ./a.out 

하는을이다 내 64 비트 Linux 컴퓨터에서 약 6 MiB, 컴퓨터에 따라 다를 수 있습니다.

이 경우 솔루션은 작업 할 메모리가 더 많은 힙에 배열을 할당합니다. 힙 할당 다차원 배열에 대한 자세한 내용은 How does C allocate space for a 2D (3D...) array when using malloc?에서 확인할 수 있습니다.