Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Chase

Alter Hase

  • »Chase« ist der Autor dieses Themas

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

1

10.07.2006, 22:04

delete bei mehrdimensionalen dynamischen Arrays

Irgendwas hab ich hier nicht verstanden..
Ich benutze ein zweidimensionales Pointerarray:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
// Derived erbt von Base

Base** m_entities = new Base*[10]; //10 Base-pointer erstellen

for(short i=0;i<10;++i) m_entities[i] = NULL; //Auf NULL setzen

m_entities[0] = new Derived; // Das Array fuellen 

m_entities[1] = new Derived;  
//Jetzt soll der Inhalt eines Pointers geloescht werden:

delete m_entities[0];
m_entities[0] = NULL;

entities[1]->Test();  //Verursacht Fehler zur Laufzeit

Irgendwas stimmt hier nicht, da delete m_entities[0] nicht nur den Speicherbereich eines Objekts freigibt sondern den aller Objekte im Pointerarray. Das waere das korrekte Verhalten wenn ich delete [] geschrieben haette, aber wenn ich die Klammern weglasse sollte doch nur ein Objekt geloescht werden :?
"Have you tried turning it off and on again?"

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

2

10.07.2006, 23:09

ich weiss auch nicht, wo der Fehler ist, das funktioniert jedenfalls problemlos.

[EDIT]
ich denk ich weiss wo das Problem liegt, es liegt nicht an dem delete ;) sondern an der for. mach mal das ++i zu einem i++. ... hach ja :D
[/EDIT]

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int **pIntlist = new int*[3];
pIntlist[0] = new int;
pIntlist[1] = new int;
pIntlist[2] = new int;

*pIntlist[0] = 1;
*pIntlist[1] = 1;
*pIntlist[2] = 1;

delete pIntlist[0];
pIntlist[0] = NULL;
*pIntlist[1] = 2;
*pIntlist[2] = 2;
...


ich würd an deiner Stelle eh eindimensionale Array nutzen, siehe
https://www.spieleprogrammierer.de/phpBB2/viewtopic.php?t=5859

Chase

Alter Hase

  • »Chase« ist der Autor dieses Themas

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

3

11.07.2006, 00:49

Ok, der Fehler lag ganz woanders, ich hab in einem Konstruktor vergessen eine Texturreferenz zu erhoehen -.-

Aber ich glaube ich bin zu einem mehrdimensionalen Array gezwungen: Meine Base-Klasse ist abstrakt, daher kann ich sie schlecht instanzieren:
Base* m_entities = new Base[10]; ist also net. Ich muss schon Pointer verwenden, und da das ganze dynamisch bleiben soll ist das schon ok so ;)
"Have you tried turning it off and on again?"

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

11.07.2006, 10:10

eigentlich gilt:

statische Aufgaben -> Array
Dynamische -> list, map usw.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

5

11.07.2006, 10:16

Du kannst es trotzdem in ein eindimensionales Array pressen, wenn du das willst. Man kann aber auch map u.s.w. aus der stl verwenden.

C-/C++-Quelltext

1
2
3
4
5
6
7
int* arr = new int [Dim_x * Dim_y];

for(int x = 0; x < Dim_x; x ++)
  for(int y = 0; y < Dim_y; y++)
    arr[y*Dim_x + x] = 5; // arr auslesen

      
delete[] arr;


Es ist doch egal in welcher Dimension du es brauchst, wichtig ist nur das du genügend Platz belegt hast um jede Dimension reinzupressen.

Chase

Alter Hase

  • »Chase« ist der Autor dieses Themas

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

6

11.07.2006, 11:58

Hm, und ersetzt jetzt mal das int durch eine abstrakte Klasse? Dafuer kann man keinen Speicher reservieren..
"Have you tried turning it off and on again?"

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

7

11.07.2006, 12:28

@Chase: du benutzt kein zweidimensionales Array. Du hast nur ein Array von Zeigern. Du brauchst, soweit ich das raten kann, auch gar keine zweidimensionale Struktur.

@koschka: in einer for-Schleife macht es (gewöhnlich) gar keinen Unterschied, ob ich die Zählvariable mittel ++count oder count++ inkrementiere. Man könnte genausogut auch count += 1 schreiben. (für die Puristen unter uns: ja, es gibt Fälle, in denen das einen Unterschied machen kann ;) die sind aber eher selten)

@All: Ausserdem muss hier der Begriff dynamisch mal definiert werden. Hier gilt dynamisch in dem Sinn, dass ich vorher nicht weiss, wieviele Elemente mein Container (wie auch immer der dann aussehen soll) enthalten wird, bzw. dass sich die Anzahl zwischendrin ändern kann.

Ob ich da nun Integer, Floats oder Zeiger auf abstrakte Klassen reinwerfe ändert aber gar nichts daran, ob ich einen dynamischen oder einen statischen Container brauche. Der einzige Unterschied ist, dass ich bei abstrakten Klassen keine andere Wahl habe, als Zeiger zu speichern, weil ich eben nicht einfach Objekte dieser Klassen anlegen kann.

Wie man eine Array (im C Sinn), eine std::list einen std::vector oder sogar ein std::set von einem beliebigem Datentyp erzeugt, und wie man dann mit den Elementen umgeht, sollte jeder selbst in den Griff bekommen.

MfG,
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

8

11.07.2006, 17:40

@vorposter (name zu umständlich ^^)

Hier schon, weil er eben auch ein i=10 hat, aber nur Elemente von 0...9
Wieso dynamisch definieren? Alles was zur Laufzeit des Programmes erstellt wird, ist dynamisch. Alles andere statisch.
Desweiteren ist es natürlich ein zweidimensionales Array, was soll es den sonst sein? Du kannst ja mit a[y][x] auf ein Element zugreifen. Es ist aber einfacher alles in eine Dimension zu packen, nur das Auslesen dea a[y][x] wird etwas schwerer.

Auserdem könnte es für Puristen schon einen Unterschied zwischen ++i und i++ gehen. Das wurde aber schon diskutiert.

9

11.07.2006, 17:45

nein, koschka, das macht keinen unterschied, ob du ++i oder i++ schreibst
denn das is in diesem falle wie, wenn du ne einzelne anweisung (das isses ja auch) schreiben würdest:
++i;

das ergebnis danach is dasselbe, und das zählt bei ner forschleife
(nebenbei ist ++i besser als i++, weil da kein integer zwischengespeichert werden muss)

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

10

11.07.2006, 17:46

Bitte schaut euch doch mal die SCHLEIFE an:

C-/C++-Quelltext

1
2
Base** m_entities = new Base*[10]; //10 Base-pointer erstellen 

for(short i=0;i<10;++i) m_entities[i] = NULL; //Auf NULL setzen


Fällt was auf? :badgrin: ;)

Werbeanzeige