Mein Programm hängt



  • Hi Leute,

    Ich habe einen einfache Stack Klasse programmiert, aber irgendwie hängt mein Programm und es passiert einfach nichts. Kann mir Jemand sagen, was ich falsch mache? 😕

    #include <iostream>
    using namespace std;
    
    template <class T>
    class Stack {
    	T *arr;
    	int ptr;
    	int size;
    public:
    	class Stack_voll{};
    	class Stack_leer{};
    
    	Stack(int n) : ptr(0), size(n), arr(new T[size]) {}
    	~Stack() { delete[] arr; }
    
    	void push(const T& e) {
    		if(ptr >= size)
    			throw Stack_voll();
    		arr[ptr++] = e;
    	}
    
    	T& pop() {
    		if(ptr == 0)
    			throw Stack_leer();
    		ptr--;
    		return arr[ptr];
    	}
    };
    
    int main(int argc, char* argv[])
    {
    	Stack<int> st(10);
    
    	int i = 1;
    	while(true) {
    		try {
    			st.push(i++);
    		} catch( Stack<int>::Stack_voll ) {
    			break;
    		}
    	}
    
    	while(true) {
    		try {
    			i = st.pop();
    		} catch( Stack<int>::Stack_leer ) {
    			break;
    		}
    		cout << i << endl;
    	}
    	return 0;
    }
    


  • Vielleicht kannst du kein break in try-catch verwenden ... Wenn du while weglasst, wird dann eine Exception geworfen?


  • Administrator

    Der Code funktioniert bei mir einwandfrei.

    Kannst du die Fehlerbeschreibung ein wenig verbessern? Was heisst, dass das Programm hängt?
    Es hat nichts mit dem hier zu tun?
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-111042.html

    Was ist dein Kompiler? Was verwendest du für eine Standardbibliothek? Schon mal mit dem Debugger durchgelaufen?

    Grüssli



  • knivil schrieb:

    Vielleicht kannst du kein break in try-catch verwenden ... Wenn du while weglasst, wird dann eine Exception geworfen?

    Hm dann ist es immer noch genau das gleiche...

    Dravere schrieb:

    Der Code funktioniert bei mir einwandfrei.

    Kannst du die Fehlerbeschreibung ein wenig verbessern? Was heisst, dass das Programm hängt?
    Es hat nichts mit dem hier zu tun?
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-111042.html

    Was ist dein Kompiler? Was verwendest du für eine Standardbibliothek? Schon mal mit dem Debugger durchgelaufen?

    Grüssli

    Naja in der Konsole wird nichts ausgegeben und es passiert gar nichts...wie als ob man eine Endlos Schleife programmiert...

    Mein Kompiler ist Visual Studio 2008 Express Edition, aber was für eine Standardbibliothek ich verwende weiss ich leider nicht. Mit dem Debugger kenne ich mich leider auch nicht aus, sorry ich bin noch ein Anfänger..



  • Sicher Dravere?

    Wir hatten das Thema erst vor kurzem, warum es nicht gehen sollte ^^

    T *arr; 
        int ptr; 
        int size;
    
    Stack(int n) : ptr(0), size(n), arr(new T[size]) {}
    

    so sollte es gehen:

    int ptr; 
        int size; 
        T *arr;
    

    zumindest bei mir ^^
    msvc sollte(könnte) sagen "invalid allocation size" oder so was in der richtung ^^

    bb


  • Administrator

    unskilled schrieb:

    Sicher Dravere?

    Kompiliert mit VS2008 Team Suite Release Build, hat einwandfrei geklappt. 😉
    War zu faul, den ganzen Code genauer anzuschauen.

    unskilled schrieb:

    ... so sollte es gehen ...

    Oder noch einfacher:
    Stack(int n) : ptr(0), size(n), arr(new T[n]) {}

    Aber ob das wirklich das Problem ist? Naja, Gabbit wird es uns sagen 😉

    Grüssli



  • Hi,

    in der Tat nun funktioniert es auf einmal!! aber wieso muss ich die Reihenfolge der Classmember ändern, was macht das für einen Unterschied? puh davon steht auch nichts in meinem C++ Buch...


  • Administrator

    Gabbit schrieb:

    in der Tat nun funktioniert es auf einmal!! aber wieso muss ich die Reihenfolge der Classmember ändern, was macht das für einen Unterschied? puh davon steht auch nichts in meinem C++ Buch...

    Weil die Reihenfolge der Initialisierung der Reihenfolge der Deklaration im gleichen Sichtbarkeitsblock ( public , protected , private ) entspricht. Somit hast du size verwendet, bevor es überhaupt initialisiert war und dadurch ist undefiniertes Verhalten entstanden.

    Grüssli



  • hm Ok danke,

    oh man gibts noch mehr solcher tückischen falltüren auf die man achten muss? ich hab eine halbe stunde lang geschaut ob in meinen while schleifen der fehler liegt, dabei hatte das gar nix damit zu tun..aber wieso warnt der Kompiler mich denn da nicht?


Anmelden zum Antworten