[VC++.NET] dynamische Arrays

Byte3

Grünschnabel
Hi

Ich hab da so meine Probleme mit dynamischen Arrays. Mir ist "new" und "delete"/"delete[]" schon ein wenig bekannt, aber Ich hab noch ein paar Fragen dazu.

Wie kann man die größe eines Arrays mehrmals um 1 erhöhen?

Ich habs mit
Code:
programme = new s_programme[sizeof(programme) + 1];
probiert, scheint aber irgendwie nicht zu Funktionieren. (Bei s_programme handelt es sich um ein struct)

Ich nehme an das mit "sizeof(programme)" haut nicht ganz hin. Wie bekomme ich die aktuelle größe das Arrays?

Ne frage zu dem "new" hab ich noch.
Wenn ich mit "new" die größe des arrays mehrmals erhöhe, bleiben dann die daten in dem array erhalten oder werden die zurückgesetzt? Fals letzteres zutrifft, gibt es eine möglichkeit das so zu machen das die daten erhalten bleiben?

mfg
Byte
 
Hi,
ich weiß ja nicht, welchen Typ deine Variable "programme" repräsentiert. Aber mit dem Aufruf, wie du ihn programmiert hast, reservierst du auf dem Heap einen völlig neuen Speicherbereich von der Größe "sizeof(programme)" + 1 Byte. Denn woher soll der Compiler wissen, daß die 1 was anderes repräsentiert als 1 Byte. Damit hast du auch die Antwort auf deine zweite Frage. Da ein neuer Speicherbereich reserviert wird, sind dort noch keinerlei Daten gespeichert. Ich würde (vorausgesetzt, dein "programme" repräsentiert irgendein Objekt) mit der Klase CObArray arbeiten. Da kannst du über die Memberfunktionen beliebig Objekte vom deklarierten Typ hinzufügen oder entfernen. Näheres dazu gibts in der MSDN. Vielleicht hilft der Tip.

Mfg

langer
 
Zuletzt bearbeitet:
Noch eine Anmerkung:
Die MFC lebt von Klassen, deshalb solltest du nach Möglichkeit mit Klassen arbeiten. Es sollte eigentlich kein Problem sein, dein "struct programme" in eine Klasse umzuwandeln, die vom Typ CObject abgeleitet ist. Dann kannst du auch freizügig das Einfügen und Entfernen von Elementen realisieren.

Mfg

langer
 
Hab nun die Lösung zu meinem Problem gefunden --> std::vector

Hab mich dabei an diesem Thema orientiert: http://www.tutorials.de/tutorials209808.html

Soweit alles recht simpel bis auf eine sache.

vectKlassen.size() .. wie kann ich das in ein lesbares Format wie CString oder int umwandeln?


---
Problem gelöst .. einfach (int)vectKlassen.size();
Wie ich dass vergessen konnte .. macht bestimmt die uhrzeit.
 
Zuletzt bearbeitet:
Hallo zusammen,
da habe ich glatt eine Fage! Die mich momentan schwer beschäftigt!
Wenn ich mir jetzt den Speicher reserviert habe:
Code:
CStrukturname* struktur=new CStrukturname[anzahl];
Wie kann ich die Größe des Arrays herausbekommen, wenn ich die [anzahl] nicht mehr weiss? Aber sie unbeding brauche.
Arbeite mit Visual C++ 6.0
Gruß
kerian
 
Bin auch davon ausgegangen.
Code:
int size = sizeof(m_parraymess2)  /  sizeof(m_parraymess2[0]);
Bekomme aber size = 0
 
schau doch mal nach, wie groß dein Array überhaupt ist. Meiner Meinung nach fehlt in der Codezeile zum Allocieren die Größe von struktur.
Code:
CStrukturname* struktur=new CStrukturname[anzahl*sizeof(struktur)];
Denn sonst weiß der Compiler doch nicht, wieviel Bytes er pro struktur reservieren muß.

Mfg

langer
 
Code:
int size = sizeof(m_parraymess2)  /  sizeof(m_parraymess2[0]);

Meine Array ist 1200 lang.
Aber sizeof(m_parraymess2) ergibt 4. Was auch richtig ist den das ist ein Pointer und der hat die Länge von 4 Byte wenn wir von einem 32 Bit System ausgehen!
 
Scheint so zu sein, dass man bei mit "new" angelegten Arrays Probleme bekommt, die Größe des reservierten Speichers zu bestimmen :confused:

@langer1801 : Ich denke nicht, dass "new CStrukturname[anzahl*sizeof(struktur)]" richtig ist, "new CStrukturname[anzahl]" sollte schon die richtige Speichergröße reservieren. Der Compiler weiss durch die Angabe von "new CStrukturname" welchen Speicher er für ein Arrayelement reservieren muss.
 

Neue Beiträge

Zurück