[C++] zapis struktury

0

Zdaje sobie sprawę z tego że mój problem jest zapewne trywialny
ale proszę o pomoc bo naprawde skonczyły mi się pomysly gdzie moge miec błąd:

[błąd-podczas zapisu "program wykonuje nieprawidlową operacje"] [???]
[całość jest w klasie,kompilator DevC++]

Defincje:

   struct Point2d{    int x,y; };

    struct sPoint{
        Point2d  pos;
        bool marked;
    }sPoint points[100];

    struct sWall{
       int  pt[2];
       DWORD size;
    }sWall walls[100];//sciany

Funkcja zapisu:

bool Save(char *filename)
{
        FILE* plik = fopen(filename,"wb");
        if(!plik)    return false;

        fwrite(&num_pts,   sizeof(int),  1,                   plik);
        fwrite(points,         sizeof(sPoint),  num_pts,   plik);
        
        fwrite(&num_walls,sizeof(int), 1,                     plik);
        fwrite(walls,          sizeof(sWall),  num_walls,   plik);

        fclose(plik);
        return true;
}

Analogiczna Funkcja odczytu:

bool Open(char *filename)
{
        FILE* plik = fopen(filename,"rb");
        if(!plik)    return false;

        fread(&num_pts,   sizeof(int),  1,                   plik);
        fread(points,         sizeof(sPoint),  num_pts,   plik);
        
        fread(&num_walls,sizeof(int), 1,                     plik);
        fread(walls,          sizeof(sWall),  num_walls,   plik);

        fclose(plik);
        return true;
}

bardzo proszę o pomoc i ewentualną lekturę

0

Dev-C++ to nie kompilator a pisane w Delphi IDE dla kompilatora G++ z MinGW. Jedną z cech tego środowiska jest porzucenie projektu w wersji beta, do tego ostatnia wydana wersja posiada silnie zbugowaną wersję kompilatora. Ale przejdźmy do kodu.

Po pierwsze - ten kod nie powinien w ogóle dać się skompilować ze względu na błąd w definicji drugiej struktury i tablicy obiektów:

struct sPoint {
  Point2d  pos;
  bool marked;
} sPoint points[100];

Podwajasz nazwę struktury, nazwę dla struktury po jej definicji można podać jedynie typedefując ją. Powinno być:

struct sPoint {
  Point2d  pos;
  bool marked;
} points[100];

To samo tyczy się w sumie i trzeciej struktury. Widać to badziewie udające kompilator zgodny ze standardem puszcza takie kfiatki, że aż zęby bolą.

Tak szczerze mówiąc to w tym kodzie innych błędów nie widzę, tutaj praktycznie nie może coś się sypać. U siebie mam dosyć nowe G++ 4.2.1, po powyższej poprawce kod kompiluje się i działa. Jeżeli to wszystkie ważne dla tego programu elementy to mamy problem. Debugger Dev-a sam wymaga debuggera żeby łaskawie zadziałać (i pomyśleć, że to tylko frontend dla GDB). Z tym GCC co w Dev-ie siedzi miałem (jak pewnie wszyscy z większym doświadczeniem) trochę nieprzyjemności, jak żle obliczane adresy skoków, źle budowana ramka stosu... czyli po prostu program sypiący się w miejscach, w których formalnie nie miał prawa. Polecam wrzucenie paczki stąd - http://nuwen.net/mingw.html - najnowsze MinGW + trochę libów i narzędzi, już takich cyrków nie odstawia.

Wiesz co? Skoro to elementy klasy to daj przynajmniej część tej klasy + kod używający powyższych metod, jeżeli nie w kompilatorze to tam leży błąd. Może błąd w przekazywaniu nazwy pliku lub jej ew. składaniu?

O tej godzinie już nic innego nie wymyślę; mam nadzieję, że post wygląda sensownie, pierwszy wysyłany pod emacs-em.

A, i jeszcze jedno, jak nie to co wyżej - czy num_pts i num_walls na pewno mają poprawne wartości z przedzialu 0 < n < 100?

0

Oj ale narobiłem
porzedni zapis wynikał tylko z niewałasciwego kopiowania. orginał:

struct sWall{
       int  pt[2];
       DWORD size;
    }walls[max_num_walls];//sciany
    int num_walls;//licznik scian
    
    struct sPoint{
        Point2d  pos;//pozycja
        bool marked;//WARNING! don't save in FILE
    }points[max_num_pts];
    int num_pts;//licznik punktow

[!!!] ZAMIENIŁEM BIBOTEKI NA NOWE (popsostu podmieniając konflikotew zawartości w C:\Dev-Cpp)

kod:

    bool Save(char *filename)//zapisz do pliku
    {
        sprintf(filename,"nowy.bin");
        FILE* plik = fopen(filename,"wb");
        if(!plik)    return false;

        fwrite(&num_pts,   sizeof(int),  1,        plik);
        fwrite(points ,sizeof(sPoint),  num_pts,   plik);
        
        fwrite(&num_walls,   sizeof(int),  1,      plik);
        fwrite(walls,sizeof(sWall),  num_walls,    plik);

        fclose(plik);
        MessageBox(0,"save ok",0,0);
        return true;
    }

    bool Open(char *filename)//zapisz do pliku
    {
        sprintf(filename,"nowy.bin");
        FILE* plik = fopen(filename,"rb");
        if(!plik)    return false;

        fread(&num_pts,   sizeof(int),  1,        plik);
        fread(points ,sizeof(sPoint),  num_pts,   plik);        
        fread(&num_walls,   sizeof(int),  1,      plik);
        fread(walls ,sizeof(sWall),  num_walls,   plik);

        fclose(plik);        
        MessageBox(0,"open ok",0,0);
        return true;
    }

[wstyd] program sypie się w tym samym momencie tylko z większym opóźnieniem:( [wstyd]
tak dziękuje post bardzo czytelny

tak

czy num_pts 
num_walls

są z przedzialu 0do4;P sprawdzone przed zapisem

probowalem nawet:

       
        fwrite(points ,sizeof(sPoint)*num_pts,  1,   plik);
        fwrite(walls,sizeof(sWall)*num_walls,  1,    plik);

ten sam błąd.. [glowa]

0

A nie sypie się przypadkiem gdy chcesz zapisać 0 elementów?

0

własnie nie przy 0 jest czasem ok a jesli wiecej niz 0 to zawsze się sype:(

0

A co to jest za koszmarek ?

    bool Save(char *filename)//zapisz do pliku
    {
        sprintf(filename,"nowy.bin");
     .........

Co podajesz jako parametr wywołania fun Save(???) ?
sprintf w tym miejscu nadpisuje coś [ i po co ?]

0

Fakt, tego nie zauważyłem...

0

klacze są seksowne nie zauważyłeś bo tego nie było!
Tę linię specjalnie dodałem żeby nie było wątpliowci że nazwa pliku jest odpowiednia...

ok jakie macie sugestie obejscia problemu?

0

Tę linię specjalnie dodałem żeby nie było wątpliowci że nazwa pliku jest odpowiednia...

E tam,tak się nie robi ,teraz dopiero są wątpliwości bo nie dałeś kodu
w jaki sposób wywołujesz fun Save( w programie , chodzi o to
na co jest ustawiony wskaźnik przekazywany do fun.

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