Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » flexibles Array mit Zeigern

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
29.10.2005, 16:28 Uhr
A-l-e-x



Also ich hab da ein paar Probleme mit einem flexiblem Array aus Zeigern. Ich will das einige dieser Zeiger auf eine Strucktur zeigen und manche auf nichts (also NULL).


C++:
// Strucktur
struct TESTSTRUCT
{
    int x;
    int y;
    int z;
};

// Array erzeugen
TESTSTRUCT test*** = new TESTSTRUCT[50];

for(int i=0; i<50; i++)
    test[i] = new TESTSTRUCT[60];

// teilweise mit Daten füllen
for(int x=0; x<50; x++)
{
    for(int y=0; y<60; y++)
    {
        if(x%4==0 && y%6==0)    // nur ein Beispiel
        {
            test[x][y] = new TESTSTRUCT[1]; // ist das hier richtig?

            test[x][y][0].x = x;
            test[x][y][0].y = y;
            test[x][y][0].z = x+y;
        }
        else
            test[x][y] = NULL;
    }
}

// verschieben
// kann man das so machen?!
test[4+1][6] = test[4][6];
test[4][6] = NULL;

// löschen
for(int x=0; x<50; x++)
{
    for(int y=0; y<60; y++)
    {
        if(test[x][y] != NULL)
            delete[] test[x][y];
    }
}

for(int i=0; i<50; i++)
    delete[] test[i];

delete[] test;



So jetzt meine Frage: Ist das was ich da gemacht habe richtig so oder sind da Fehler drin?

mfg A-l-e-x
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.10.2005, 18:52 Uhr
(un)wissender
Niveauwart


nimm std::vector<std::vector<std::vector<TESTSTRUCT> > >


Bearbeitung:

Na ja gut, trotzdem hier mal ein Beispiel wie es geht.

C++:

// Strucktur
struct TESTSTRUCT
{
    int x;
    int y;
    int z;
};

int main()
{
    const unsigned FIRST_DIM = 50, SECOND_DIM = 50, THIRD_DIM = 50;
    
    //erstellen
    TESTSTRUCT *** test= new TESTSTRUCT**[FIRST_DIM];
    for(unsigned i = 0; i < FIRST_DIM; ++i)
    {
        test[i] =  new TESTSTRUCT*[SECOND_DIM];
        for(unsigned j = 0; j < SECOND_DIM; ++j)  
        {
            test[i][j] =  new TESTSTRUCT[THIRD_DIM];  
        }    
    }
    
    //nutzen
    test[0][1][1].x = 1;
    test[0][1][1].y = 2;
    test[0][1][1].z = 3;
    
    //löschen  
    for(unsigned i = 0; i < FIRST_DIM; ++i)
    {
        for(unsigned j = 0; j < SECOND_DIM; ++j)  
        {
            delete [] test[i][j];  
        }
        
         delete []  test[i];  
    }
    delete [] test;  
}




--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 29.10.2005 um 19:03 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.10.2005, 16:30 Uhr
0xdeadbeef
Gott
(Operator)


Ich würde an der Stelle auf boost zurückgreifen, speziell boost.multi_array:

C++:
#include <boost/multi_array.hpp>

// ...

boost::multi_array<TESTSTRUCT*, 2> test(boost::extents[FIRST_DIM][SECOND_DIM]);


Damit löscht sich zumindest das Array selbstständig, wenn es aus dem scope gerät. Um die darin gespeicherten Zeiger musst du dich allerdings selbst kümmern.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
30.10.2005, 18:24 Uhr
(un)wissender
Niveauwart


Was bietet das für einen Vorteil gegenüber von std::vector?
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.11.2005, 14:38 Uhr
typecast
aka loddab
(Operator)



Zitat von 0xdeadbeef:

Damit löscht sich zumindest das Array selbstständig, wenn es aus dem scope gerät. Um die darin gespeicherten Zeiger musst du dich allerdings selbst kümmern.



Koennte man das nicht vermeiden, in dem man (wenn man schon boost verwendet) nen boost:smart_pointer nimmt?
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)

Dieser Post wurde am 01.11.2005 um 14:38 Uhr von typecast editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
01.11.2005, 15:06 Uhr
(un)wissender
Niveauwart


nee der kann delete [] nicht.
--
Wer früher stirbt ist länger tot.
 
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: