Cześć,
muszę stworzyć w C program do obróbki obrazów w formacie PGM, który będzie je odczytywał z pliku do tablicy i wykonywał na nich różne operacje. Napisałem wszystkie funkcje do obróbki i funkcje odczytu z pliku i zapisu. Program kompiluje się poprawnie, ale przy próbie wczytania obrazu, po podaniu nazwy, kończy się błędem "segmentation fault". Dodam, że kompilowałem za pomocą GCC na Linuksie.
Funkcja i wywołanie wczytania wyglądają tak:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 512 // maksymalny rozmiar obrazu
#define DL_LINII 1024 // dlugosc buforow pomocniczych
// ODCZYT OBRAZU Z PLIKU DO TABLICY:
int czytaj (FILE *plik_wej, int obraz_pgm [][512], int *wymX, int *wymY, int *szarosci)
{
char buff [DL_LINII]; // bufor pomocniczy
int znak; // zmienna pomocnicza
int koniec; // monitorowanie konca danych w pliku
int i, j;
// KONTROLA POPRAWNOSCI PLIKU:
if (plik_wej == NULL)
{
fprintf (stderr, "Blad: podany plik jest nieprawidlowy!\n");
return 0;
}
// "NUMER MAGICZNY":
if (fgets (buff, DL_LINII, plik_wej) == NULL) koniec = 1; // wczytanie pierwsze linii z pliku
if (buff [0] != 'P' || buff [1] != '2' || koniec)
{
fprintf (stderr, "Blad: podany plik nie jest plikiem PGM!\n");
return 0;
}
// POMIJANIE KOMENTARZY:
do {
if ((znak = fgetc(plik_wej)) == '#')
{
if (fgets(buff, DL_LINII, plik_wej) == NULL) koniec=1;
else ungetc(znak, plik_wej);
}
} while (znak == '#' && !koniec);
// POBRANIE PARAMETROW OBRAZU:
if (fscanf (plik_wej, "%d %d %d", wymX, wymY, szarosci) != 3)
{
fprintf (stderr, "Blad: Brak wymiarow obrazu lub liczby stopni szarosci\n");
return(0);
}
// ZAPISANIE OBRAZU W TABLICY:
for (i=0; i<*wymY; i++)
{
for (j=0; j<*wymX; j++)
{
if (fscanf(plik_wej, "%d " ,&(obraz_pgm [i][j])) != 1)
{
fprintf (stderr, "Blad: Niewlasciwe wymiary obrazu\n");
return(0);
}
}
}
return *wymX * *wymY;
}
/************************************/
switch (Wybor)
{
// WCZYTANIE:
case 1: CzyWczytany = 0;
printf ("Podaj nazwe pliku: ");
scanf ("%s", &nazwa_wej);
printf ("%s", nazwa_wej);
plik = fopen (nazwa_wej, "r");
if (czytaj (plik, obraz, &wymX, &wymY, &szarosci) != 0);
printf ("Obraz wczytany pomyslnie\n");
CzyWczytany = 1;
fclose (plik);
break;
/**********************************/
A gdyby to nie wystarczyło, to tak wygląda cały program: http://pastebin.com/WHKGVe4i
Z góry wielkie dzięki za pomoc.