C++ array dynamisch erweitern

Hm, so auf Anhieb sollte das passen, vermutlich übersehe ich genauso etwas... (hat schon lang nix mehr mit C und C++ zu tun)

Ok, ich sehs grad... du refernzierst "pointer" und nicht "array", du musst danach in deiner Schleife mit pointer weiterarbeiten (oder direkt &array übergeben)

Aber ich würds eigentlich ganz anders lösen. Wozu das ganze Umkopieren? Erzeug einfach in der Unterfunktion das temp-Array in der Zielgröße und gib das per return zurück. In der Main kannst du das dann wenn du willst dem array zuweisen (array = addArray(array, 4);)
 
Es geht ja gerade darum, das Array dynamisch zu vergrößern, so wie bei std::vector.

Aber ich glaube, da das jetzt schon der zweite Thread mit einem ähnlichen Problem ist, fehlt es hier generell an Verständnis bei der Speicherverwaltung, insbesondere, wie Heap und Stack funktionieren.
Sobald irgendetwas eine nicht zur Compile-Zeit bekannte Anzahl von Elementen hat, muss mit einer Ausnahme mit dem Heap gearbeitet werden - also new int[...].

Die Ausnahme ist die hier:
Code:
size_t anzahl = berechneEineZahl(xyz);
int array[anzahl];

Dort wird aber kein vorhandenes Array vergrößert, sondern eines mit einer vorberechneten Größe auf dem Stack erstellt. Da sollte man dann auch aufpassen, dass das ganze nicht zu groß wird.

Wir wissen aus dem letzten Thread: Lokale Variablen - also solche, die direkt in der Funktion und nicht mit new erzeugt werden - sind nur innerhalb ihres Scopes (Funktion, if-Block, Schleife, ...) gültig, also da, wo sie definiert wurden. Deswegen wäre das Array in dem Fall nach der Funktion auch einfach weg, bzw. dessen Inhalt undefiniert.
 
elektro2 schrieb:
Ich sehe gerade, dass du im Gegensatz zu mir einen int zurückgegeben hast und dadurch direkt die Größe von dem array in der Main geändert hast. Ist das ein muss oder ist das einfach nur "schöner"?:)

Ich dachte, das ist das, was Du wolltest? Die Größe in der Funktion ändern und dann die neue Größe gleich mitgeliefert bekommen (erfahren)?

Was wäre z.b, wenn man die Größe einfach auf 100 legt, also groesse= 100;?

Die Größe soll ja eigentlich zeigen, wie groß das array wirklich ist. Daher wäre es nicht hilfreich, wenn Du das array um eins vergrößerst aber die Zahl, die die Größe des arrays ausdrücken soll, auf 100 setzt. Was soll das bringen? Etwas anderes wäre es, wenn Du in der Funktion das array auf auf 100 vergrößerst (mit new int [100]). Dann wäre es sinnvoll, dem aufrufenden Block (main) zu sagen, wie groß das array nun jetzt ist.
 
VikingGe schrieb:
Die Ausnahme ist die hier:
Code:
size_t anzahl = berechneEineZahl(xyz);
int array[anzahl];

Dort wird aber kein vorhandenes Array vergrößert, sondern eines mit einer vorberechneten Größe auf dem Stack erstellt. Da sollte man dann auch aufpassen, dass das ganze nicht zu groß wird.

Hmm, ich muß zugeben, dass ich noch immer nicht alle Neuerungen, die mit C++11 / C++14 dazugekommen sind, vollkommen verdaut habe; deshalb bin ich mir hier nicht 100%-ig sicher, aber zumindest in C++03 war das noch kein gültiges C++. Auch in C++11 bin ich der Meinung, dass das nicht erlaubt ist, es sei denn berechneEineZahl() hat den constexpr-Modifizierer.
 
antred schrieb:
Neuerungen, die mit C++11 / C++14 dazugekommen sind, vollkommen verdaut habe; deshalb bin ich mir hier nicht 100%-ig sicher, aber zumindest in C++03 war das noch kein gültiges C++. Auch in C++11 bin ich der Meinung, dass das nicht erlaubt ist, es sei denn berechneEineZahl() hat den constexpr-Modifizierer.

Variable Array Length ist C99/C++14 (array size at run time).
 
blöderidiot schrieb:
Variable Array Length ist C99/C++14 (array size at run time).

