Mam problem, ponieważ gdy używałem klasy vector w programach konsolowych to wszystko jest ok, ale w programach okienkowych często wywalają dziwne błędy związane z pamięcią albo funkcja wykonuje się tylko do pewnego momentu i nie zwraca tego co trzeba. Oto moja klasa Menu działająca bez zarzutów (tak mi się przynajmniej wydaje po licznych testach) w konsoli.
plik menu.h
#include <iostream>
using namespace std;
class Menu
{
public:
vector <string> wszystkie; // wszystkie opcje w menu (wszystkie główne oraz ich podopcje)
vector <string> glowne; // główne opcje w menu (można je wyświetlić, wybrać)
Menu(int,int,string*,string*);
Menu(int=0,int=1);
~Menu();
void wybierz(int wb); // czyta wybór użytkownika
void cofnij(); // powrót
private:
int w,g;
vector < vector <string> > poziomow;
vector <string> tematy;
};
plik menu.cpp
#include <iostream>
#include <cstdlib>
#include <string>
#include <vector>
#include "menu.h"
#include "text.h"
using namespace std;
Menu::Menu(int o, int t, string *op, string *tem)
{
for(int i=0; i<o; i++)
{
if(i!=0)
wszystkie.push_back(op[i]);
if( (int)op[i][0] != 9 && i!=0)
glowne.push_back(op[i]);
}
for(int i=0; i<t; i++)
tematy.push_back(tem[i]);
poziomow.push_back(wszystkie);
poziomow.push_back(glowne);
}
Menu::Menu(int ww, int gg)
{
w=ww;
g=gg;
}
Menu::~Menu()
{
}
void Menu::wybierz(int wb)
{
if(wb!=122)
{
wszystkie.clear();
glowne.clear();
int temat=0;
for(int i=0; i<poziomow[w].size(); i++)
{
if( (int)poziomow[w][i][0]!=9 )
temat++;
if(temat == wb)
{
i++;
if(i==poziomow[w].size())
break;
while( (int)poziomow[w][i][0]==9 )
{
string dodaj = poziomow[w][i];
if( is_int_convert(dodaj.erase(0,1)) )
wszystkie.push_back( tematy[ atoi(dodaj.c_str())-1 ] );
else
wszystkie.push_back(dodaj);
if((int)poziomow[w][i][0]==9 && (int)poziomow[w][i][1]!=9)
{
if( is_int_convert(without(poziomow[w][i], ' ')) )
{
glowne.push_back( tematy[ atoi(without(poziomow[w][i], ' ').c_str())-1 ] );
}
else
{
string dodaj = poziomow[w][i];
glowne.push_back(dodaj.erase(0,1));
}
}
if(i==poziomow[w].size()-1)
{
i--;
break;
}
i++;
}
break;
}
}
poziomow.push_back(wszystkie);
poziomow.push_back(glowne);
w+=2;
g+=2;
}
}
void Menu::cofnij()
{
poziomow.erase(poziomow.begin()+w);
poziomow.erase(poziomow.begin()+w);
wszystkie.clear();
glowne.clear();
wszystkie = poziomow[poziomow.size()-2];
glowne = poziomow[poziomow.size()-1];
}
Gdy próbuję wywołać funkcję składową wybierz() lub cofnij() obojętnie, w którym miejscu w programie to albo wywala 0xC000005 albo 0xFFFFFF albo program się nie zawiesza, ale gdy kontrolnie wyprowadzam MessageBoxem zawartość zmiennej w to jest ona zawsze przypadkowa. Zrobiłem sobie kilka MessageBoxów żeby sprawdzić dokąd wszystko jest ok (z debuggera nie umiem korzystać i nie wiem co oznaczają treści błędów) i wychodzi na to, że błąd tkwi w linijce 46 w pliku menu.cpp bo to co przed pętlą normalnie się wyświetla, a to co wewnątrz pętli już nie. I nic dziwnego skoro w posiada jakąś przypadkową wartość nawet kilkaset tysięcy czasami, a nie ma elementu vectora o takim indeksie (swoją drogą ciekawe dlaczego w tym miejscu nie wywala). Gdy zrobiłem MessageBoxa wewnatrz konstruktora z dwoma intami to nie wyświetliło mi się nic, co sugeruje, że w momencie tworzenia obiektu akurat ten konstruktor nie jest w ogóle wywoływany i zmienne w i g nie są inicjowane.
Ktoś może rozjaśnić co nieco sytuację? Czy serio muszę zrezygnować z wektorów? Przecież to dar dla programistów, który powinno się wykorzystywać. Czy w innych bibliotekach jak np. Qt też nie da się ich ogarnąć czy to tylko programowanie w WinAPI jest tak chore? Pomocy.