2017-04-21 172 views
0

有沒有人可以告訴我爲什麼在運行此代碼時遇到分段錯誤?我試圖用P6格式打開一個PPM文件,第二行有它的維度,第三行有一個255常量。 下面是代表每個像素的數字的「二維數組」。我知道每個像素(RGB)有3個數字,但我仍然希望將它全部放在二維數組中(一個像素相鄰的三種顏色)(這就是爲什麼我將size [1]乘以3),但是我我正在分段錯誤。閱讀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(數組,大小[0] *尺寸[1] * 3,1,F);'將包括'newline'下面'Constant'(255)。 –

+0

我是一個初學者,你能告訴我一個更好的方法嗎? – lauderdice

+0

在看到您使用P6格式後,我更改了以前的評論。但是你至少必須將datya與數組對齊。 –

回答

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

這並不是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

因此,從底部開始的第三行可能存在一個問題--- array [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); 
    } 
}