Anfänger: resize array
-
@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.
-
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
-
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...
-
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?
-
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();
-
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.
-
Wegen dem leak:
Der eigentliche leak hat mit reservieren direkt, dann nichts mehr zutun.
memory leaks entstehen wenn Speicher überschrieben wird, und man diesen vorher nicht wieder freigegeben hat. Dadurch ist dann sozusagen ein speicherloch entstanden.
-
SeppJ schrieb:
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.
Was genau würde kein vernünftiger Programmierer so machen?
So eine Aufgabe stellen, es überhaupt so versuchen oder sie genau so zu lösen, wie ich es gemacht habe bzw. es in der Aufgabe gefordert war?
-
marvNN schrieb:
Was genau würde kein vernünftiger Programmierer so machen?
1. So ein Programm schreiben, außer wenn man durch eine Aufgabenstellung dazu gezwungen ist
2. Diese Lösung als "ganz gut aussehend" beurteilen
3. Lemma aus 1.: Solch eine Aufgabe stellen