Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

C++ Arraygrösse mit variablen bestimmen

Yves3 / 7 Antworten / Baumansicht Nickles

hallo ich möchte ein dreidimensionales array als element einer klasse verwenden.
die grösse der ersten beiden dimensionen wird im konstruktor aus einer textdatei ausgelesen.
also irgendwie so etwas:

CTileMap::CTileMap()
{
//MapWidth und MapHeight aus Textdatei auslesen
...
Array[MapWidth][MapHeight][10]
...
}

hab schon ein bisschen gegoogelt und herausgefunden, dass es wohl schwieriger ist als ich zu beginn dachte.
ist das möglich ohne die vector klasse aus der std zu verwenden oder eine eigene klasse dafür zu schreiben?

was haltet ihr für die beste variante?

vielen dank für alle antworten!

bei Antwort benachrichtigen
DaWoo Yves3 „C++ Arraygrösse mit variablen bestimmen“
Optionen

Arrygrößen zu Laufzeit... new Operator?

bei Antwort benachrichtigen
Yves3 DaWoo „Arrygrößen zu Laufzeit... new Operator?“
Optionen

geht leider nicht mit variablen
error C2540: Kein konstanter Ausdruck als Feldgrenze

bei Antwort benachrichtigen
mr.escape Yves3 „C++ Arraygrösse mit variablen bestimmen“
Optionen
#define VARTYPE int//oder was auch immer
class CTileMap {
  VARTYPE ***Array, **Array0, *Array00;
...
};

CTileMap::CTileMap(){
  //MapWidth und MapHeight aus Textdatei auslesen
  ...
  //Array[MapWidth][MapHeight][10]
  Array00=new VARTYPE[MapWidth*MapHeight*10];
  Array0=new VARTYPE*[MapWidth*MapHeight];
  Array=new VARTYPE**[MapWidth];
  for(int i=0;i
MapWidth*MapHeight;i++)
    Array0[i]=Array00[i*10];
  for(int i=0;i<MapWidth;i++)
    Array[i]=Array0[i*MapHeight];
...
}

CTileMap::~CTileMap(){
  if(Array00)
    delete[] Array00;
  if(Array0)
    delete[] Array0;
  if(Array)
    delete[] Array;
  Array00=NULL;
  Array0=NULL;
  Array=NULL;
}


MapWidth und MapHeight bzw. die textdatei, in der diese informationen stecken, müssen vor dem aufruf des konstruktors gesetzt und/oder bekannt sein.

mr.escape
"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
Yves3 mr.escape „ define VARTYPE int//oder was auch immer class CTileMap VARTYPE Array, Array0,...“
Optionen

jetz hab ich nach langem den code entlich begriffen. :-)

sollte das nicht so sein?

for(int i=0; i Array0[i]= &Array00[i*10];
for(i=0;i Array[i]= &Array0[i*m_MapWidth];

bei mir gibt es nämlich ohne das "&" einen fehler.

wenn ich jetzt aber testweise mal fogendes versuche...

Array[1][2][3] = "a";
MessageBox(NULL,&Array[1][2][3],"Test sollte A stehen",MB_OK);

...erhalte ich die fehlermeldung "error C2440: '=' : 'char [2]' kann nicht in 'char' konvertiert werden":

könnte das wieder an so einem doofen steuerzeichen liegen?

ich danke dir für deine hilfe!

gruss yves

bei Antwort benachrichtigen
Yves3 Nachtrag zu: „jetz hab ich nach langem den code entlich begriffen. :- sollte das nicht so...“
Optionen

naja brauche eigentlich nicht char, sondern int aber es interessiert mich halt ;-)

bei Antwort benachrichtigen
mr.escape Yves3 „jetz hab ich nach langem den code entlich begriffen. :- sollte das nicht so...“
Optionen

Richtig, ohne & geht das so nicht. Habe die formen
Array0[i]= &Array00[i*10];
und
Array0[i]= Array00+i*10;
vermischt!

...erhalte ich die fehlermeldung "error C2440: '=' : 'char [2]' kann nicht in 'char' konvertiert werden":
Ein ausdruck wie "a" ist eine konstante, d.h. eine, beim compilieren/linken erzeugte, feste zeichenkette (0x61,0x00), deren inhalt und adresse konstant bleibt. Eine zuweisung in ein char-array ist nicht zulässig, es müsste schon ein strcpy() o.ä. sein.
Ist hingegen 'a' gemeint, also 0x61, dann ist das eine zahl, die bei passendem variabletyp (hier scheinbar char) als normale zuweisung erlaubt ist.

könnte das wieder an so einem doofen steuerzeichen liegen?
Wenn obere annahme richtig ist, dann tatsächlich!

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
Yves3 mr.escape „Richtig, ohne geht das so nicht. Habe die formen Array0 i Array00 i 10 und...“
Optionen

stimmt, sorry.
es muss 'a' heissen und nicht "a".
hab in letzter zeit zu viele vb tutorials gemacht ;-)

so funktioniert es.

nochmal vielen dank für deine kompetente hilfe!

bei Antwort benachrichtigen