Dynamisches Array kann nicht in einer Funktion genutzt werden?
-
RungAaz schrieb:
Was aber, wenn ich zwei Pointer erstellen würde:
std::vector<char>* pPos = NULL, pEnd = NULL;Warum nimmst du nicht die beschriebenen Iteratoren, und versuchst dich krampfhaft an den Zeigern aufzuhängen?
-
P.S.: Und was soll denn das geNULLe bei den Pointern? Das deutet irgendwie darauf hin, dass du Pointer nicht richtig verstanden hast und da lieber erstmal die Finger von lassen solltest. Mit Iteratoren fährst du wesentlich fehlerrobuster und anfängerfreundlich.
Laut einem Tutorial sollte man Pointer, sofern man sie nicht gleich zuweist immer auf NULL setzten, weil die sonst irgendwo hindeuten - oder nicht?
Warum nimmst du nicht die beschriebenen Iteratoren, und versuchst dich krampfhaft an den Zeigern aufzuhängen?
Keine Angst, ich nehme schon die Iteratoren. Mich hat es lediglich interessiert, ob es auch auf eine andere Weise geht, da du ja schon vorher erwähnt hast, dass diese Teile einem Pointer sehr ähnlich sind.
-
RungAaz schrieb:
P.S.: Und was soll denn das geNULLe bei den Pointern? Das deutet irgendwie darauf hin, dass du Pointer nicht richtig verstanden hast und da lieber erstmal die Finger von lassen solltest. Mit Iteratoren fährst du wesentlich fehlerrobuster und anfängerfreundlich.
Laut einem Tutorial sollte man Pointer, sofern man sie nicht gleich zuweist immer auf NULL setzten, weil die sonst irgendwo hindeuten - oder nicht?
Schlechtes Tutorial. Du als Programmierer musst bei solcher Art von Zeigerbenutzung jederzeit selber wissen ob dein Zeiger auf ein gültiges Objekt zeigt. Das geNULLe ist Cargo Cult von Leuten die das mal bei gewissen Datenstrukturen wie verketteten Listen gesehen haben, aber nicht verstanden haben, warum das dort Sinn macht.
Die Technik mit dem NULLen von ungültigen Zeigern bewährt dich zwar vor sofortigem Programmabsturz im Fehlerfall, aber dennoch ist in diesem Fall ein Fehler in der Programmlogik aufgetreten. Und das schlimmste ist: Nun bekommst du es noch nicht einmal mit und dein Programm bleibt fehlerhaft!
-
Ok, das stimmt auch wieder.
Also ist und bleibt die sinnvollste Verwendung von einem NULL-Wert, die Parameterübergabe bei Funktionen. Falls in der Parameterliste ein Pointer existiert, den man beim Aufruf grade nicht braucht - oder?
-
Es gibt viele sinnvolle Anwendungen von Nullpointern und ich kenne sicherlich nicht alle. Ich wollte bloß klarstellen, dass dies hier keine ist.
-
Achso, ok, dann werde ich mir das mal merken.
-
RungAaz schrieb:
Nun, ich hatte das ganze früher mit dem Vector-Template (wie von dir schon erwähnt) gemacht, aber warum eine zusätzliche Header-Datei einbinden wenn es bei C++ schon standartmäßig den new-Operator gibt?

new[] und delete[] sind "low level" Operationen. Ein vektor ist ein "high level" Konzept. Da gibt es schon genug Unterschiede, die für vektor sprechen, zB:
- Verwaltung des reservierten Speichers übernimmt der Vektor
- C++ Implementierungen bieten oft einen "STL Debug-Modus" mit "sicheren Iteratoren" und zusätzlichen Bereichsüberprüfungen an.RungAaz schrieb:
std::string habe ich nicht verwendet, da ich die Buchstaben einzeln brauche.
Wobei ich die Zeichen, die ein String enthält auch einzeln Manipulieren kann - oder?
Naja, warum einfach, wenn es auch kompliziert geht
Genau. Das ist die Frage. Warum new[]/delete[] benutzen, wenn Du auch vector oder string hättest nehmen können? Dass Du einen zusätzlichen Header einbinden musst ist kein guter Grund.
kk
-
krümelkacker schrieb:
new[] und delete[] sind "low level" Operationen. Ein vektor ist ein "high level" Konzept.
low und high levels sollten nie ein Entscheidungskriterium sein, weil wie hier bei Vorliegen weiterer Gründe völlig irrelevant, und bei Nichtvorliegen stets zu Fehlschlüssen führend.
-
Also, auch wenn ich mir das Leben mit new und delete schwerer mache als es ist, bleibt die Erfahrung, die ich damit mache, und daruaf kommt es doch hauptsächlich an - oder nicht?
Beispielsweise habe ich dadurch erfahren, dass ein Grund für das Verrecken des Programms während der Runtime das Nicht- bzw. Reinitialisieren eines Pointers sein kann.
-
RungAaz schrieb:
Also, auch wenn ich mir das Leben mit new und delete schwerer mache als es ist, bleibt die Erfahrung, die ich damit mache, und daruaf kommt es doch hauptsächlich an - oder nicht?
Beispielsweise habe ich dadurch erfahren, dass ein Grund für das Verrecken des Programms während der Runtime das Nicht- bzw. Reinitialisieren eines Pointers sein kann.
Lass dir nichts einreden. Natürlich sind STL-Container normalerweise einfacher, weniger fehleranfällig und daher sinnvoller. Das heißt aber nicht, dass hier ständig Anfängern geraten werden muss, bloß nie - und sei es auch in Übungsprogrammen - new/delete/new[]/delete[] zu benutzen. Egal, mit wievielen
- Smileys das hier immer unterstrichen wird, diesen Weg sollte man schon kennenlernen.
-
Wichtig ist, dass du zwischen Herumexperimentieren/Lernen/Erfahrung sammeln und produktivem Einsatz unterscheidest. Der erste Teil darf keineswegs zu kurz kommen. Doch wenn es für eine konkrete Problemstellung darum geht, mehrere Objekte gemeinsam zu verwalten, sind die STL-Container im Allgemeinen die bessere Wahl, da sie genau diese Anforderung erfüllen und dich von hintergründigen Aufgaben wie Speicherverwaltung entlasten.