• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Segmentation fault przy wczytywaniu z pliku do tablicy

0 głosów
90 wizyt
pytanie zadane 27 stycznia 2017 w C i C++ przez Shyller Nowicjusz (140 p.)

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.

 

komentarz 27 stycznia 2017 przez koczurekk Gaduła (3,440 p.)
Napisz kompletny i minimalny kod generujący błąd, który można samemu skompilować i zobaczyć co się dzieje, prawdopodobnie robiąc to sam zobaczysz co jest źle.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 56 wizyt
0 głosów
3 odpowiedzi 163 wizyt
pytanie zadane 6 kwietnia 2018 w C i C++ przez Mateusz Tocha Bywalec (2,560 p.)
0 głosów
1 odpowiedź 62 wizyt
Porady nie od parady
Publikując kody źródłowe korzystaj ze specjalnego bloczku koloryzującego składnię (przycisk z napisem code w edytorze). Nie zapomnij o ustawieniu odpowiedniego języka z rozwijanego menu oraz czytelnym formatowaniu kodu.Przycisk code

62,398 zapytań

108,540 odpowiedzi

226,577 komentarzy

35,629 pasjonatów

Przeglądających: 170
Pasjonatów: 3 Gości: 167

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...