Unbehandelte Ausnahme & Zugriffsverletzung c++ / QT



  • Hallo , Das Programm soll aus 2 Textfeldern die Inhalte nehmen und in eine Tabelle packen, die wenn alle Reihen voll sind, eine neue Anlegt wo dann das neue rein kommt. alle sollen drin stehen bleiben.
    Zudem stehe ich glaube ich auf dem schlauch wie ich dieses prinzip hinbekomme, eine Idee habe ich , wie man im Code hoffendlich sieht, aber Ich bekomme es nicht wirklich hin, Villeicht habt ihr auch dafür Tipps für mich ?

    Nun hab ich den Fehler wenn ich es ausführen will :
    Eine Ausnahme (erste Chance) bei 0x64c0f980 in Tester.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.
    Unbehandelte Ausnahme bei 0x64c0f980 in Tester.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.
    Das Programm "[5148] Tester.exe: Systemeigen" wurde mit Code -1073741510 (0xc000013a) beendet.

    Was soll ich machen ? ich denke es liegt an dieser Stelle :

    void Tabelle::pushButtonClicked()
    {	
    	int rowcount = 1;
    
    	rowcount = table->rowCount();
    	row = 1 ;
    
    	if (  row > rowcount )
    	{
    		table->insertRow( table->rowCount() );
    		row++;
    	}	
    }
    

    Hier meine Header :

    #ifndef _TABELLE_H_
    #define _TABELLE_H_
    
    class Tabelle : public QWidget
    {
    	Q_OBJECT	
    
    public:
    	Tabelle(void);
    	void init();
    	QString strname ;
    	QString strvalue;
    	QWidget *window;
    	QTableWidget* table;
    	int row;
    	QWidget* mywidget;
    
    public slots:
    
        void pushButtonClicked();
    };
    #endif
    

    Hier meine Main ( ohne includes ) :

    #include "Tabelle.h"
    
     int main (int argc, char* argv[])
    {
    	 QApplication myapp(argc,argv);
    	Tabelle tabelle;
    	 tabelle.init();
    return myapp.exec();
    
    }
    

    Hier meine Tabelle.cpp

    #include "Tabelle.h"
    
    Tabelle::Tabelle()
    {
    	//empty
    }
    
     void Tabelle::init()
    {
    	 QWidget* mywidget = new QWidget();
    	// instantiierung einesQQ-pllication objects, das ist immer nötig.
    
    	QTableWidget* table = new QTableWidget();
    	 QLabel* lblname = new QLabel ("Name: ", mywidget );
    	 QLineEdit *txtname = new QLineEdit();
    	 QLabel* lblvalue = new QLabel("Value",mywidget);
    	 QLineEdit *txtvalue = new QLineEdit();
    	 QPushButton* btnaddtotable = new QPushButton( "Add to Table", mywidget);
    	 QVBoxLayout *layout = new QVBoxLayout (mywidget);
    
    	 QString strname ;
    	strname = ( txtname ->text ());
    
    	QString strvalue ;
    	strvalue = ( txtvalue ->text ());
    
    	 table->setRowCount( 10 );
    	 table->setColumnCount( 2 );
    
    	  table->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
    	// Labels setzen
       QStringList hLabels, vLabels;
       hLabels << "Name" << "Value" ;
       table->verticalHeader()->setVisible( false );
       table->setHorizontalHeaderLabels( hLabels );
       lblname->setGeometry (40 , 50 , 250 , 60);
    	lblname->setFont(QFont("Times", 10, QFont::Bold));
    	lblvalue->setGeometry (40 , 50 , 250 , 60);
    	lblvalue->setFont(QFont("Times", 10, QFont::Bold));
    	btnaddtotable->setGeometry(50,20,400,40);
    	 mywidget->setGeometry(800,400,800,650);
    
    	layout->addWidget(lblname);
    	layout->addWidget(txtname);
    	layout->addWidget(lblvalue);
    	layout->addWidget(txtvalue);
    	layout->addWidget(btnaddtotable);
    	layout->addWidget(table);
    	QTableWidgetItem * item = new QTableWidgetItem(0);
    	item->setText(strname);
    	QTableWidgetItem * item2 = new QTableWidgetItem(0);
    	item->setText(strvalue);
    
    	table->setItem( row , 1 , item);
    	table->setItem( row  , 2 , item2);
    	QObject::connect ( btnaddtotable, SIGNAL ( clicked() ), this , SLOT(pushButtonClicked())) ;
    
    	mywidget->show();
    
    	txtname->show();
    	txtvalue->show();
    }
    
    void Tabelle::pushButtonClicked()
    {	
    	int rowcount = 1;
    	rowcount = table->rowCount();
    	row = 1 ;
    
    	if (  row > rowcount )
    	{
    		table->insertRow( table->rowCount() );
    		row++;
    	}	
    }
    


  • Da musst Du wohl nochmal in Dein Grundlagenbuch schauen.

    Wo glaubst Du denn Deine Member zu initialisieren?
    Und wenn ich Dir sage nirgendwo. Was erwiderst Du dann? Und warum habe ich doch recht? 🙂



  • Furble Wurble schrieb:

    Da musst Du wohl nochmal in Dein Grundlagenbuch schauen.

    Wo glaubst Du denn Deine Member zu initialisieren?
    Und wenn ich Dir sage nirgendwo. Was erwiderst Du dann? Und warum habe ich doch recht? 🙂

    Ich glaube ich stehe nun sehr auf dem Schlauch, welcher fehlt denn ?
    Das mache ich doch in der init,nicht ?



  • Nein, tust du nicht. Du definierst in der init nur lauter lokale Variablen.



  • Pinguinchen schrieb:

    Ich glaube ich stehe nun sehr auf dem Schlauch, welcher fehlt denn ?
    Das mache ich doch in der init,nicht ?

    Ja, scheinbar standst Du auf dem Schlauch.

    Spätestens nachdem ich so sicher war, hätte ich an Deiner Stelle mal einen Test gemacht.
    Z.b.

    #include <cassert>
    
    struct gadget{
      gadget() {};
      void init() { int i=42; }
      int i;
    };
    
    void check(const gadget& g){
      assert(g.i==42);
    }
    
    int main(){
      gadget g;
      g.init();
      check(g);
    }
    

    Ist jetzt klar, was schiefläuft?
    Braunstein hat's ja auch schon in aller Deutlichkeit angesprochen.

    Die ganzen Zeiger als Member sind auch nicht "State-of-the-art". Warum eigentlich Zeiger?



  • Braunstein schrieb:

    Nein, tust du nicht. Du definierst in der init nur lauter lokale Variablen.

    also so ?

    Tabelle::Tabelle()
    {
    	 QString strname = "strname";
    	 QString strvalue = "strvalue";
    	 int rowcount = 1;
    	 int row = 1;
    	 QLineEdit *txtname = new QLineEdit();
    	  QLineEdit *txtvalue = new QLineEdit();
    	//empty
    }
    

    Ich weiß nicht, ich weiß das man in Java einfach int werde , Strings etc indem man private oder public vor schreibt, für die ganze klasse nicht nur lokal sichtbar macht. Aber wie ist das bei c++ denn ? Es tut mir leid, mein Abteilungsleiter setzt mich imoment sehr unter Druck damit ohne mir zu helfen wesshalb ich einfach nicht die Zeit habe mir sämtliches vorher an zu eignen.
    Ich dachte wenn ich die Im header unter Public setze , dann sind die auch projektmappen frei verfügbar. und wieso verweigert er den Zugriff bei rowcount = table->rowCount(); ? 😮



  • wenn du es so machst, wird ein lokal gültiges Objekt namens strname QString angelegt und mit "strname" initialisiert.

    Dieses Objekt strname wird am Ende des scopes (also an der schließenden geschweiften Klammer) wieder zerstört, indem automatisch dessen Destruktor aufgerufen wird.

    wenn du willst, daß die Zuweisung strname = "strname" auf das member der class Tabelle wirkt, mußt du das "QString" weglassen:

    Tabelle::Tabelle()
    {
         strname = "strname";
         strvalue = "strvalue";
         rowcount = 1;
         row = 1;
         QLineEdit *txtname = new QLineEdit();
         QLineEdit *txtvalue = new QLineEdit();
    }
    


  • großbuchstaben schrieb:

    wenn du es so machst, wird ein lokal gültiges Objekt namens strname QString angelegt und mit "strname" initialisiert.

    Dieses Objekt strname wird am Ende des scopes (also an der schließenden geschweiften Klammer) wieder zerstört, indem automatisch dessen Destruktor aufgerufen wird.

    wenn du willst, daß die Zuweisung strname = "strname" auf das member der class Tabelle wirkt, mußt du das "QString" weglassen:

    Tabelle::Tabelle()
    {
         strname = "strname";
         strvalue = "strvalue";
         rowcount = 1;
         row = 1;
         QLineEdit *txtname = new QLineEdit();
         QLineEdit *txtvalue = new QLineEdit();
    }
    

    Achsoooo danke, das hatte ich aber auch nirgens im Internet gelesen 😞 Vielen dank



  • Pinguinchen schrieb:

    Achsoooo danke, das hatte ich aber auch nirgens im Internet gelesen 😞 Vielen dank

    Das gehört ja auch zu den C++ Grundlagen. Es wäre besser ein gutes Buch dazu anzuschaffen.



  • Braunstein schrieb:

    Pinguinchen schrieb:

    Achsoooo danke, das hatte ich aber auch nirgens im Internet gelesen 😞 Vielen dank

    Das gehört ja auch zu den C++ Grundlagen. Es wäre besser ein gutes Buch dazu anzuschaffen.

    Okey.. Aber nun funktioniert es soweit, dankeschön 🙂



  • Pinguinchen schrieb:

    Okey.. Aber nun funktioniert es soweit, dankeschön 🙂

    Kein "Aber". Programmieren ohne die grundlegenden Regeln der Programmiersprache zu kennen - z.B. die Gültigkeitsbereiche von Variablen - ist wie mit 250km/h bei Nacht ohne Licht durch die Gegend zu fahren 😮

    Um den gleichen Fehler in 5 Minuten an anderer Stelle nicht nochmal zu machen, musst Du verstanden haben was Du falsch gemacht hast.


Anmelden zum Antworten