Kompilieren mit QT geht schief



  • Hallo zusammen,

    Ich habe mir mit Dev++ ein Programm (Kosolenanwendung)geschrieben und auch kompiliert, dieses funktioniert tadellos, ist für seinen Zweck aber etwas gross(1,8MB);vermutlich, weil die Bibliotheken mit kompiliert werden.

    Ich wollte nun versuchen, dies in eine grafische Oberfläche zu packen und hab mir daher QT installiert. Um mich mit QT anzufreunden hab ich dann erst mal das Konsolenprogramm als Release neu kompiliert. Das funktionierte soweit auch ganz gut, es lief auch im QT Fenster. Danach habe ich QT geschlossen und das Programm erneut gestartet. Diesmal und bei jedem Folgeversuch stürzt das Prog leider ab (Bis zum ersten Durchlauf Z66 läufts, dann stürzt es ab). Ich bin den Quellcode gefühlte 100 mal durchgegangen und finde einfach keinen Fehler.
    Vielleicht kann mir ja die Community helfen.

    Vielen Dank

    Hauptprogramm:

    #include <iostream>
    #include <fstream>
    #include "ctuer.h"
    
    using namespace std;
    
    //Globale Variablen
    char acname[8];
    short nr;
    char nm[8];
    short ds;
    short sls;
    short dp;
    short sp;
    short st;
    
    int main()
    {
    	short anzahl=0;
    //Eingabe Aircraftname und Anlegen Datei
    	cout << "Bitte geben sie den AC-Namen (max. 7 Zeichen) ein: ";
    	cin >>acname;
    	ofstream file;
    	file.open (acname);
        // Eingabe Anzahl der Tueren und speichern in Datei
        cout <<"Wieviel Tueren sollen ueberwacht werden?";
    	cin >> anzahl;
    	file << anzahl << endl;
    	cout << endl;
    	file.close();
    
        // Speicher fuer ctuer-objekte anfordern
    	ctuer *tueren = new ctuer[anzahl];
    
    	for (short i = 0; i < anzahl; i++ )
    	{
            //Eingabe Tuerdaten
    		nr=i+1;
    		cout << "Wie ist Tuer " <<nr<<" benannt?";
    		cin>>nm;
            cout << "Tuerstatus (0/1?)";
    		cin >>ds;
    		cout << "slidestatus (0/1)?";
    		cin >> sls;
    		cout << "slide_Pressure (0/1)?";
    		cin >> sp;
    		cout << "door_Pressure(0/1)?";
    		cin >>dp;
    
    		//Zuweisung Eingabe in Objekte
    		tueren[i].set_acname(acname);
    		tueren[i].set_nummer(nr);
    		tueren[i].set_name(nm);
    		tueren[i].set_door_stat(ds);
    		tueren[i].set_slide_stat(sls);
    		tueren[i].set_door_press(dp);
    		tueren[i].set_slide_press(sp);
    		cout << endl;
    		cout << endl;
    	}
    
    	for (short i=0; i < anzahl; i++)
    	{
    		//Kontrollausgabe Objektelemente
    		tueren[i].info();
    		//Schreiben der Datei
    		tueren[i].safe();
    		cout << endl;
    	}
    }
    

    zugehörige Klasse:

    #include "ctuer.h"
    #include <windows.h>
    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    ctuer::ctuer() // Konstruktor "ctuer"
    {
    	nummer=0;
    	name[0]=0;
    	door_stat=0;
    	slide_stat=0;
    	door_press=0;
    	slide_press=0;
    	stat=0;
    }
    
    void ctuer::set_nummer(short nummer_neu)
    {
    	nummer = nummer_neu;
    }
    
    void ctuer::set_name(char* name_neu)
    {
    	for (short j=0; j<8; j++)
    	{
    		name[j] = name_neu[j];
    	}
    }
    
    void ctuer::set_door_stat(short door_stat_neu)
    {
    	door_stat = door_stat_neu;
    }
    
    void ctuer::set_slide_stat(short slide_stat_neu)
    {
    	slide_stat = slide_stat_neu;
    }
    
    void ctuer::set_door_press(short door_press_neu)
    {
    	door_press = door_press_neu;
    }
    
    void ctuer::set_slide_press(short slide_press_neu)
    {
    	slide_press = slide_press_neu;
    }
    
    void ctuer::set_status(short status_neu)
    {
    	stat = status_neu;
    }
    
    void ctuer::set_acname(char* acname_neu)
    {
    	for (short j=0; j<8; j++)
    	{
    		acname[j] = acname_neu[j];
    	}
    }
    
    void ctuer::info()
    {
    	cout << "Nummer: "<< nummer << endl;
    	cout << "Name: " << name << endl;
    	cout << "Door_Stat: " << door_stat << endl;
    	cout << "Slide_stat: " << slide_stat << endl;
    	cout << "door_press: " << door_press << endl;
    	cout << "slide_press: " << slide_press << endl;
    	cout << "Gesamtstatus: " << stat << endl;
    }
    
    void ctuer::safe()
    {
    
        ofstream filesv;
        filesv.open (acname, ios::out|ios::app);
        filesv << nummer << endl;
        filesv << name << endl;
        filesv << door_stat << endl;
        filesv << slide_stat << endl;
        filesv << door_press << endl;
        filesv << slide_press << endl;
        // filesv << stat << endl;
    }
    


  • a) Das Ganze hat akutell noch nichts mit QT zu tun.

    b) Gibt es zu dem Absturtz auch eine Fehlermeldung?



  • Es kommt nur die Windowsmeldung "newAC" funktioniert nicht mehr und wird geschlossen.

    Ich hab das hier reingestellt, da es ja nur die Kompilierung mit QT betrifft.



  • Welcher Compiler? Ausgeführt mit Debugger?

    // Speicher fuer ctuer-objekte anfordern
    ctuer *tueren = new ctuer[anzahl];
    

    Das würde ich mal durch einen std::vector austauschen.



  • Meinst du den Qt Creator als IDE? Unter nur "Qt" wird eigentlich das Qt Framework verstanden.



  • @ Axels. Compiler ist MinGW 5.3 32bit, mit Debugger ausgeführt

    zum Thema vector spannen sich bei mir gerade ???? auf, meine Erfahrung mit c++ ist im Moment noch sehr begrenzt.

    @ th69 ja ich meine QT Creator als IDE



  • MathiasS schrieb:

    meine Erfahrung mit c++ ist im Moment noch sehr begrenzt.

    Dann empfehle ich dir, lass erstmal noch die Finger von QT und lerne erstmal vernünftig C++, dann fällt auch der einstieg in QT leichter.



  • @Axels.
    Danke für die Empfehlung.
    Ich würde dieser auch gerne nachkommen aber leider gehört das dargestellte Problem zu einer Projektarbeit im Rahmen meines MaschBau-Studiums(das ich nebenbei betreibe) welche darauf hinausläuft, dass wir unsere Softwarelösung in ein schon bestehendes QT-Projekt einbinden müssen.
    Demzufolge bin ich gezwungen meine begrenzten C++ Kenntnisse und die QT IDE schon jetzt zusammenzuführen.
    Meine Hoffnung bestand darin, das einfach nur jemand aus der Community den Quellcode sieht und mir einen Tipp geben kann warum das Programm statt die Datei zu schreiben abstürzt.



  • Habe den Code mal getestet und angepasst.

    1. Verwende in C++ immer std::string statt char*;

    2. Verwende

    std::vector<ctuer>tueren(anzahl);
    

    statt

    ctuer *tueren = new ctuer[anzahl];
    


  • An dem Quellcode sehe ich ersteinmal keinen Fehler (bis auf die von "axels" erwähnten Verbesserungen) - es fehlt aber die Deklaration von der Klasse ctuer zur genauen Analyse.
    Verwende, wie schon erwähnt, am besten den Debugger.


Log in to reply