Abiturprüfung Informatik: dynamisches Array erklären



  • du hast keine doppelten Zeiger.

    Klasse *obj;
    // der Zeiger "obj" zeigt jetzt irgendwohin, da er nicht initialisiert wurde.
    // besser wäre "Klasse *obj = NULL;"
    obj = new Klasse[zahl]; 
    // mit "new Klasse[zahl]" wird auf dem Heap Speicher für "zahl" Objekte vom Typ "Klasse" reserviert.
    // obj zeigt nach der Zuweisug auf das erste Element
    


  • Ahh - nu hab ichs verstanden... Sehr cool, dass schon so früh am Tag Leute bereit sind, zu helfen. Danke!



  • Warum schreibst du's nicht einfach in einem? Diese Extra-Zuweisungen finde ich bei Anfängern immer wieder, und ich finde sie weder leserlicher, noch irgendwie besser.

    T* ptr = new T[n];
    


  • 314159265358979 schrieb:

    Warum schreibst du's nicht einfach in einem? Diese Extra-Zuweisungen finde ich bei Anfängern immer wieder, und ich finde sie weder leserlicher, noch irgendwie besser.

    T* ptr = new T[n];
    

    Korrigiere mich bitte aber:
    Im Normalfall kann new eine Exception werfen. Um sich dagegen abzusichern
    müsste man try und catch verwenden und schon hätte man ein Sichtbarkeitsproblem sich eingehandelt.
    Deswegen trennt man die Deklaration und Speicherzugriff, denn sonst hat man

    try
    {
        T* ptr = new T[n];
        // hier wird der Pointer benutzt.
        // ...
    }
    catch()
    {
    }
    

    Und z.B. für mein Geschmack ist die die Trennung des Speicherzugriff und der Deklaration leserlicher.Insbesondere, wenn man die Initialisierung hinter einer Funktion "versteckt".

    template< typename T >
    bool __inline erstelle_array( T*& instance, size_t anzahl )
    {
            try
    	{
    		if ( anzahl != 0 )
    		{
    			instance = new T[ anzahl ];
    		}
    	}
    	catch( std::bad_alloc& )
    	{
    		instance = 0;
                    // Fehlermeldung ausgeben( ? )
    		return false;
    	}
    	return true;
    }
    
    T* ptr = 0;
    if ( erstelle_array( ptr, 100 ) )
    {
        // Variablenverwendung.
    }
    
    //oder z.B.
    
    T* ptr = 0;
    if ( !erstelle_array( ptr, 100 ) )
    {
        // Fehlermeldung.
        return;
    }
    

    Es ist halt Geschmacksfrage.



  • Travor schrieb:

    Ganz verwirrtes Zeug

    Man will doch gerade rausspringen, wenn eine Exception geworfen wird. Und wenn man das anders handeln möchte, nutzt man die nothrow Variante. Diese von dir gepostete Funktion ist nicht nur Quatsch, sondern nicht mal standardkonform.



  • Ob man herausspringen will oder nicht ist eine Entscheidung des Programmierers. Ist halt nicht immer sinnvoll.



  • Travor schrieb:

    Ob man herausspringen will oder nicht ist eine Entscheidung des Programmierers. Ist halt nicht immer sinnvoll.

    😕 Lies erstmal meinen Beitrag ordentlich.



  • Travor schrieb:

    Im Normalfall kann new eine Exception werfen.

    Richtig.

    Um sich dagegen abzusichern
    müsste man try und catch verwenden

    Bedingt richtig - man muss try/catch nicht unbedingt in der Funktion verwenden, in der man auch new aufruft. Meist kann man sowas schwerwiegendes wie Speichermangel nicht dort verwenden wo man new aufruft, sondern behandelt es irgendwo weiter oben.

    und schon hätte man ein Sichtbarkeitsproblem sich eingehandelt.

    Meistens falsch. Du willst nicht wie in C nur das new in einen try-Block packen, dann Fehler behandeln und nach dem catch mit dem Pointer weiterarbeiten, sondern du packst die gesamte Logik der Funktion in einen try-Block, also die Definition des Pointers, new-Aufruf und die Benutzung des Pointers. Das ist doch einer der großen Vorteile von Exceptions - dass man erst die komplette Logik schreiben kann, gefolgt von der kompletten Fehlerbehandlung, statt immer abwechselnd eine Zeile Logik, fünf Zeilen Fehlerbehandlung.



  • cooky451 schrieb:

    Travor schrieb:

    Ob man herausspringen will oder nicht ist eine Entscheidung des Programmierers. Ist halt nicht immer sinnvoll.

    😕 Lies erstmal meinen Beitrag ordentlich.

    Sorry ich habe das mal wieder falsch gelesen. 😞 .

    pumuckl schrieb:

    .. Meist kann man sowas schwerwiegendes wie Speichermangel nicht dort verwenden wo man new aufruft, sondern behandelt es irgendwo weiter oben.
    Meistens falsch. Du willst nicht wie in C nur das new in einen try-Block packen, dann Fehler behandeln und nach dem catch mit dem Pointer weiterarbeiten, sondern du packst die gesamte Logik der Funktion in einen try-Block, also die Definition des Pointers, new-Aufruf und die Benutzung des Pointers.

    Ja stimmt auch alles. Allerdings erlaubt mir meine Konstruktion das ganze in eine while-Schleife zu packen und einfach abzuwarten bis für bestimmte ( in dem Fall sekundäre ) Aufgaben mal wieder Ressourcen da sind. Mir ist keine andere Lösung eingefallen, um so etwas zu erledigen. Und wenn ich sowieso so etwas drin stehen habe, kann ich es überall verwenden, um an der Stelle zu entscheiden was zu tun ist.



  • Travor schrieb:

    Allerdings erlaubt mir meine Konstruktion das ganze in eine while-Schleife zu packen und einfach abzuwarten bis für bestimmte ( in dem Fall sekundäre ) Aufgaben mal wieder Ressourcen da sind.

    (geht mit nothrow() auch)
    Und du solltest dir mal set_new_handler angucken. 😉


Anmelden zum Antworten