2D Array verständnisproblem :(
-
Hi,
ich bekomme bei meinem 2D Array wenn ich die Dimensionen wieder frei geben will einen Absturz, weiß aber nicht wieso
Hier der code:
LPDIRECT3DVERTEXBUFFER9** vb_; vb_ = new LPDIRECT3DVERTEXBUFFER9*[tiles_per_col_]; for (unsigned long i=0; i<tiles_per_col_; ++i) vb_[i] = new LPDIRECT3DVERTEXBUFFER9[tiles_per_row_]; // Fülle vb_ // ........ // Freigabe: HIER KOMMT DER FEHLER! // 2. Dimension löschen for (unsigned long i=0; i<tiles_per_row_; ++i) { for (unsigned long j=0; j<tiles_per_col_; ++j) { if (vb_[i][j] != NULL) << Da kommt der Fehler { vb_[i][j]->Release (); << bzw. hier kommt der Fehler vb_[i][j] = NULL; << oder hier kommt der Fehler } } if (vb_[i] != NULL) { delete [] vb_[i]; vb_[i] = NULL; } } // 1. Dimension löschen if (vb_ != NULL) { delete [] vb_; vb_ = NULL; }
Benutzung geht einwandfrei sowie die erstellung aber das Freigeben geht absolut nicht
bin mit meinem latein am ende
Wo liegt der Fehler?
-
[...] schrieb:
ich bekomme bei meinem 2D Array wenn ich die Dimensionen wieder frei geben will einen Absturz, weiß aber nicht wieso
du sollst halt erst die grundlagen lernen, bevor du bunte sachen machst.
wie wäre es gewesen, eine klasse für 2d-arrays zu bauen?
-
ich benutz in meinem programm nur 1x ein 2D array, deshalb lohnt sich das nicht
Weißt du denn wo der fehler liegt?
-
[...] schrieb:
ich benutz in meinem programm nur 1x ein 2D array, deshalb lohnt sich das nicht
oh doch!
du mußt dir mal vor augen halten, daß die fehlersuchzeit 20-mal so groß ist wie die reine eintippzeit. du musst alles dransetzten, einigermaßen fehlerfreien code auf anhieb zu erzeugen. und schwupps, biste erheblich effizienter, glücklicher und musst dir von mir keine vorhaltungen mehr anhören.Weißt du denn wo der fehler liegt?
nein, ich weiß gar nichts.
aber ich wüßte gerne, was die zeilevb_ = new LPDIRECT3DVERTEXBUFFER9*[tiles_per_col_]
machen soll und was sie macht.
-
[...] schrieb:
ich benutz in meinem programm nur 1x ein 2D array, deshalb lohnt sich das nicht
Stimmt, wenn du nur eins brauchst lohnt es sich wirklich nicht das ordentlich zu machen. Vor allem da du so etwas wie ein 2D Array bestimmt nie wieder brauchen wirst... und die ganze gesammelte Erfahrung obendrein auch noch vergeudet...
[...] schrieb:
Weißt du denn wo der fehler liegt?
[cpp]
for (unsigned long i=0; i<tiles_per_col_; ++i)
{
for (unsigned long j=0; j<tiles_per_row_; ++j)
{
[/cpp]
-
mehrere dinge.
1.der Fehler:
for (unsigned long i=0; i<tiles_per_row_; ++i) { for (unsigned long j=0; j<tiles_per_col_; ++j)
du verwechselst hier zeilen mit spalten!
2.deine auf null testerei isn bissl unlogisch:
if (vb_[i][j] != NULL)//wie soll das null werden, wenn new nicht fehlschlägt? { vb_[i][j]->Release (); vb_[i][j] = NULL; } } if (vb_[i] != NULL)//du dereferenzierst vorher fleissig den i teil, und nun testest du plötzlich, ob das null ist. logik? { delete [] vb_[i]; vb_[i] = NULL; }
im endeffekt wär sowas wohl besser:
for (unsigned long i=0; i<tiles_per_col_; ++i) { for (unsigned long j=0; j<tiles_per_row_; ++j) { vb_[i][j]->Release (); } delete [] vb_[i]; } delete [] vb_;
was ich hier machen würde, wäre aber sowas:
//erstellen typedef std::vector<LPDIRECT3DVERTEXBUFFER9> BufferVector; std::vector<BufferVector> vb_(BufferVector(tiles_per_row_),tiles_per_col_); //löschen for (unsigned long i=0; i<tiles_per_col_; ++i){ for (unsigned long j=0; j<tiles_per_row_; ++j){ vb_[i][j]->Release(); } }
-
otze schrieb:
im endeffekt wär sowas wohl besser:
for (unsigned long i=0; i<tiles_per_col_; ++i) { for (unsigned long j=0; j<tiles_per_row_; ++j) { vb_[i][j]->Release (); } delete [] vb_[i]; } delete [] vb_;
und im versuch, fehler zu vermeiden, nehmen wir auch mal lustige bezeichner
for (unsigned long col=0; col<tiles_per_col_; ++col) { for (unsigned long row=0; row<tiles_per_row_; ++row) { vb_[col][row]->Release (); } delete [] vb_[col]; } delete [] vb_;
-
volkard schrieb:
ich hänge übrigens immernoch an
vb_ = new LPDIRECT3DVERTEXBUFFER9*[tiles_per_col_]
Was genau meinst du?
// LPDIRECT3DVERTEXBUFFER9 sieht aus wie typedef whatever* LPDIRECT3DVERTEXBUFFER9;
-
um genauer zu sein, ist es ein typedef auf IDirect3DVertexBuffer9*
aber volkard hat wohl(woran auch immer es gehangen hat) grad selbst gemerkt, was sache war.
-
@volkard
Den code den du gepostet hast funltioniert trotzdem nichtes kommt immer der selbe fehler