Anfänger: resize array
-
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.
-
marvNN schrieb:
int array[0] ist äquivalent zu int* array;
Ne, nicht wirklich. array[0] ist der erste Wert des Arrays und int* array; ist erst mal nur ein uninitialisierter int-Pointer.
-
also vielleicht hab ich da wirklich was falsch verstanden...
also die funktion wird doch in der regel mit nem zeiger auf nen array aufgerufen und in aufgabe b mit dem array direkt...
in marvNNs version funktioniert aber beides, so dass ich jetzt wirklich verwirrt bin...
-
archibaldschroeder schrieb:
also vielleicht hab ich da wirklich was falsch verstanden...
also die funktion wird doch in der regel mit nem zeiger auf nen array aufgerufen und in aufgabe b mit dem array direkt...
in marvNNs version funktioniert aber beides, so dass ich jetzt wirklich verwirrt bin...In meiner Version steht es so:
int abc[] = {4, 5, 6, 7, 8, 9, 12 , 13, 14};
also ein array der größe 9.int array_length = 9;
bei b:
int a[200];
also ein array der größe 200.int array_length = 200;
Unterschied Nummer 1:
Die alte und die neue größe.
Ist aber egal wie groß es ist, solange die alte länge, also 200, kleiner als die neue (500) ist. (Selbst dann würde es funktionieren (wenn wir den Speicherfehler beheben würden), das Programm würde halt nur was unterschiedliches machen, jedoch würde es trotzdem das richtige machen und sich korrekt beenden.Unterschied Nummer 2:
{4, 5, 6, 7, 8, 9, 12 , 13, 14};
Wir haben dem Array hart 9 Werte reincodiert.
Bei b haben wir gar keine Werte zugewiesen. Wir haben die 200 Felder einfach leer gelassen. Was dadrin steht wissen wir nicht. irgendetwas undefiniertes.
ist aber auch nicht schlimm. Wir erwarten ja nur, dass werte kopiert und zurück gegeben werden. irgendwelche zufalls werte sind zwar unschön, aber trotzdem Werte. Also können diese genau so wie von uns initialisierte werte kopiert und ausgegeben / übergeben werden.Unterschied Nummer 3:
Bei mir heißt das array abc, bei aufgabe b) a.
Dass das egal ist, wie es heißt sollte dir ja klar sein, solange man die Übergabeparameter mit ändert. wenn wir int a[200]; haben und dann bei der Funktion (abc, 200, 500) übergeben, geht's natürlich nicht.Fazit: Es gibt überhaupt keinen Grund, wieso es sich bei dieser Variante anders verhalten sollte.
-
archibaldschroeder schrieb:
also vielleicht hab ich da wirklich was falsch verstanden...
also die funktion wird doch in der regel mit nem zeiger auf nen array aufgerufen und in aufgabe b mit dem array direkt...
in marvNNs version funktioniert aber beides, so dass ich jetzt wirklich verwirrt bin...Es gibt durchaus eine Äquivalenz bei Pointer und Arrays: