[GTKmm] Programm läuft unter linux aber nicht unter windows.
-
Ich habe ein kleines Gtkmm Programm unter Archlinux geschrieben und getested und es ging (Nur die logik ist noch nicht implementiert
). Also dachte ich schauen wir mal wie die Gui unter Windows aussieht. Mit Autotools (dank dem Artikel im Magazin) war es kein grösseres problem alles mit cygwinund den bei dev-cpp mitgelieferten mingw zu kompilieren (ok schon aber tut nichts zu sache..). Ich musste nurLDFLAGS="-mwindow" ./configure && make clean install distcleanmachen. (Hab das beim versuch ein kleines Hello-World-Programmes zu kompilieren herausgefunden, damit sich keine Konsole öffnet )
Aber als ich das starten wollte kam da "*** hat ein Problem festgestellt und muss beendet werden....". Ich hab schon geschaut, habe aber keine Ahnung, wieso es nicht geht.
An Gtkmm kann es ja nicht liegen, da ein HW Programm ging.mainwnd.hpp
#ifndef MAINWND_HPP #define MAINWND_HPP #include <gtkmm.h> #include <vector> class mainwnd : public Gtk::Window { Gtk::Button** m_buttons; Gtk::AspectFrame m_gamebox; Gtk::VBox m_mainbox; Gtk::HBox m_controllbox; Gtk::Button m_exit, m_back; Gtk::Table m_table; Gtk::HSeparator m_sep; int m_size; std::vector<std::vector<int> > m_values; virtual void on_exit_clicked(); virtual void on_back_clicked(); virtual void on_field_clicked(std::pair<int,int>); public: void setvalue(int, int, int); int getvalue(const int, const int) const; mainwnd(std::string, int); ~mainwnd(); }; #endif#include "mainwnd.hpp" #include <iostream> #include <sstream> using namespace std; using namespace Gtk; /*inline*/ string itos(int i) { ostringstream os; os << i; cout << os.str() << endl; return os.str(); } mainwnd::mainwnd(string name, int size) :m_table(size, size, true), m_exit("Exit"), m_back("Zurueck"), m_gamebox("", 0.5, 0.0, 1.0, false), m_size(size) { set_default_size(40*size, 50*size+100); set_title(name); m_buttons=new Button *[size]; m_values.reserve(size); for(int i = 0; i < size; i++) { m_values[i].reserve(size); m_buttons[i] = new Button[size]; for(int j=0; j < size; j++) { m_values[i][j] = i*j; //m_buttons[i][j] = Button("0"); m_buttons[i][j].set_label(itos(i*j)); //m_buttons[i][j].show(); m_table.attach(m_buttons[i][j],i, i+1, j, j+1); m_buttons[i][j].signal_clicked() .connect(sigc::bind<pair<int,int> >( sigc::mem_fun(*this, &mainwnd::on_field_clicked), make_pair(i, j) ) ); } } m_exit.signal_clicked().connect( sigc::mem_fun(*this, &mainwnd::on_exit_clicked)); m_back.signal_clicked().connect( sigc::mem_fun(*this, &mainwnd::on_back_clicked)); m_mainbox.pack_start(m_gamebox); m_gamebox.add(m_table); m_mainbox.add(m_sep); m_mainbox.pack_start(m_controllbox); m_controllbox.pack_start(m_back); m_controllbox.pack_start(m_exit); add(m_mainbox); show_all_children(); } int mainwnd::getvalue(const int x, const int y) const { return m_values[x][y]; } void mainwnd::setvalue(int x, int y, int v) { m_values[x][y]=v; m_buttons[x][y].set_label(itos(v)); } mainwnd::~mainwnd() { for(int i =0; i < m_size; i++) delete [] m_buttons[i]; delete [] m_buttons ; } void mainwnd::on_exit_clicked() { hide(); } void mainwnd::on_back_clicked() { cout <<"back clicked" << endl; } void mainwnd::on_field_clicked(pair<int, int> p) { cout << p.first << " " << p.second << " " << getvalue(p.first, p.second)<< endl; }#include "mainwnd.hpp" int main(int argc, char *argv[]) { Gtk::Main kit(argc, argv); mainwnd window("Hello World", 5); Gtk::Main::run(window); return 0; }Ich vermute es liegt am Constructor. Aber bin mir nicht sicher.
Wenn ihr noch irgentwelche Ding findet die man schöner, besser oder einfach "cooler" machen kann, wäre es auch nett wenn ihr mir das sagt. Bin noch relativer C++ Anfänger.
Danke im Voraus
-
Ich habe mit std::cerr herausgefunden das es anstürtzt ,wenn der innere Loop beim zweiten Durchlauf der äusseren Schleife das erste mal läuft.
-
Ok ich habe herausgefunden, dass es an dem Zugriff auf den Vector in mainwnd.cc gelegen hat.
Ich werde jetzt auf einen "int **" umsteigen. Aber ich wüsste gerne, warum das mit dem Vector nicht ging.
Ich habe doch sogar reserve benutzt
-
Gtkmm beginner schrieb:
Ok ich habe herausgefunden, dass es an dem Zugriff auf den Vector in mainwnd.cc gelegen hat.
Ich werde jetzt auf einen "int **" umsteigen. Aber ich wüsste gerne, warum das mit dem Vector nicht ging.
Ich habe doch sogar reserve benutzt
Hm, reserve sagt dem vector eig. nur, dass es seine capcity ändern soll, weil demnächst neue Element hinzukommen/wegfallen. Es wird aber nicht size verändert, deshalb landest du mit einem direkten Zugriff per []-op in der grünen Wiese.
Mit resize sollte dein Vorhaben klappen.Das alles steht unter einem fetten IIRC

-
Stimmt. Ich hab das selbst verwechselt. Kam mir die ganze Zeit komisch vor.
Danke