Probleme mit großen mehrdimensionalen Arrays
-
Hallo!
Ich benötige für ein 3D-Projekt ein sehr großes mehrdimensionales Array.
Nach einer Deffinition wie z.B.:double test [256][256][64][2];
bricht der Compiler immer mit der Meldung "[Linker Fehler] Fatal: Access violation. Link terminated." ab. Ich bin bei meiner Suche schon oft auf dieses Problem, jedoch nicht auf eine wirkliche Lösung gestoßen. Es soll eine Möglichkeit mit Hilfe des new-Operators und dynamisch allokiertem Speicher geben, aber wie allokiere ich ein 4-Dimensionales Array? Oder muß ich hierfür eine eigene Klasse erstellen die die gesamte Speicherverwaltung übernimmt?
-
Vieleicht so (für 2 Dimensionen) :
int** test = new (int*) [dim1];
for (int i=0; i<dim1; i++)
test[i] = new int [dim2];Ist aber kein BCB Problem...
-
Hi
du köntest in der Tat ne Klasse schreiben, die sowas abbildet.
Oder du nimst dynamische Arrays und schachtest diese ineinander oder nimmst ein
Feld von Dynamischen Arrays.Beispiel:
#include <vector> //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; std::vector<double> TheDoubles [100][100]; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { TheDoubles[1][1].push_back(5.45); TheDoubles[1][1].push_back(345435); TheDoubles[1][1].push_back(344321435); TheDoubles[1][1].push_back(345435); TheDoubles[2][1].push_back(6); TheDoubles[2][2].push_back(6); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { Memo1->Lines->Add(FloatToStr(TheDoubles[1][1][0])); Memo1->Lines->Add(FloatToStr(TheDoubles[1][1][1])); Memo1->Lines->Add(FloatToStr(TheDoubles[1][1][0])); Memo1->Lines->Add(FloatToStr(TheDoubles[2][2][0])); } //---------------------------------------------------------------------------
naja, ist halt nur ein Beispiel
Das selbe geht auch mit TList oder anderen Geschichten.
-
Hi,
typedef int D4_ARRAY[256][256][64][2]; D4_ARRAY *array = (D4_ARRAY *)new int*[256 * 256 * 64 * 2]; (*array)[0][0][0][0] = 0; // == ((int *)array)[0] = 0; (*array)[0][0][0][1] = 1; // == ((int *)array)[1] = 1; (*array)[0][0][1][0] = 2; // == ((int *)array)[2] = 2; (*array)[0][0][1][1] = 3; // == ((int *)array)[3] = 3; (*array)[0][0][2][0] = 4; // == ((int *)array)[4] = 4; //...usw. ShowMessage(((int *)array)[2]) ShowMessage(((int *)array)[3])
-
Vielen Dank für die Antworten! Ich werde die Möglichkeiten mal durchtesten.
Ein BCB Problem ist es wohl in sofern, weil andere Compiler (z.B. Visual C++) keine Probleme mit der einfachen Definition haben. ...Dafür haben sie andere Macken
-
Original erstellt von <E100fan>:
Vielen Dank für die Antworten! Ich werde die Möglichkeiten mal durchtesten.
Ein BCB Problem ist es wohl in sofern, weil andere Compiler (z.B. Visual C++) keine Probleme mit der einfachen Definition haben. ...Dafür haben sie andere MackenWo ichs grad sehen, das hat der Builder mit Sicherheit auch nicht... Klar wirst du zur Laufzeit einen Stack overflow bekommen bei einer Array der Größe von 47MB, aber da kann man die Stackgröße ja ändern (normalerweise 1MB glaub ich).