2017-04-21 22 views
0

아무도이 코드를 실행할 때 세그멘테이션 오류가 발생하는 이유를 알려주십시오. 나는 P6 형식의 PPM 파일을 열려고하는데 두 번째 줄에는 차원이 있고 세 번째 줄에는 255 개의 상수가 있습니다. 아래는 각 픽셀을 나타내는 숫자의 "2D 배열"입니다. 나는 각 픽셀 (RGB)에 대해 3 개의 숫자가 있음을 알고 있지만 여전히 2D 배열 (3 픽셀 씩 서로 섞어서 사용) (3을 곱한 크기 [1])의 모든 것을 가지고 싶습니다. 세분화 오류가 발생했습니다. 도움을PPM을 읽는 동안 세그먼트 오류가 발생했습니다

감사합니다 :)

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <unistd.h> 


int main(int argc, char*argv[]){ 

char *fname = argv[1]; 
FILE* f = fopen(fname, "r"); 
char format[3]; 
int size[2]; 

//reading image format 
fscanf(f,"%s", format); 
printf("%s\n", format); 

//reading size 
fscanf(f,"%d %d", size, size+1); 
printf("%d %d\n", size[0], size[1]); 

//reading a constant - 255 
int Constant=0; 
fscanf(f,"%d", &Constant); 

//mallocating a 2D array to store individual pixels 
uint8_t **array=malloc (3*size[1]*size[0]*sizeof(uint8_t)); 

//reading pixels from file and storing into array 
for(int i=0 ; i<size[1]; i++){ 
    for(int j=0 ; j<size[0]*3 ; j++){ 
    fread(array, size[0]*size[1]*3 , 1, f); 

    } 
} 

for(int k=0;k<size[1];k++){ 
    for(int l=0; l<size[0]*3; l++){ 
    printf("%d ", array[k][l]); 
    } 
printf("\n"); 
} 

return 0; 
} 
+0

fread (array, size [0] * size [1] * 3, 1, f);는'Constant' (255) 다음에 오는'newline '을 포함 할 것이다. –

+0

저는 초보자입니다. 더 좋은 방법을 보여줄 수 있습니까? – lauderdice

+0

P6 형식을 사용하는 것을보고 나서 이전 설명을 변경했습니다. 그러나 적어도 datya 배열을 정렬해야합니다. –

답변

0
uint8_t **array=malloc (3*size[1]*size[0]*sizeof(uint8_t)); 

이 2 차원 배열을 malloc을 할 수있는 좋은 방법이 아니다. 먼저 배열의 "행"수를 malloc 한 다음 배열의 각 행에 대해 "열"수를 malloc합니다.

하여 교체하십시오 :

uint8_t **array = malloc(size[1] * sizeof(uint8_t*)); 
for (size_t i = 0; i < size[1]; ++i) 
    array[i] = malloc(3 * size[0] * sizeof(uint8_t)); 
+0

시도, 여전히 Segm지고. 결점. 지금은 어디에 오류가있을 수 있는지 전혀 모른다. – lauderdice

+0

세그멘테이션 오류가 발생하는 곳을 정확하게 알기 위해 디버그 프린트를 시도해보십시오. C에서 대부분의 분할 오류는 할당 문제로 인한 것입니다. – Silveris

+0

그래서 배열 - [k] [l] 아래쪽에서 세 번째 행에 문제가있을 수 있습니다. 왜냐하면 내가 어떤 상수와 같은 다른 것으로 변경하면 좋은 10x30 배열을 인쇄하기 때문입니다. 이벤트 배열 [0] [0] 실 거예요 (segm.fault) ...... – lauderdice

0

을 내가 그것을 가지고 !!!!! 문제는 파일의 요소를 읽는 데있었습니다. 그것은 같아야한다

for(int i=0 ; i<size[1]; i++){ 
    for(int j=0 ; j<size[0]*3 ; j++){ 
     fread(*array, size[0]*size[1]*3 , 1, f); 
    } 
}