Wie deklariere ich ein 2d-Array mit new?
Bei einer "normalen" Anordnung würde ich das tun:
int* ary = new int[Size]
mais
int** ary = new int[sizeY][sizeX]
a) nicht funktioniert/kompiliert und b) nichts bewirkt:
int ary[sizeY][sizeX]
tut.
Wie deklariere ich ein 2d-Array mit new?
Bei einer "normalen" Anordnung würde ich das tun:
int* ary = new int[Size]
mais
int** ary = new int[sizeY][sizeX]
a) nicht funktioniert/kompiliert und b) nichts bewirkt:
int ary[sizeY][sizeX]
tut.
Ich habe dieses nicht elegante, aber SCHNELLE, EINFACHE und FUNKTIONIERENDE System verwendet. Ich sehe nicht, warum kann nicht funktionieren, weil der einzige Weg für das System zu ermöglichen, erstellen Sie eine große Größe Array und Zugriff Teile ist ohne Schneiden es in Teile:
#define DIM 3
#define WORMS 50000 //gusanos
void halla_centros_V000(double CENW[][DIM])
{
CENW[i][j]=...
...
}
int main()
{
double *CENW_MEM=new double[WORMS*DIM];
double (*CENW)[DIM];
CENW=(double (*)[3]) &CENW_MEM[0];
halla_centros_V000(CENW);
delete[] CENW_MEM;
}
Ich habe Ihnen eine Lösung hinterlassen, die für mich in bestimmten Fällen am besten funktioniert. Vor allem, wenn man die Größe einer Dimension des Arrays kennt. Sehr nützlich für ein Array von chars, zum Beispiel, wenn wir ein Array von unterschiedlicher Größe von Arrays von char[20] benötigen.
int size = 1492;
char (*array)[20];
array = new char[size][20];
...
strcpy(array[5], "hola!");
...
delete [] array;
Der Schlüssel sind die Klammern in der Array-Deklaration.
Wenn Sie das Array nur lokal oder innerhalb einer Klasse verwenden, können Sie einen Lambda-Ausdruck verwenden, um ein Array-ähnliches Objekt zu erstellen.
int main(int argc, char **argv) {
srand(time(0));
int w = rand() % 20 + 10;
int h = rand() % 20 + 10;
{
// Here. Only one line and no memory leak.
auto arr = [=, p = std::make_unique<int[]>(w * h)](int i, int j) -> int & { return *&p[i * w + j]; };
arr(1, 0) = 6;
std::cout << arr(1, 0) << '\n';
}
}
Das Objekt ist nicht kompatibel mit int[][]
und um es als Argument zu übergeben, benötigen Sie Vorlagen. Aber es kann Sie von der Mühe befreien, sich [i * w + j]
rechts, wenn Sie auf ein Element zugreifen.
Sie können auch eine bloße std::unique_ptr<int[]>
zusammen mit einem in Lambda implementierten Getter. Aber Sie können Fehler machen und baumelnde Referenzen haben.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
74 Stimmen
Es funktioniert nur, wenn sizeX konstant ist: int(*ary)[sizeX] = new int[sizeY][sizeX]; Das ist der richtige Weg, um einen int[sizeY][sizeX] zu erstellen, bei dem der gesamte Speicher zusammenhängend ist. (Ich glaube nicht, dass dies eine Antwort wert ist, da wahrscheinlich Ihre sizeX nicht konstant ist
36 Stimmen
Ich kann nicht glauben, dass all die Dutzende von Antworten unten sind todos falsch und beantwortet die Frage nicht, und dennoch werden sie alle hochgestuft. Der obige Kommentar von Johanes Shaub ist die einzig richtige Antwort auf die Frage . Ein 2D-Array und ein Array mit Zeigern auf ein Array sind zwei völlig verschiedene Dinge, die offenbar jeder verwechselt.
8 Stimmen
@JohannesSchaub-litb: Das ist nicht 100%ig richtig. Sicherlich funktioniert es in diesem Fall, aber es gibt eine Methode, mit der es funktioniert, wenn alle Dimensionen variieren, siehe stackoverflow.com/a/29375830/103167