2017-04-21 10 views
0

Könnte mir bitte jemand sagen, warum erhalte ich einen Segmentierungsfehler, wenn ich diesen Code ausführe? Ich versuche, eine PPM-Datei mit P6-Format zu öffnen, in der zweiten Zeile gibt es ihre Dimension, in der dritten Zeile gibt es eine 255-Konstante. Unten ist ein "2D-Array" aus Zahlen, die jedes Pixel darstellen. Ich weiß, es gibt 3 Zahlen für jedes Pixel (RGB), aber ich möchte immer noch alles in 2D-Array (3 Farben von einem Pixel nebeneinander) haben (deshalb multipliziere ich die Größe [1] mit 3), aber ich bekomme einen Segmentierungsfehler.Segmentierungsfehler beim Lesen von PPM

Vielen Dank für Hilfe :)

#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 aussehen (array, Größe [0] * size [1] * 3, 1, f);' 'wird die newline' umfassen, die' Constant' (255) folgt. –

+0

Ich bin eine Art Anfänger, können Sie mir einen besseren Weg zeigen, es zu tun? – lauderdice

+0

Ich habe den vorherigen Kommentar geändert, nachdem ich gesehen habe, dass Sie das P6-Format verwenden. Aber Sie müssen zumindest die Daten mit dem Array ausrichten. –

Antwort

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

Dies ist nicht die gute Möglichkeit, einen 2D-Array malloc. Sie müssen zuerst die Anzahl der "Zeilen" in Ihrem Array malloc und dann die Anzahl der "Spalten" für jede Zeile Ihres Arrays malloc.

Probieren Sie es durch das Ersetzen:

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

versucht, immer noch das Segm. Fehler. Jetzt habe ich wirklich keine Ahnung, wo der Fehler sein könnte – lauderdice

+0

Versuchen Sie, Debug-Drucke zu setzen, um genau zu wissen, wo der Segmentierungsfehler passiert. In C sind die meisten Segmentierungsfehler jedoch auf Zuweisungsprobleme zurückzuführen. – Silveris

+0

also gibt es wahrscheinlich ein Problem mit der dritten Reihe von unten --- array [k] [l] - denn wenn ich es in etwas anderes wie eine Konstante zum Beispiel zu ändern, druckt es eine schöne 10x30-Array. Ereignisarray [0] [0] wird nicht funktionieren (segm.fault) ...... – lauderdice

0

ich es habe !!!!! Das Problem bestand darin, die Elemente der Datei zu lesen. es sollte

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); 
    } 
} 
Verwandte Themen