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.