2011-12-19 2 views
0

좋아요. 그래서 저는 c로 int의 3 차원 배열로부터 히스토그램을 만들려고합니다. 다음은 배열을 편집하는 선입니다.배열을 조작 할 때 잘못된 명령이 발생했습니다.

buckets[(int)floor(x/splits)][(int)floor(y/splits)][(int)floor(z/splits)]++; 

X, Y는, Z는 분할은 사용자로부터 입력 된 질문했다 (이 루프 인) 이전 프로그램 생성 하였다. 그런 다음이 데이터를 막대 그래프에 넣으려고합니다. 컴파일러가 제게 불법적 인 지시를 내리고 있습니다.

이 지점까지 작업 한 프로그램에 print 서술문을 넣었으므로 이후에는 나오지 않으므로 여기에 있습니다. 다음은 모든 relavent 코드입니다.

ff=fopen(fname,"r"); 
int buckets[split][split][split]; 
splits = (double) 1/split; 
for(i=0; i<split; i++){ 
    fscanf(ff,"%lf",&x); 
    fscanf(ff,"%lf",&y); 
    fscanf(ff,"%lf",&z); 
    buckets[(int)floor(x/splits)][(int)floor(y/splits)][(int)floor(z/splits)]++;  
    fclose(ff); 
} 
int histogram[10]; 
for (i=0; i<split; i++) { 
    for (j=0; j<split; j++){ 
     for(k=0;k<split;k++){ 
      histogram[(int)buckets[i][j][k]]++; 
     } 
    } 
} 
+2

가장 큰 원인은'buckets [i] [j] [k]'의 값이'histogram' 배열의 길이보다 길다는 것입니다. 그게 문제가 아니라면 최소한의 자체 테스트 케이스를 포함하도록 질문을 편집하십시오 (http://sscce.org 참조). –

+1

컴파일러는 불법적 인 명령어를 생성하지 않습니다. 버퍼 오버 플로우로 스택을 날려 버리고 함수가 반환 될 때 크래시가 발생하는 것은 일반적인 설명입니다. 디버거를 사용하고 발견 한 내용으로 질문을 업데이트하십시오. –

+2

'printf '를 사용하면'\ n'을 출력하거나'fflush (stdout)'을 호출하여 버퍼가 플러시되었는지 확인해야하기 때문에 프로그램이 실패한 정확한 행을 제공하지 못할 수도 있습니다. 문제가되는 행을 찾으려면 valgrind를 사용하여 프로그램을 실행할 수 있습니다. – murgatroid99

답변

1

당신이 당신의 배열을 정의 할 때 :

int buckets[split][split][split]; 

을 당신이 좋아하는 뭔가를 초기화하지 않습니다

memset(buckets, 0x00, sizeof(int) * split * split * split);

그래서 버킷은 그 안에 알 수없는 값이 있습니다. 그런 다음이 숫자를 증가하지만, 당신이 할 때

histogram[(int)buckets[i][j][k]]++;

buckets[i][j][k] 아무것도 동일 될 수 있습니다. 해결 방법은 배열 선언 다음에 memset()을 추가하는 것입니다.

+0

코드에 두 가지 문제점이 있습니다. 1) 배열을 0으로 초기화해야합니다. 새 방법을 사용해 주셔서 감사합니다. 대신 for 루프를 사용했습니다. 2) for 루프 내에서 fclose()를 사용하여 재개를 유지하고 처음부터 시작했습니다. – Treesrule14

0

실행 중에 (gdb 사용) - split, x, y, z 및 split의 실제 값을 공유하십시오.

처음에는 올바른 값이 표시되고 갑자기 이상이 보이는 경우 스택 오버플로가 발생할 수 있습니다. 따라서 동적 메모리 할당 (힙을 사용)을 사용해보십시오. valgrind를 사용하여 메모리 누수를 탐지하십시오.

관련 문제