Array Größe ändern, wie?



  • Hi,
    ich möchte eine Funktion schreiben die mir ein Integerarray zurückgibt. Ich weiss aber beim Start der Funktion noch nicht wie gross das Array sein wird, wie kann ich die Größe zur Laufzeit verändern? Wie Deklariere ich die Funktion?

    Danke Kay



  • Die Funktion müßte vom Typ int* sein. In der Funktion weist du dann einem Pointer mit dem Befehl new Speicher zu und gibst diesen Pointer als Return-Wert zurück.

    int* Array(int groesse)
    {
    int* temp;
    temp=new int [groesse];
    return temp
    }

    Zur weiteren Änderung:
    mit delete kannst du den Speicher wieder freigeben und mit new dann eine neue Größe festlegen. Allerdings müßtest du, wenn dir an den Daten in dem Array was liegt, die Daten zwischenspeichern.



  • Um einnen Array zu erweitern benutzt man realloc.

    #include<stdlib.h>
    
    int main()
    {
     int *array;
     array = new int[10];
     array = (int*) realloc(NULL, 20 * sizeof(int)); 
     //array auf 20 int Felder erweitern
    }
    


  • Autsch ...

    C++ (new) und C (realloc) sollte man nicht mischen!!! Der cast bei realloc() ist überflüssig, wenn der Quelltext in C übersetzt wird.

    Ergebnisse von realloc() sollten nie direkt zugewiesen werden. Stichwort Memory Leak. Und als ersten Parameter sollte realloc() einen Zeiger auf den zu verändernden Speicherbereich erhalten, damit die Bytes umkopiert werden.

    [ Dieser Beitrag wurde am 05.08.2002 um 15:31 Uhr von mady editiert. ]



  • danke für die infos, wie ich ein Array zur Laufzeit ändere ist mir nun klar. Aber:...
    Ich habe zwei Funktionen, a und b. Fkt a ruft Fkt b auf. b ist vom typ int (Fehlercode) und hat zwei parameter vom typ integer.
    z.B. int b(int x,y)
    Die Fkt. b soll oben genanntes Array erzeugen und die Adresse des Array an die Fkt a zurückgeben, jedoch nicht über den Rückgabewert. Demnach müsste doch ein zusätzlicher Parameter für die Fkt b definiert werden der die Adresse des Arrays enthält, oder? Wie sieht dann der Aufruf der Fkt b aus?

    mfg Kay



  • int b(int x, int y, char **p);
    
    int a(void)
    {
        char *p;
        /* ... */
        if ( b(x,y,&p) ) {
            /* ... */
        }
        /* ... */
    }
    

    Unter der Voraussetzung, dass Deine Pointer vom Typ char sind. In b() kannst Du dann mit *p auf den Pointer zugreifen ...

    [ Dieser Beitrag wurde am 05.08.2002 um 15:35 Uhr von mady editiert. ]



  • Danke, werds dann gleich mal ausprobieren...



  • ...mmh, ich habe jetzt eine Funktion, die ein Integerfeld erzeugt und den Zeiger auf das erste Feld zurückgibt. Beim Debuggen bekomme ich aber immer eine access violation error. Was mach ich falsch?



  • Deine Funktion sieht aber nicht zufällig so aus:

    int * makearray ()
    {
        int array [ 50 ];
        return ( array );
    }
    

    array ist nämlich lokal, und der zurückgegebene Zeiger zeigt ins leere *boom*.

    MfG SideWinder



  • Er hat doch schon erzählt, dass er mit new arbeitet.



  • Danke, ich habs hinbekommen... Danke nochmal


Anmelden zum Antworten