2017-04-21 1 views
0

Est-ce que quelqu'un pourrait me dire pourquoi je reçois une erreur de segmentation lors de l'exécution de ce code? J'essaie d'ouvrir un fichier PPM avec le format P6, sur la deuxième ligne il y a sa dimension, sur la troisième ligne il y a une constante 255. Voici un "tableau 2D" de nombres représentant chaque pixel. Je sais qu'il y a 3 nombres pour chaque pixel (RVB) mais je veux tout avoir en 2D (3 couleurs d'un pixel l'un à côté de l'autre) (c'est pourquoi je multiplie la taille [1] par 3), mais je Je reçois une erreur de segmentation.Erreur de segmentation lors de la lecture de PPM

Merci pour l'aide :)

#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);' comprendra le 'newline' qui suit' Constant' (255). –

+0

Je suis un débutant, pouvez-vous me montrer une meilleure façon de le faire? – lauderdice

+0

J'ai changé le commentaire précédent après avoir vu que vous utilisez le format P6. Mais vous devez au moins aligner le datya avec le tableau. –

Répondre

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

Ce n'est pas la bonne façon de malloc un tableau 2D. Vous devez d'abord placer le nombre de "lignes" dans votre tableau, puis augmenter le nombre de "colonnes" pour chaque ligne de votre tableau.

Essayez de le remplacer par:

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

essayé, toujours obtenir le Segm. faute. Maintenant, je n'ai vraiment aucune idée où l'erreur pourrait être – lauderdice

+0

Essayez de mettre des impressions de débogage pour savoir exactement où se produit la faute de segmentation. En C, la plupart des erreurs de segmentation sont dues à des problèmes d'allocation. – Silveris

+0

donc il y a probablement un problème avec la troisième ligne à partir du bas --- array [k] [l] - parce que si je le change à quelque chose d'autre comme une constante par exemple, il imprime un joli tableau 10x30. tableau d'événements [0] [0] ne fonctionnera pas (segm.fault) ...... – lauderdice

0

Je l'ai !!!!! le problème était dans la lecture des éléments du fichier. il devrait ressembler à

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