Fehler beim Ausführen von Vector::Size()
-
Hi,
ich habe eine Klasse geschrieben zur Verwaltung von DOS-Fenstern. Leider stürzt sie ab, beim Vector::size().Beim Debuggen gibt er mir in der Funktion WWindows::draw_windows() bei dem Vektor list_fenster.size(), einmal 1 und im nächsten schleifendurchlauf eine Zahl die irgend wo bei maxinteger liegt. Kurz danach bei list_fenster[z].need_draw gibts die Exeption:(
Ich vermute:
In der Funktion DrawWindow(), die fürs Zeichen der Fenster zuständig ist, wird
der Vector visibleWindow einer Interger Variable zugewiesen (int z=visibleWindow[i];). Da der Vektor ne Referenz zurück gibt und der int am Ende der Funktion gelöscht wird, bekommt der Vektor eine inkonsistenz.1. Wie kann man das Problem lösen?
*z=... geht ja nicht, da kein L-Value und z=*(visibleWindow[i]) geht auch nicht
2. Danke schon mal im vorraus;)
3. Quelltext poste ich gleich im Anschluss.bool WWindows::draw_windows() { for (unsigned int i=0;i<visibleWindow.size();i++) // beim ersten mal 1 dann 6tausendirgendwas { int z=visibleWindow[i]; if (list_fenster[z].need_draw) // <-- hier tritt der Fehler auf { list_fenster[z].need_draw=false; windows(list_fenster[z].PosX, list_fenster[z].PosY, list_fenster[z].SizeX, list_fenster[z].SizeY, list_fenster[z].Titel.c_str()); } } return true; }
-
Header WWindows.h
#ifndef WWindowsH #define WWindowsH #include <string> #include <vector> using namespace std; class WWindows { private: vector<int> visibleWindow; struct fensterstruct { int PosX,PosY; int SizeX,SizeY; string Titel; bool need_draw; //vector< vector<char> > Inhalt; // der Text der in dem Fenster steht //vector< vector<int> > InhaltsFarbe; }; vector<fensterstruct> list_fenster; bool draw_windows(); bool window_overlap(int handle1,int handle2); public: int set_window(int left, int top, int right, int bottom, const string wTitel=""); //absulute coordinaten bool show_window(int handle); // setzt das handle in den visibleWindow bool hide_window(int handle); int such_handle(string Titel); bool window_to_top(int handle); // setz das handle ans ende von visibleWindow bool window_text(int handle,string text,int pos=0); // vector<vector<char>> bool window_text(int handle,vector< vector<char> >); // vector<vector<char>> bool clear_window(int handle); bool delete_window(int handle); }; extern WWindows Fenster; #endif
-
CPP WWindows.cpp
[cpp]
#include "WWindows.h"#include "toolbox.h"
WWindows Fenster;
bool WWindows::draw_windows()
{
for (unsigned int i=0;i<**visibleWindow.size();**i++) // beim ersten mal 1 dann 6tausendirgendwas
{
int z=visibleWindow[i];
if (list_fenster[z].need_draw) // <-- hier tritt der Fehler auf
{
list_fenster[z].need_draw=false;
windows(list_fenster[z].PosX,
list_fenster[z].PosY,
list_fenster[z].SizeX,
list_fenster[z].SizeY,
list_fenster[z].Titel.c_str());
}
}
return true;
}bool WWindows::window_overlap(int handle1,int handle2)
{
if (handle1==handle2)
return true;
return true;
}int WWindows::set_window(int left, int top, int right, int bottom, const string wTitel)
{
fensterstruct temp_fenster;
temp_fenster.PosX=left;
temp_fenster.PosY=top;
temp_fenster.SizeX=right;
temp_fenster.SizeY=bottom;
temp_fenster.Titel=wTitel;
temp_fenster.need_draw=false;
list_fenster.push_back(temp_fenster);
return list_fenster.size()-1;
}bool WWindows::show_window(int handle)
{
if (handle<0 || handle>=(signed)list_fenster.size())
return false;
hide_window(handle);
visibleWindow.push_back(handle);
for (int i=0;i<(signed)list_fenster.size();i++)
if (window_overlap(i,handle))
list_fenster[i].need_draw=true;
return draw_windows();
}bool WWindows::hide_window(int handle)
{
if (handle<0 || handle>=(signed)list_fenster.size())
return false;
for (int i=0;i<(signed)visibleWindow.size();i++)
if (visibleWindow[i]==handle)
{
vector<int>::iterator at=visibleWindow.begin()+i;
visibleWindow.erase(at);
for (int j=0;j<(signed)list_fenster.size();j++)
if (window_overlap(j,i))
list_fenster[j].need_draw=true;
return draw_windows();
}
return false;
}int WWindows::such_handle(string Titel)
{
for (int i=0;i<(signed)list_fenster.size();i++)
if (list_fenster[i].Titel==Titel)
return i;
return -1;
}bool WWindows::window_to_top(int handle)
{
return false;
}bool WWindows::window_text(int handle,string text,int pos)
{
return false;
}bool WWindows::window_text(int handle,vector< vector<char> >)
{
return false;
}bool WWindows::clear_window(int handle)
{
return false;
}bool WWindows::delete_window(int handle)
{
return false;
}
[/cpp]
-
Main.cpp
#include "WWindows.h" #include <conio.h> int main(int argc, char* argv[]) { int f1=Fenster.set_window(10,10,20,20,"Fenster1"); int f2=Fenster.set_window(15,10,55,15,"Fenster2"); Fenster.show_window(f1); /* getch(); Fenster.show_window(f2); getch(); Fenster.hide_window(Fenster.such_handle("Fenster1")); */ getch(); return 0; }
-
Hi,
nach langem "Umstellen" hab ichs jetzt hin bekommen.Ich habe alle Array-Zugriffe auf den Vector durch Itteratoren ersetzt.
Der Builder meckert zwar immer noch über alle möglichen Sachen, aber ich bekomme es kompiliert und es läuft
Wenn sich jemand dafür interessieren sollte, kann ich den Code nochmal posten.
Man kann jetzt Fenster erstellen/anzeigen/verstecken und text in die Statusleiste einfügen.
Das größte Problem war heraus zu finden welche Fenster aktualisiert werden muss und welches nicht, da cprintf sehr langsam ist (und cout keine farbe kann
)
P.S: Und entschuldigt, das ich mal wieder so viel Müll gepostet hab (vorallem viel). Hätte mir klar sein müssen, das ich wiedermal keine Antwort bekomme. Ich glaub ich lerns nie. Warscheinlich weil ich immer nur Poste, wenn ich absolut kein Ausweg mehr sehe und da kann dann ja nur Müll raus kommen. Ich hoffe ihr könnt mir verzeihen.