Anfänger: resize array



  • vielleicht drück ich mich ungenau aus, deshalb hier mal die Aufgabe:

    Implementieren Sie in C eine Funktion int * resize_array (int * array, int array_length, int new_array_length). Die Funktion soll neuen größeren Speicher für einen Array reservieren, die Elemente aus array in diesen verschieben und zurück liefern. Dies soll nur dann geschehen, wenn new_array_length größer ist als array_length.

    und hier nochmal mein ganzer Code, die main Methode ist nur zum ausprobieren:

    #include <stdlib.h>
    
    int * resize_array ( int *array, int array_length, int new_array_length)
      { int *array2;
        if (array_length> new_array_length) return array;
        else
            {array2= (int*) malloc (sizeof(int)*new_array_length);
    
            int i;
            for (i=0;i<array_length;i++){
            array2[i] = array[i];}
            }
      free (array);
      return array2;}
    
    main (void) {
        int abc [] = {1, 2, 3};
        int  *def;
        def= resize_array(*abc, 3, 5);
    }
    


  • Wutz schrieb:

    archibaldschroeder schrieb:

    ich denk man kann arrays nicht vergrößern?

    Kann man auch nicht. Es gibt hier genug Dilettanten, die ungefragt wirres Zeug verbreiten.

    Es ist nicht unüblich den mit malloc alloziierte Bereich als dynamisches Array zu bezeichnen. Ich denke, du verwirrst den archibald mehr, als du ihm hilfst.

    @archibald: Nochmal: Schmeiß das array2 vollständig raus und mach ein array = realloc(...)!



  • archibaldschroeder schrieb:

    die main Methode ist nur zum ausprobieren:

    Wieso nur?
    Das ist entscheidend. Schon mal gut, wenn du dir einen Testfall baust.
    Und prompt ist der Fehler offensichtlich.
    Statt *abc muss es natürlich abc heißen, also weg damit.
    Dann läuft es auch, und wenn in deiner Aufgabenstellung das "Freigeben" des "alten" Arrays nicht explizit gefordert ist, lässt du free weg und fertig.



  • @archibald: Es ist zu unterscheiden, ob ihr malloc und realloc verwenden dürft, oder nicht. Man kann sich nämlich dadurch das Leben deutlich einfacher machen.
    Statische und dynamische Arrays zu mischen ist nicht gerade sinnvoll, insbesondere dann, wenn das Array "vergrößert" werden soll.

    Ich würde in der main-Methode abc mit malloc Speicherplatz reservieren und beim resize_array() ein realloc machen. Das ist deutlich einfacher und du sparst Code.



  • Wenn du in main den Speicher mit malloc anforderst, solltest du auch wieder das free einbauen.



  • Aber nicht, wenn er realloc macht. Das free kommt dann in die main-Funktion.


  • Mod

    Das ist sowieso ganz böse, wenn ein malloc und ein free auf nicht mehr auf der gleichen Programmlogikebene sind. Wie zum Beispiel hier, da das free zum malloc in einer Unterfunktion der malloc-ierenden Funktion steht. Das schreit geradezu nach Fehlern. Die der Threadersteller auch nicht ganz zufällig bekommt.



  • danke schonmal für die ganzen tipps. das problem ist, dass das ne alte klausuraufabe ist, die ich vorstellen muss...

    in der klausur war nur die resize-array funktion gegeben, die nen statischen array bekommt... auch wenn das praktisch sein mag, der funktion direkt nen dynamischen array zu übergeben, ist das daher hier für mich nicht möglich


  • Mod

    Das ist schlicht und einfach nicht möglich. Heute genausowenig wie irgendwann früher. Du musst etwas falsch verstanden haben. Es kann nicht sein!



  • Dann will der Lehrer entweder schauen wie du auf unlösbare Aufgabenstellungen reagierst oder er kann kein C.

    Oder du hast die Aufgabenstellung falsch verstanden.



  • mist und ich dachte ich hätte es mit meiner ersten variante möglich gemacht 😉

    konnte nur kurz einsicht in die klausur nehmen, vielleicht hab ich da wirklich was falsch gemacht...
    find ich aber merkwürdig, dass man einen statischen array nicht zur laufzeit in einen anderen array kopieren können soll. ich will ja gar nicht den ursprünglichen array verlängern... sondern alles in einen neuen array kopieren und den dann zurück geben...


  • Mod

    Das klingt doch schon gleich ganz anders. Kopieren in ein größeres Array ist nicht vergrößern des alten Arrays. Tja, aber dummerweise kann man keine Arrays zurückgeben, also so ganz richtig hast du die Aufgabenstellung noch nicht wiedergegeben (vorausgesetzt, die Aufgabenstellung ist überhaupt richtig, wovon ich nicht mit Sicherheit ausgehen würde).



  • jo, die funktion liefert aber doch nen zeiger auf nen array zurück: int * resize()... kann ja verstehen, dass der name "resize" für verwirrung sorgt... aber das ist doch nur ein name...



  • #include <stdlib.h>
    #include <stdio.h>
    
    /*
    AUFGABE:
    1. Implementieren Sie in C eine Funktion int * resize_array (int * array, int array_length, int new_array_length). 
    2. Die Funktion soll neuen größeren Speicher für einen Array reservieren, 
    3. die Elemente aus array in diesen verschieben 
    4. und zurück liefern. 
    5. Dies soll nur dann geschehen, wenn new_array_length größer ist als array_length.
    */
    
    //1.
    int* resize_array (int* array, int array_length, int new_array_length)
    {
        int* new_array;
        // 2.
        new_array = (int*) malloc(new_array_length * sizeof(int));
    
        // 5.
        if (array_length> new_array_length) 
        {
            return array;
        }
        else
        { 
            int i;
    
            printf("\n");
            // 3.
            for (i = 0; i < new_array_length; i++)
            {
                new_array[i] = array[i];
    
                if(i >= array_length) // Die neu dazu gekommenen Werte werden auf 0 gesetzt. Hier: 14(Groesse neues array) - 9(Groesse bzw anzahl der werte des alten, welche in das größere "kopiert" werden) = 5 - 0'en am ende.
                {
                        new_array[i] = 0;
                }
            }
            // 4.
            return new_array;
        }
    }
    
    int main() 
    {
        int abc[] = {4, 5, 6, 7, 8, 9, 12 , 13, 14}; //  Array mit der Größe 9.
        int* def;                                    // Zeiger Typ int;
        int i;                                       // Zaehlvariable
        int array_length = 9;                        // array_length
        int new_array_length = 14;                   //new_array_length
    
        printf("\nAltes Array: (Größe 9): \n");
        for(i = 0; i < array_length; i++)
        {
            printf("%d ", abc[i]);
        }
    
        printf("\n");
    
        def = resize_array(abc, array_length, new_array_length);
    
        printf("Neues Array: (Groeße 14)\n");
    
        for(i = 0; i < new_array_length; i++)
        {
            printf("%d ", def[i]);
        }
    
        printf("\n\n");
    
        free(def);
    
        return 0;
    }
    

    So, oder wie? 😕


  • Mod

    marvNN schrieb:

    So, oder wie? 😕

    Autsch! Das Schlimmste ist: Ich befürchte fast, du liegst damit richtig.



  • @marvNN: Wenn array_length > new_array_length, dann gibts nen Memory Leak...



  • Steffo schrieb:

    @marvNN: Wenn array_length > new_array_length, dann gibts nen Memory Leak...

    Ja stimmt, danke 🙂 war sowieso irgendwie ganz fix und hab die abfrage eh nur überflogen, weil wir mit Statischen Arraygrößen an der Stelle arbeiten, wo wir eh immer wissen, dass array_length nicht größer als new_array_length ist. (deswegen hatte ich den if{} Teil auch erst ganz raus genommen, bis ich gesehen habe, dass es blöder weise explizit in der Aufgabe stand) Na ja, den Sinn der Aufgabe versteh ich sowieso nicht.
    ➡ Meinte euer Lehrer vielleicht was von Dynamik? 😃
    Außerdem fände ich es andersherum sowieso viel Sinnvoller.
    also, Man hat zu viel Speicher reserviert oder man nutzt nicht die volle größe des Arrays, und kopiert den Inhalt in ein Größen entsprechendes, also kleineres.



  • Danke, sieht ganz gut aus...soweit ich das beurteilen kann 😉 probier das gleich mal aus...
    du reservierst den speicher für den neuen array, der eventuell gar nicht gebraucht wird, ist das mit "memory leak" gemeint? das ließe sich dann ja ganz keicht beheben, wenn man den speicher erst in der else anweisung reserviert,oder?



  • archibaldschroeder schrieb:

    Danke, sieht ganz gut aus...soweit ich das beurteilen kann 😉 probier das gleich mal aus...
    du reservierst den speicher für den neuen array, der eventuell gar nicht gebraucht wird, ist das mit "memory leak" gemeint? das ließe sich dann ja ganz keicht beheben, wenn man den speicher erst in der else anweisung reserviert,oder?

    Nein, mit memory leak ist gemeint: wenn die Bedingung eintrifft, habe ich für array welches beim Eintreffen der bedingung returnt wird, gar kein Speicher reserviert habe. Bis jetzt habe ich nur für das Neue Array speicher reserviert, weil ich ja von anfang an wusste, dass in unserem Fall die Bedingung eh nicht eintrifft. ich hab's quasi einfach weggelassen. (Was man natürlich nicht machen darf, wenn das ganze dynamisch wird, und bedingungen je nach Benutzereingabe entschieden werden).
    Wenn man jetzt davon ausgeht, dass die if bedingung true ist, sollte man sich für sein array speicher reservieren, dann dürfte es auch kein leak geben.

    Wenn man sich für ein Array speicher reserviert, welches man dann gar nicht benutzt, ist dass im ersten moment gar nicht schlimm, solange man den speicher auch wieder freigibt.

    free();
    

  • Mod

    archibaldschroeder schrieb:

    Danke, sieht ganz gut aus...soweit ich das beurteilen kann 😉 probier das gleich mal aus...

    Nein, das sieht gar nicht gut aus, es ist bloß das, wozu einen die Aufgabenstellung, soweit marvNN sie sich zusammenreimen konnte, zwingt. Kein vernünftiger Programmierer würde das jemals so machen.


Anmelden zum Antworten