Anfänger: resize array
-
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
-
1. So ein Programm schreiben, außer wenn man durch eine Aufgabenstellung dazu gezwungen ist
Der Kollege kann ja anscheint auch nichts dafür, dass sein Lehrer ihm solch eine Aufgabe stellt.
2. Diese Lösung als "ganz gut aussehend" beurteilen
Na ja. Wenn es das tut was es soll, wenn auch nicht ganz perfekt, dann hilft es ihm nunmal schon weiter, auch wenn die Aufgabe eventuell Muell ist. Und solange es ihm irgendwie weiterhilft, oder man wenigstens versucht eine Lösung zu finden, kann man es finden wie man möchte, hilft ihm ja auch nichts, wenn er jetzt aufhört, nur weil die Aufgabe mist ist, und er es trotzdem demnächst vorlegen muss.
3. Lemma aus 1.: Solch eine Aufgabe stellen
-
mit sieht gut aus, meinte ich es erfüllt die aufgabe. (sollte das nicht ein vernünftiger programmierer machen: das problem lösen und nicht sagen, das problem gefällt mir nicht
)jedenfalls läuft es und tut das was es soll...;-)
aber weils gerade so schön ist:
teil b der Aufgabe war:ist folgendes mit der obigen funktion korrekt
int a[200];
resize (a, 200, 500)
also ich weiß, dass es nicht korrekt ist, aber ich dachte ein array wäre in c auch immer erin zeiger auf sich selbst? oder hab ich da mit meinem halbwissen was durcheinander gebracht
-
archibaldschroeder schrieb:
mit sieht gut aus, meinte ich es erfüllt die aufgabe. (sollte das nicht ein vernünftiger programmierer machen: das problem lösen und nicht sagen, das problem gefällt mir nicht
)jedenfalls läuft es und tut das was es soll...;-)
So lala. Natürlich soll ein Programmierer Probleme lösen können, aber hier ist die Aufgabe kein Problem, sondern eine genaue Vorgabe, was zu programmieren ist. Und diese Vorgabe ist Mist. Wenn der Deutschlehrer eine Aufgabe stellt, "diss ißt Ein richtiga Sats!!!!" an die Tafel zu schreiben, dann mag dein Ergebnis zwar die Aufgabenstellung erfüllen, aber es ist keine gute Aufgabe, kein gutes Deutsch und du hast nichts gelernt. Und das Schlimmste: Du kannst danach schlechter Deutsch, falls du Deutsch vorher noch nicht gut konntest. (Deutsch magst du gut genug können um zu sehen, dass obige Aufgabe Mist ist, aber kannst du gut genug C?)
also ich weiß, dass es nicht korrekt ist, aber ich dachte ein array wäre in c auch immer erin zeiger auf sich selbst? oder hab ich da mit meinem halbwissen was durcheinander gebracht
Nein, das ist ein Irrtum dem man bei schlechten Lehrern gerne erliegt: Ein Array ist kein Zeiger, ein Zeiger ist kein Array. In Kontexten wo dies nötig ist (d.h. in erster Linie bei Funktionsaufrufen), kann aber ein Array implizit (d.h. ohne, dass du castest oder ähnliches) in einen Zeiger auf sein erstes Element umgewandelt werden.
-
mit sieht gut aus, meinte ich es erfüllt die aufgabe. (sollte das nicht ein vernünftiger programmierer machen: das problem lösen und nicht sagen, das problem gefällt mir nicht
Jaein , es kommt aber auch trotzdem darauf an, dass Problem elegant und so gut wie möglich zu lösen. (Aber da wir ja eh schon geklärt haben, dass die Aufgabe nicht die beste ist, lassen wir DIESES Thema mal.
)
jedenfalls läuft es und tut das was es soll...;-)
aber weils gerade so schön ist:
teil b der Aufgabe war:ist folgendes mit der obigen funktion korrekt
int a[200];
resize (a, 200, 500)
Hä?? Was heißt denn ist es mit der Funktion "korrekt"?
Du übergibst das Array, und die beiden Größen. Da 200 wieder kleiner als 500 ist, geht er in das else, kopiert die werte, macht 300 0'en am ende und returnt es.
Was ist daran jetzt nicht Korrekt?
Wenn du's austauscht kommt natürlich scheiße bei raus, also irgendwelche Zahlen, die gerade im Speicher liegen. (Außer die 300 0'en am ende :D)
Aber ansonsten tut es trotzdem noch das was es soll.
Antwort zu b) Ja, die Funktion tut auch dann noch das was sie soll.
davon mal abgesehen glaube ich echt fast du hast die Aufgabe von Anfang an irgendwie/irgendwo falsch verstanden / interpretiert.
also ich weiß, dass es nicht korrekt ist, aber ich dachte ein array wäre in c auch immer erin zeiger auf sich selbst? oder hab ich da mit meinem halbwissen was durcheinander gebracht
int array[0] ist äquivalent zu int* array;
-
@archibald: Das mit dem Array und Zeiger: Der Arrayname ist die Anfangsadresse des Arrays. Ein Zeiger hat hingegen eine eigene Adresse und eine Adresse, auf die sie zeigt. Du kannst natürlich einen Zeiger den Namen des Arrays übergeben. Dann zeigt der Zeiger auf den Anfang des Arrays.