2017-04-21 6 views
0

このコードを実行すると、なぜセグメンテーションフォルトが発生するのですか?私はP6形式のPPMファイルを開こうとしています.2行目に次元があり、3行目には255の定数があります。 以下は、各ピクセルを表す数字の「2D配列」です。私は各ピクセル(RGB)の3つの数字があることを知っているが、私はまだ2次元配列(1つのピクセルの3色のお互いの隣に)(thatsなぜ私は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(配列、サイズ[0] *サイズ[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]の下から3番目の行に問題がある可能性があります。例えば、定数のようなものに変更すると、素敵な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); 
    } 
} 
関連する問題