WinApi vector struktur (crashuje)

Odpowiedz Nowy wątek
2012-10-28 06:56

Rejestracja: 8 lat temu

Ostatnio: 1 miesiąc temu

0

Witam. Tworzę własną kontrolkę w WinApi i stanąłem na liście. Otóż korzystam w niej z wektorów struktur. Problem polega na tym, że przy dodaniu struktury program się wysypuje. Fragment kodu wygląda mniej - więcej tak:

//deklaracja struktur


struct WHLIST_ELEMENT{
    char* tekst;
    char* komentarz;
    int id_ikonki;

    bool aktywny;
    bool zaznaczony;
};
struct WHLIST_PRZYCISK{
    struct WHLIST_ELEMENT *wsk;
    HWND uchwyt;
};
struct WHLIST{
    HWND ScrollBar;
    HBITMAP bitmapa;
    HDC hDC, hDCbmp, hDCobrazki;
    HBITMAP obrazki;

    INT cX, cY;
    vector<WHLIST_ELEMENT> Element;
    vector<WHLIST_PRZYCISK> Przycisk;
}WHLIST;

//fragment kodu odpowiadający dodawaniu kontrolek


int ilosc_przyciskow = Y / 22;
for(int n=0; n<ilosc_przyciskow; n++)
{
      struct WHLIST_PRZYCISK przyklad;
      przyklad.uchwyt = CreateWindowEx( 0, "wh_CHECKBOX", NULL, WS_CHILD | WS_VISIBLE | WH_AUTOMAT, 22, n*22, X - 22, 22, hwnd,( HMENU ) 1, GetModuleHandle(NULL), NULL );
      przyklad.wsk = NULL;
      SendMessage(przyklad.uchwyt, WH_SETFOCUS, WH_PRZELACZ, 0);

      wsk->Przycisk.push_back(przyklad); // wysypuje sie ;(
}

wskaźnik wsk z pewnością nie jest NULL, gdyż sprawdzam to już na samym początku. Próbowałem różnych cudactw i dalej wywala. Czytałem, że przyczyną może być zbyt częste wywoływanie push_back() w tym samym czasie. W załączniku dodaję plik main.cpp oraz plik wh_grafika.h. Może uda wam się zauważyć coś, czego ja nie widzę.

edytowany 1x, ostatnio: gswidwa, 2012-10-28 06:57

Pozostało 580 znaków

2012-10-28 09:27

Rejestracja: 14 lat temu

Ostatnio: 10 godzin temu

2
struct WHLIST *wsk = (struct WHLIST *)malloc(sizeof(struct WHLIST));

Jak piszesz w C++, to używaj C++'owych metod (de)alokacji pamięci, szczególnie że używasz klas (w tym przypadku vector, który nie jest poprawnie konstruowany, ponieważ malloc lub inny alokator z C nie wywoła konstruktora). Użyj new i delete.

p.s. opakuj to wszystko w klasy.

edytowany 2x, ostatnio: _0x666_, 2012-10-28 09:31
Jak wróce do domu sprawdze :) dzięki - gswidwa 2012-10-28 09:36

Pozostało 580 znaków

2012-10-29 09:59

Rejestracja: 12 lat temu

Ostatnio: 2 godziny temu

0

Jedyny powód, dla którego to się wysypuje w tym miejscu to uszkodzona sterta.
Ten fragment kodu wygląda poprawnie te vector<WHLIST_PRZYCISK>.push_back nie rożni się specjalnie od vector<int>.push_back.
W innym miejscu programu musiałeś przekroczyć zakres tablicy albo użyć nieważnego wskaźnika lub coś w podobny deseń, co doprowadziło do niespójności sterty.
W momencie odpowiedniej operacji na stercie, niespójność sterty jest wykrywana i program zgłasza poważny błąd.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

Rev
2012-10-29 11:56
Rev
Moderator

Rejestracja: 12 lat temu

Ostatnio: 3 dni temu

0

Od którego geniusza 0x666 dostał minusa?

Ewidentnie widać, że problem polega na tym, że autor próbuje wykonać niestatyczną metodę na nieistniejącym (niepoprawnie zainicjowanym) obiekcie.


Pozostało 580 znaków

2012-10-29 13:17

Rejestracja: 8 lat temu

Ostatnio: 1 miesiąc temu

0

zrobiłem sobie plik z rozszerzeniem .h, w którym umieściłem funckje listy dwuukierunkowej. Chcę je wykorzystać zamiast kontenera. Pokażę mniej więcej na czym polega problem:


//main.cpp
#include <windows.h>
#include "wh_grafika.h"
#include "wh_lista.h"

//wh_grafika.h
#include <windows.h>
#include "wh_lista.h"

Oba te pliki korzystają z listy, przy czym main.cpp dodatkowo używa pliku wh_grafika.h. Powstają mi błędy (o ile się nie mylę), że zaincludowałem już wh_lista.h.

Pozostało 580 znaków

Rev
2012-10-29 13:22
Rev
Moderator

Rejestracja: 12 lat temu

Ostatnio: 3 dni temu

Używaj include guards.


ale fajne xd zawsze nie wiedziałem do czego to służy :D Dziękuję :) - gswidwa 2012-10-29 13:24

Pozostało 580 znaków

Odpowiedz

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