"We are back" « oc.at

cpp array größe mit new will nicht(?)

pinkey 23.11.2013 - 20:28 2067 9
Posts

pinkey

Here to stay
Registered: Nov 2003
Location: Tirol/Wien
Posts: 2276
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:
Code: CPP
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

.
Registered: May 2003
Location: -
Posts: 1212
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
Registered: Nov 2003
Location: Tirol/Wien
Posts: 2276
Zitat von 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 ;)

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
Avatar
Registered: Mar 2001
Location: Wien
Posts: 2037
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:

Code: CPP
    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
Registered: Nov 2003
Location: Tirol/Wien
Posts: 2276
Danke für den Tipp!

Sind vectoren jetzt die neuen Arrays, also komplett Arrays durch vectoren ersetzen oder ...?

FMFlash

tranceCoder
Avatar
Registered: Mar 2001
Location: Wien
Posts: 2037
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:
Code: CPP
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
Registered: Sep 2006
Location: -
Posts: 4082
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
Registered: Nov 2003
Location: Tirol/Wien
Posts: 2276
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
Avatar
Registered: Mar 2001
Location: Wien
Posts: 2037
Zitat von pinkey
Eine API die ich verwend erfordert das manche Vars 128 Bit aligned sind.

Meinst du struct member alignment?

that

Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11342
Zitat von pinkey
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.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz