dynamisches zweidimensionals array
-
Mit folgenden Code erzeuge ich ein zweidimensionales Array. Dabei ist Max_S einen Konstante und AnzahlZeilen eine Variable. Ich möchte aber dieses Array mit zwei Variablen AnzahlZeilen und AnzahlSpalten erzeugen. Wenn ich Max_S durch die Variable AnzahlSpalten ersetze, erhalte ich lauter Fehlermeldungen.
Ich benutze Visual C++6 und schreibe eine Win32-Konsolenanwendung.double (*testarray) [Max_S] = new double [AnzahlZeilen][Max_S];
delete [] testarray;Vielen Dank für die Hilfe
-
mit double (*testarray) [Max_S], erzeugst du ja einen Array. Du musst in C wenn du einen Array erzeugst beim compilieren festlegen, wie groß dieser ist. Darum nimmt er zwar die Konstante, aber keine Variable. Du musst einen Zeiger erstellen und diesem dann einen Zeigerarray zuweisen.
int xSize; int ySize; double** tArray = NULL; tArray = new double*[xSize]; // jetzt jedem Element einen zuweisen!! for (int i=0;i<xSize;i++) tArray[i] = new double[ySize];habs jetzt nicht getestet aber so ungefähr müsste das funktioneren.
-
@GeorgeHomes
Wollen wir hier nicht die MFC verwenden?typedef CArray<double> arDouble; CArray<arDouble> ar_in_X; ar_in_X.SetSize( AnzahlSpalten); for( int i=0; i<ar.GetCount(); i++) ar_in_X[i].SetSize( AnzahlZeilen); // ab hier kannst Du in gewohnter [][]-Schreibweise auf die Elemente zugreifen // delete[] ...; ist NICHT notwendig
-
@RenéG: Dann musst du aber auch die einzelnen Arrays irgendwie miteinander synchronisieren oder auf einer statischen Größe halten. Sonst könnte es ja (wenn man nicht aufpasst) passieren, dass z.B. Spalte 1 mehr Zeilen hat als Spalte 2. Ich würde das ganze in eine eigene Klasse einbinden.
template<class TYPE, class ARG_TYPE> class CMatrix : public CArray<class TYPE, class ARG_TYPE> { CMatrix(const int cx, const int cy) { SetSize(cx); for(int i = 0; i < cx; ++i) GetAt(i).SetSize(cy); } virtual ~CMatrix() {} ARG_TYPE GetAt(const int x, const int y) { // Hier eventuell noch abprüfen, ob zugegriffen werden darf return GetAt(x)[y]; } void SetAt(const int x, const int y, ARG_TYPE t) { // Hier eventuell noch abprüfen, ob zugegriffen werden darf return GetAt(x).SetAt(y, t); } };Naja, so in der Art irgendwie!
[ Dieser Beitrag wurde am 16.06.2003 um 08:50 Uhr von MaSTaH editiert. ]
-
Ich möchte lieber die Version von GeorgeHomes (also keine MFC) verwenden.
Wie gebe ich dann das Array wieder frei?
Vielleicht so: delete [] tArray;
-
Wieso postest Du dann erst bei MFC, wenn Du sie gar nicht verwenden willst?
-
Original erstellt von <ross>:
Wie gebe ich dann das Array wieder frei?Genau anders herum wie du es aufgebaut hast...
for(int i=0;i<xSize;++i) delete[] tArray[i]; delete[] tArray;
-
@ReneG
Hast ja recht. Eigentlich ja dämlich das Rad neu zu erfinden, wenn man eh schon mit einer Kapselung wie der MFC Arbeitet. Ich bin halt der typische "Low-Level" Mensch. Irgendwie macht es mir einen tierischen spaß, das Rad neu zu erfinden;).