Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » multidimensional class arrays

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
28.07.2005, 13:25 Uhr
dedalus



Deklaration in Klasse CWorld

Code:
CTerrain (**mTerrain);


Methodenaufruf in CWorld::createTerrain()

Code:
mTerrain = new CTerrain*[10];
for(short x = 0; x < 10; ++x) { mTerrain[x] = new CTerrain[10]; }

mTerrain[0][1] = new CTerrain();   // Ganz klar, ein Fehler
mTerrain[0][1].setHeight(1);       // Fehler!


Mir scheint, [0][1] ist leer, daher die Zugriffsverletzung, aber wie soll ich es dann füllen? Oder übersehe ich etwas und sollte man 'ne Nacht drüber schlafen? Soweit nämlich alles in Ordnung, auch die beiden Klassenstrukturen, denn gehe ich wiefolgt vor:


Code:
mTerrain = new CTerrain*[10];
for(short x = 0; x < 10; ++x) { mTerrain[x] = new CTerrain; }

mTerrain[1].setHeight(1);


habe ich keine Fehler.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.07.2005, 13:38 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


lass das


C++:
mTerrain[0][1] = new CTerrain();



weg, du weißt dem mTerrain[x] ja schon ein CTerrain[10] zu.

evtl wirds so klarer:


C++:
mTerrain = new CTerrain*[10];

for(short x = 0; x < 10; ++x)
{
  CTerrain *temp = mTerrain[x];
  temp = new CTerrain[10]; // -> 10 initialisierte objekte!
}

mTerrain[0][1].setHeight(1);



--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.07.2005, 13:40 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


wenn du etwas anderes als den defaultkonstruktor aufrufen willst bei der allokation mit new geht es nicht ein array zu allokieren...

wenn du also ein 2d-array von objekten basteln willst wäre es sinnvoll erst ein array von zeigern anzulegen von denen jeder zeiger wiedrum auf ein array von zeiger zeigt... diesen zeigern wiedrum weisst du jeweils ein einzelnes objekt mit new zu...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.07.2005, 14:03 Uhr
dedalus



Vielleicht bin ich der Hitze erschöpft oder des Schlafmangels , aber...

FloSoft: Erstmal danke. Es funktioniert jedoch nicht. Immer noch der gleiche Zugriffverletzungsfehler.
Windalf: Hm...

Deklarationen:

C++:
CTile (**mTiles); // CWorld.h
const short MAX_TILES_X = 64; // CWorld.h
const short MAX_TILES_Y = 64;
void setHeight(int height) { mHeight = height; } // CTile.h; mHeight ist private, setHeight public


Methode (Problemfunktion)

C++:
// Create tiles
    mTiles = new CTile*[MAX_TILES_X];
        
    for(short x = 0; x < MAX_TILES_X; ++x) {
        CTile *temp = mTiles[x];
        temp = new CTile[MAX_TILES_Y];
    }
    
    ...
        
    for(short x = 0; x <= MAX_TILES_X; ++x) {
        for (short y = 0; y <= MAX_TILES_Y; ++y) {            
            mTiles[x][y].setHeight( 1 ); // FEHLER, zeigt aber auf Zugriffsverletzung in der Methode CTile::setHeight
            ...
        }
    }

Dieser Post wurde am 28.07.2005 um 14:04 Uhr von dedalus editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
28.07.2005, 14:27 Uhr
dedalus



Da mir die beiden Konstanten ...X und ...Y vorher bekannt sind, allokiere ich nun entsprechend viel Speicher in der Deklaration:

C++:
CTile *mTiles[MAX_TILES_X][MAX_TILES_Y];


Dadurch verändertes Methodenfragment, das auch funktioniert:

C++:
...
     for(short x = 0; x <= MAX_TILES_X; ++x) {
        for (short y = 0; y <= MAX_TILES_Y; ++y) {            
            mTiles[x][y] = new CTile;
            mTiles[x][y]->setHeight( 1 );
            ...
        }


Alleeerdings wüsste ich gern, was der Fehler nun war oder ist.

Dieser Post wurde am 28.07.2005 um 14:28 Uhr von dedalus editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
28.07.2005, 15:06 Uhr
Airdamn



schonmal Deine Schleifen angeguckt?

C++:
for(short x = 0; x <= MAX_TILES_X; ++x) // lieber x < MAX_TILES_X
{
     for (short y = 0; y <= MAX_TILES_Y; ++y) // lieber y < MAX_TILES_Y
    {            
          mTiles[x][y] = new CTile;
          mTiles[x][y]->setHeight( 1 );
          ...
    }
}


Dieser Post wurde am 28.07.2005 um 15:09 Uhr von Airdamn editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: