cpp array größe mit new will nicht(?)
pinkey 23.11.2013 - 20:28 2067 9
pinkey
Here to stay
|
Steh grad irgendwie an, will ein Array dynamisch initialisieren, machs eigentlich genau so wie in allen Tutorials und wie ichs eigentlich "gelernt" hab ... nur es will nicht. z.B: int* a = NULL;
a = new int[10];
for(int i=0;i<9;i++) {
a[i] = i;
}
Es will mir einfach kein Array anlegen, ich kann immer nur maximal den derzeitigen Wert schreiben. Was kanns da haben ^^?
|
Neo1010
.
|
sollt meiner meinung nach so passen - mal grob drüber geschaut was mir nur auffällt wenn du 10 elemente willst solltest in der schleife <10 statt <9 schreiben
|
pinkey
Here to stay
|
sollt meiner meinung nach so passen - mal grob drüber geschaut was mir nur auffällt wenn du 10 elemente willst solltest in der schleife <10 statt <9 schreiben klar das war jetzt einfach nur kurz zum testen ... wenn ichs mit a[10] anleg gehts ... aber mit new wills einfach nicht funktionieren. compiler is der vom vs2012 edit: omfg, fixed ... das war kein fehler sondern nur eine falsche anzeige im debugger. zum debuggen von solchen dynamisch initialisierten sachen muss mans cheinbar im debugger var,anzahlwerte schreiben, dann hauts hin
Bearbeitet von pinkey am 23.11.2013, 21:01
|
FMFlash
tranceCoder
|
Wenn du mal genauer wissen möchtest was im Speicher steht empfehle ich dir die "Memory" Ansicht zu verwenden. Findest du im Menü Debug -> Windows -> Memory. Ausserdem, da du C++ verwendest, und nicht C, könntest du dieses hässliche Array im obrigen Beispiel besser mit einem vector ausdrücken: std::vector<int> a(10);
for (int i = 0; i < (int)a.size(); i++) {
a[i] = i;
}
Erspart dir viele potentielle Kopfschmerzen und der Debugger spielt auch mit.
|
pinkey
Here to stay
|
Danke für den Tipp!
Sind vectoren jetzt die neuen Arrays, also komplett Arrays durch vectoren ersetzen oder ...?
|
FMFlash
tranceCoder
|
std::vector implementiert ein dynamisches array (mit 24 Byte overhead, falls du es genau wissen willst), bei dem du dich nicht selbst um die Speicherverwaltung und Pointer kümmern musst. Falls es kein dynamisches array sein muss kannst du statt vector auch einfach schreiben: std::array<int, 10> a;
Das ist dann exakt was du zuvor auch hattest, nur wieder ohne Pointer und ohne overhead (kein extra Speicherbedarf). Der Vorteil gegenüber einem int a[10] ist dabei dass das std::array seine größe kennt (a.size() == 10) ohne mit sizeof(a)/sizeof(int) oder dubiosen Macros rumrechnen zu müssen. Potentielle Fehlerquellen grundsätzlich vermeiden ist das Stichwort.
|
Nico
former person of interest
|
du hast es zwar schon gelöst, also nur btw: array-inhalt einfach mit std::cout ausgeben lassen um array-init zu testen.
|
pinkey
Here to stay
|
Danke nochmal für die Infos u. Tipps. Hätte gleich noch eine Frage dazu passend. Eine API die ich verwend erfordert das manche Vars 128 Bit aligned sind. Ansich kein Problem mit __attribute__ ((aligned (16)) (das mitgelieferte macro geht will irgendwie nicht, deswegen so ^^) nur wie mach ich das in kombination mit new?
wenn ichs über array initialisiere, also hausnummer int bla[100] __attri ... gehts, mach ichs mit new is scheinbar nicht mehr 128bit aligned und die API schreit dann natürlich das ihr das nicht passt.
|
FMFlash
tranceCoder
|
|
that
Hoffnungsloser Optimist
|
Danke nochmal für die Infos u. Tipps. Hätte gleich noch eine Frage dazu passend. Eine API die ich verwend erfordert das manche Vars 128 Bit aligned sind. Ansich kein Problem mit __attribute__ ((aligned (16)) (das mitgelieferte macro geht will irgendwie nicht, deswegen so ^^) nur wie mach ich das in kombination mit new?
wenn ichs über array initialisiere, also hausnummer int bla[100] __attri ... gehts, mach ichs mit new is scheinbar nicht mehr 128bit aligned und die API schreit dann natürlich das ihr das nicht passt. Interessantes Problem. Ich fürchte, das geht nur mit Workarounds, z.B. ein Byte-Array 15 Bytes größer allozieren und dann die richtige Anfangsadresse suchen. Oder den Speicher mit mmap bzw. VirtualAlloc direkt vom OS anfordern, da bekommt man üblicherweise ganze 4K-Pages.
|