Ah, verstehe. Danke für den Link. Again what learned, wie mein Kollege immer zu sagen pflegt. ;)
Ergänzung ()

Muß allerdings dazusagen, dass ich den Sinn diese Variable Length Arrays nicht verstehe, und dass sie meiner Meinung nach die (ohnehin schon ausreichend komplizierte) Sprache C++ nur noch weiter verwässern. Was war verkehrt an dem Prinzip?

- Größe zur Kompilierzeit bekannt? -> Array
- Größe erst zur Laufzeit bekannt? -> new [] oder std::vector
 
EDIT: @elektro2:
Ich würde dir empfehlen dich durch ein gutes C++ Lehrbuch zu arbeiten. Davon abgesehen noch der Hinweis, dass es außerhalb von Übungsaufgaben fast keinen legitimen Grund gibt in c++ noch c-arrays zu verwenden (Ausnahmen bestätigen die Regel).
 
Zuletzt bearbeitet:
Da hast du recht . Seit es die STL gibt , gibt es natürlich keinen Grund mehr, normale c arrays zu verwenden . Aber ich möchte c++ nicht einfach nur können, um Programme einfach so runterzuschreiben. Ich finde es wichtig zu verstehen, was z.b die Funktion push_back macht und wie diese funktioniert. Nichts anders haben wir hier ja zusammen entworfen , natürlich nur für Int . Wenn man daraus nun eine template klasse macht und unsere Funktion in Public wäre, hätten wir schon fast die Vector klasse mit der Push back Funktion entwickelt. Aus fundiertem Wissen ist doch erst die STL entstanden, oder nicht :) .. Ich finde es auf jeden Fall wichtig , auch zu verstehen, was im Hintergrund passiert, um auch eigene Ideen besser umsetzen zu können. Ist natürlich noch ein langer Weg
 
Durchaus loeblich. Fuer noch mehr Hintergrundwissen kannst du dir die Implementierungen der STL direkt ansehen. ;)
 
Durchaus loeblich. Fuer noch mehr Hintergrundwissen kannst du dir die Implementierungen der STL direkt ansehen.
Also zumindest libstdc++ ist stellenweise so furchtbar geschrieben, dass man das am besten sein lässt.

Für "noch mehr Hintergrundwissen" wäre aber das Wissen um Move-Semantik und ggf. uninitialized memory und Placement-New nicht verkehrt, um das ganze auch für Klassen nutzbar zu machen, die keinen Default-Konstruktor haben. Da ist es dann mit template<...> nämlich auch nicht mehr getan :freak:


@antred: Ich habe es hier und da schon verwendet, aber gerade nicht einmal genau eine Ahnung, wofür eigentlich. Aber den Sinn sehe ich eigentlich darin, sich solche Allokationen eben zu ersparen, wenn man mal ein Array mit typischerweise sehr kleiner Größe braucht, die maximal mögliche Größe aber schon wieder so groß wäre, dass man mit einem Fixed-Size-Array in nachfolgenden Funktionsaufrufen unnötige Cache-Misses auf dem Stack provozieren würde.
 
Zuletzt bearbeitet:
Du könntest auch bischen mit realloc() rumspielen.
Das hängt dem Array hinten noch Elemente an wenn hinten noch Speicher frei ist (bestimmt das OS!), oder kopiert das ganze Teil um.

Den return Wert davon musst du definitv prüfen, das Teil kann auch scheitern ! Auch um die alten Pointer musst du dich kümmern, da es nach realloc() ganz wo anders stehen kann.

----

Und C++ Array, oder auch die in Java wie ArrayList sind alles C-Arrays, nur um Komfortfeatures ergänzt damit man es nicht manuell erweitern muss. Das Prinzip ist immer das gleiche.

Dennoch wird fast überall hinter den Kulissen C gesprochen, es stellt die Basis für alles dar, praktisch ein Minimum an Funktionalität. Deswegen lernt man im Studium auch C und nicht C++. API büffeln ist nicht programmieren können !

Z.b. die ganzen Java Entwickler wissen nach 10 Jahren Job immer noch nicht was ein Array ist. Wenn ich mir teure Seminare (1000€+) ansehe , dann bleibt mir die Spucke weg. Die zeigen einem dann wie das Array auf dem RAM arbeitet usw.

Hier unterscheidet sich Studium und Lehre, erstere lernen die Funktionsweisen, die mit Lehre wie man die API benutzt.
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben