Mehrdeminsionales Array auf Heap
-
int Y=10,X=15; int **t= new int*[Y]; for(int k=0; k< Y; k++) t[k]= new int[X];
glaube so irgendiwe
-
nimm doch einfach std::vector
-
Naja ein int kann schlecht ein int[][] sein
Das geht nicht. Einfach machst du es dir, wenn du std::vector nutzt!
#include <vector> std::vector< std::vector<int> > array;
Oder von Hand:
int** array(new int*[x]()); for (std::size_t i(0); i < x; ++i) array[i] = new int[y];
x und y sind jeweils die Dimensionen
for (std::size_t i(0); i < x; ++i) delete [] array[i]; delete [] array;
solltest du am Ende aber auch nicht vergessen!
-
Warum geht eigentlich das hier nicht:
... string a="BOUM"; int arrey[a.length()][3]; ...
löst bei mir einen Fehler aus. Aber a.length() ist doch zur Laufzeit bekannt!?
MfG
Stromberg
-
Ja, aber nicht zur Compilezeit. die Groessen von automatischen arrays muessen zur Compilezeit bekannte Konstanten sein. Allerdings unterstuetzen einige Compiler automatische Arrays mit grenzen, die erst zur Laufzeit bestimmt werden, das ist allerdings nicht standard-C++ und daher nicht portabel.
-
wenn du dir die schleifen bei new[] und delete[] ersparen willst,
kannst du auch ein eindimensionales array erstellenint w = 10, h = 15; int* arr = new int[w*h]; // ... delete[] arr;
du greifst dann darauf zu mit
int val = arr[x + (y * w)] // runde klammern kann man vernachlässigen
-
(D)Evil schrieb:
int** array(new int*[x]()); //<-- !!!!
for (std::size_t i(0); i < x; ++i)
array[i] = new int[y];Für was sind die runden Klammern "()"?
MfG
Stromberg
-
Stromberg schrieb:
(D)Evil schrieb:
int** array(new int*[x]()); //<-- !!!!
for (std::size_t i(0); i < x; ++i)
array[i] = new int[y];Für was sind die runden Klammern "()"?
MfG
StrombergDefault-initialisierung (also NULL) der mit new[] angelegten Arrayelemente.
-
string a="BOUM"; int (*save)[3]=new int[a.length()][3];
-
Warum geht das hier nicht, is das nicht in etwa das gleiche:
#include <iostream> using namespace std; int main() { int x=7; int y=3; int *temp=new int[7]; int** array=&temp; for (std::size_t i(0); i < x; ++i) array[i] = new int[y]; array[0][0]=143522; cout << array[0][0] << "\n"; return 0; }
???
MfG
Stromberg
-
Nimm lieber vector.
-
Sicherlich ist vector besser, ich will das aber trotzdem können
Schätzungsweise ich sitz mal in einer Höhle fest, in der mich ein verrückter Psychopat dazu zwingt ihm ein C++ Programm zu schreiben, und mir eine IDE und einen Compiler gibt, aber leider hat der Compiler genau die <vector> header Datei nicht, und ich muss aber ein mehrdiminsionales Feld erstellen? Was tun? Wenn ichs nicht mache werde ich aufs quallvollste gefoltert und anschließend getötet. Wenn ich es schaffe komm ich frei.
Also is es schon wichtig auch das zu können find ich.
MfG
Stromberg
-
Jetzt wollte ich das mit "vector" machen, aber ich bin grad echt am grübeln , wie ich die einzelnen Felder initialisieren soll?!
vector< vector<int> > array;
Wenn ich jetzt ein Feld[7][3] haben möchte und die einzelnen Felder da zuweisen will...häää wie mach ich des jetzt? Mit "push_back"?
array.push_back(push_back(10))???
Ich blick des grad gar nicht. Wie weiße ich den jetzt z.B. [1][2] die Zahl 122 zu?
MfG
Stromberg
-
So kannst du z.B. ein 2d-Array mit 100x100 Elementen machen:
vector< vector<int> > array(100, vector<int>(100));
-
Stromberg schrieb:
Wie kann ich ein mehrdeminsionales Array auf Heap erstellen?
Bei folgendem Code kommt ein Error:... string a="BOUM"; int save=new int[a.length()][3]; ...´
error: expected primary-expression before '[' token
Wie gehts richtig?
MfG
Strombergstruct my { int length(){return 4; } }; int main() { my a; // so: int (*save)[3] = reinterpret_cast<int(*)[3]>(new int[a.length()*3]); // oder so: int (*save2)[3] = (int(*)[3])new int[a.length()*3]; save[1][2] = 4711; save2[0][0] = save[1][2]; delete[] save; delete[] save2; }
mfg
-
willy schrieb:
struct my { int length(){return 4; } }; int main() { my a; // so: int (*save)[3] = reinterpret_cast<int(*)[3]>(new int[a.length()*3]); // oder so: int (*save2)[3] = (int(*)[3])new int[a.length()*3]; save[1][2] = 4711; save2[0][0] = save[1][2]; delete[] save; delete[] save2; }
Das ist undefiniert. Die Operanden der delete[]-Ausdrücke haben nicht den gleichen Typ wie die jeweiligen Ergebnisse der new-Ausdrücke. Im Übrigen ist die wilde Casterei ohnehin völlig unnötig.
-
camper schrieb:
Das ist undefiniert. Die Operanden der delete[]-Ausdrücke haben nicht den gleichen Typ wie die jeweiligen Ergebnisse der new-Ausdrücke. Im Übrigen ist die wilde Casterei ohnehin völlig unnötig.
Es handelt sich um gültige Zeiger, die von new geliefert wurden und die delete[] erwartet - was soll daran undefiniert sein.
Dies geht auch ohne Cast, stimmt. Aber warum undefiniert und wild?
-
willy schrieb:
warum undefiniert
5.3.5/2 schrieb:
In the second alternative (delete array), the value of the operand of delete shall be the pointer value which resulted from a previous array new-expression.72) If not, the behavior is undefined. [Note: this means that the syntax of the delete-expression must match the type of the object allocated by new, not the syntax of the new-expression. ] [Note: a pointer to a const type can be the operand of a delete-expression; it is not necessary to cast away the constness (5.2.11) of the pointer expression before it is used as the operand of the delete-expression. ]
Bei den new-Ausdrücken ist der Elementtyp des Arrays int, bei den delete-Ausdrücken ist es int[3]
Sicherlich wird es kaum einen Compiler geben, der in diesem Falle Schwierigkeiten macht, aber einen etwas schlechten Beigeschmack hat es schon.