wczytywanie obrazu pgm do tablicy

0

Witam, tworzę funkcję, która ma za zadanie wczytać plik *.pgm do tablicy dwuwymiarowej z wypisaniem komentarzy zawartych w pliku
stworzyłem coś takiego:

#include <stdio.h>
#define DL_LINII 248
#define MAX 512
int main()
{
    int i=0,j=0,koniec=0,wymx,wymy,szarosci;
    char znak;
    char linia[DL_LINII];
    char komentarz[8][DL_LINII];
    int obraz[MAX][MAX];
    FILE *plik;
    plik=fopen("feep.pgm","r");
    /********************* uchwyt ****************************/
    if (plik==NULL)
    {
        fprintf(stderr,"Blad: Nie podano uchwytu do pliku\n");
        return(0);
    }
    /*********************** P2 *******************************/
    if(fgets(linia,DL_LINII,plik)==NULL)
        koniec=1;                                           /*nie udalo sie pobrac linii*/
    if (linia[0]!='P'||linia[1]!='2'||koniec)
    {
        fprintf(stderr,"Blad: To nie jest plik PGM\n");
        return 0;
    }
    /***********************  komentarze **********************/
    while (znak=fgetc(plik)=='#')
    {
        ungetc(znak,plik);
        fgets(linia,DL_LINII,plik);

        for(j=0;j<sizeof(linia);j++)
        komentarz[i][j]=linia[j];
        i++;
    }
    printf("%s",komentarz[0]);
    printf("%s",komentarz[1]);

    /************************ wymiaty i szarosci ****************/
    if (fscanf(plik,"%d %d %d",wymx,wymy,szarosci)!=3)
    {
        fprintf(stderr,"Blad: Brak wymiarow obrazu lub liczby stopni szarosci\n");
        printf("%d %d %d",wymx,wymy,szarosci);
        return(0);
    }
    /********************** wczytanie tablicy *****************/
    for (i=0;i<wymy;i++)
        {
        for (j=0;j<wymx;j++)
            {
                if (fscanf(plik,"%d",&(obraz[i][j]))!=1)
                    {
                        fprintf(stderr,"Blad: Niewlasciwe wymiary obrazu\n");
                        return(0);
                    }
            }
        }
  /**************************************************************/

    fclose(plik);
    return 0;
}

Ale program zamiast zwrócić '#' zwraca mi inny znak <dlaczego?>
wysypuje się, kiedy chcę wczytać z pliku wymx,wymy,szarości <?>
Nie mogę sobie z tym poradzić.
Proszę o naprowadzenie mnie na rozwiązanie tego problemu.
plik feep.pgm

P2
# elo.xd
# feep.pgm
24 7
15
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 3 3 3 3 0 0 7 7 7 7 0 0 11 11 11 11 0 0 15 15 15 15 0
0 3 0 0 0 0 0 7 0 0 0 0 0 11 0 0 0 0 0 15 0 0 15 0
0 3 3 3 0 0 0 7 7 7 0 0 0 11 11 11 0 0 0 15 15 15 15 0
0 3 0 0 0 0 0 7 0 0 0 0 0 11 0 0 0 0 0 15 0 0 0 0
0 3 0 0 0 0 0 7 7 7 7 0 0 11 11 11 11 0 0 15 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Pozdrawiam, PkNagato

0

a uzywales debuggera?

0

tak, GDB/CDB

0

no i co Ci powiedzial, co jest zle co nie dziala?

0

Nic nie wyrzuca. Sukces. A po włączeniu program się wysypuje.
Problemem wysypywania jest wczytywanie wymiarów i szarości <sprawdzone metodą wytnij i zobacz czy działa>

0

debugger to nie kompilacja. Doczytaj co to jest debugger i jak sie go uzywa.
Zapewne nadpisujesz miejsce w pamieci ktorego nie posiadasz i dlatego sie wysypuje. Sprawdz to debuggerem. Nikt za Ciebie tego nie zrobi

0

coś takiego dostałem

Starting debugger: D:\Program Files (x86)\CodeBlocks\MINGW\bin\gdb.exe -nx -fullname  -quiet  -args D:/gowna/lab4/bin/Debug/lab4.exe
done
Registered new type: wxString
Registered new type: STL String
Registered new type: STL Vector
Setting breakpoints
Debugger name and version: GNU gdb (GDB) 7.6.1
Child process PID: 9636
At D:\gowna\lab4\main.c:6
0

nadal zgadujesz i wrzucasz rzeczy na zasadzie "a moze sie uda"

sprawdz jakie masz IDE i wpisujesz w google

NAZWATWOJEGOIDE how to debug

np

https://www.google.nl/search?q=codeblocks+how+to+debug&oq=codeblocks+how+to+debug&aqs=chrome..69i57.2871j0j1&sourceid=chrome&es_sm=93&ie=UTF-8#q=code+blocks+how+to+debug

pierwsza strona pokazuje przewaznie jak to sie robi

http://wiki.codeblocks.org/?title=Debugging_with_Code::Blocks

0

user image Coś takiego mi wyrzuca.

1
pknagato4 napisał(a):

user image Coś takiego mi wyrzuca.

Uśmiechnąłem się od ucha do ucha. Weź Ty poczytaj co to w ogóle jest debuger, do czego służy, jak się go używa i po co... Tu masz link do artykułu, który powinien Ci pomóc, chociaż to C# to zasady są identyczne: Debugowanie.

0

Rozumiem, jak działa debugger, po co się go używa. Włączam sobie program, żeby chodził krokowo i sprawdzam, jak się/co się zmienia tak?
Włączyłem, po dotarciu do fscanf(plik,(..)) wyrzuca mi takie okno + komunikat segmentation fault.

1

to:

fscanf(plik,"%d %d %d",wymx,wymy,szarosci)

zamień na to:

fscanf(plik,"%d %d %d",&wymx,&wymy,&szarosci)
0

Mimo naprawienia tamtego błędu męczę się nadal z tym zadaniem i gdzieś popełniam błąd.
-przekazuję do funkcji odczyt tablicę jednowymiarową zmiennych typu char do których pod każdym indeksem będę chciał podpisać zmienną linia

 
int odczyt(char *nazwa,int obraz[][MAX],int *wymx,int *wymy,int *szarosci,char komentarz[DL_LINII])
{
    int i=0,j=0,koniec=0;
    char znak;
    char linia[DL_LINII];

    FILE *plik;
    plik=fopen(nazwa,"r");
    
    /***********************  komentarze **********************/
    while ((znak=fgetc(plik))=='#')
    {
        ungetc(znak,plik);
        fgets(linia,DL_LINII,plik);

        komentarz[i+1]=linia;
        i++;
    }
    ungetc(znak,plik);
}
fclose(plik);

//z main

int obraz [MAX][MAX];
    int wymx,wymy,szarosci;
    char komentarz[DL_LINII];
 
    
                odczytano=odczyt(&nazwa_pliku,obraz,&wymx,&wymy,&szarosci,komentarz);

W momencie, kiedy chcę przypisać do komentarz[i+1] to co jest w linia coś idzie nie tak.
Nie rozumiem, dlaczego na początku pod komentarz podpisuje się reszta tego co wpisuję jako nazwa pliku a następnie już nic. zmienna linia dobrze się "zachowuje" jednak potrzebuję zapisać ją w miejscu, które nazwałem komentarz.

Jakby kogoś interesował cały kod: jest w załączniku//jako cpp, ponieważ nie przechodzi c
treść pliku testowego jest w pierwej wiadomości.

1 użytkowników online, w tym zalogowanych: 0, gości: 1