[C++] Array als Membervariable, wie direkt mit festen Werten Initialisieren?

G

Green Mamba

Gast
Moin,

ich hab hier folgendes Problem, und zwar habe ich ein sehr großes zweidimensionales Array mit vorgegebenen Werten. Dieses Array wird in der Headerdatei meinetwegen folgendermaßen deklariert:
Code:
int m_triTable [256] [16];
Jetzt soll das Array im Konstruktor der Klasse mit festen Werten gefüllt werden, die sich nicht mit Hilfe einer Rechenvorschrift erstellen lassen. Also möchte ich das Array in der Klasse mit den Werten initialisieren in der Art:
Code:
m_triTable = {
  {
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
  },
  {
    0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
  },
  ....

Genau da gibts dann einen Compilerfehler der Art:
"IsoSurface.cpp": src/mappingproc/IsoSurface.cpp error: syntax error before `{' token in Zeile 803
Zeile 308 ist dann die: m_triTable = {

Wenn ich das Array in der Klasse selbst deklariere, und die Werte sofort zuweise gehts, aber wenn das Array im Header deklariert wird, kann ich es in der Klasse nicht später im Konstruktor mit den Werten initialisieren.
Wie kann ich sowas in der Art trotzdem realisieren?

Gruß
Timo
 
Zuletzt bearbeitet:
Schreibe im Header:
Code:
int m_triTable**;

So wird noch kein Speicher reserviert. Erst wenn du die Klammerorgie startest wird Speicher für das 2D-Array reserviert, und zwar genau soviel wie du "klammerst" :).

Außerdem würde ich schreiben
Code:
m_triTable = {
  {  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1  },
  {   0,  8,  3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1  },
  ....};
Sonst brauchst du ja die dreifache Zeilenanzahl. Außerdem ist es übersichtlicher.
 
Shit, das geht genausowenig. Ich habe es jetzt mit
Code:
int** m_triTable;
im Header versucht. :(

Das mit der Zeilenzahl hab ich dummerweise verratzt, habe das Ding mal automatisch mit dem C++-BuilderX formatieren lassen, und der hat das dann so gemacht. Jetzt kann ich es nicht mehr zurückformatieren, und von Hand is mir das zuviel arbeit. :rolleyes:
 
Zuletzt bearbeitet:
Merde!!
Latürnich muss es: int** triTable; heißen. Du hast es aber auch nicht gleich gemerkt :D.

Das "delete" gepfriemel für das Array nicht vergessen!

Das hatten wir doch schon mal :rolleyes:.
Daraufhin hast du geschrieben: "Machte ich instinktiv."
 
Na na, das delete würd ich aber lassen ;) Das Array, worauf triTable zeigt, ist statisch! Man darf es SO also auch auf keinen Fall ändern. Erst wenn man es kopiert, und somit Speicher anfordern muss, darf man auch ein delete darauf machen.
 
Versuch mal das hier:


Klasse::Klasse ()
: m_triTable ({
{ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
{ 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
....})
{
// irgendwas anderes noch machen
}


Aber keine Ahnung, ob das tut (ich zweifel ehrlich gesagt), hab keinen Compiler zur Hand. Der Grund ist folgender, so eine Initialisierung des Arrays darf nur bei seiner Erzeugung passieren. Wenn Du aber im Konstruktor m_triTable = ... schreibst, gibt's das Array ja schon, deshalb geht das net mehr. Aber wie gesagt, net vergessen, dass Du das Array mit einem Literal initialisierst, dass Du weder verändern noch löschen darfst.

Ich glaube, Du musst dafür bei der Definition des Arrays auch seine Dimensionen angeben. Also müsste zumindest dafür wieder Deine alte Schreibweise her.


Edit:
Hmm das mit dem Literal zieh ich zurück, wenn Du beim Array die Dimensionen angibst, da es dann ja eigentlich seinen eigenen Speicher haben sollte. :)
 
Zuletzt bearbeitet:
7H3 N4C3R:
PHP:
Klasse::Klasse(int **triTable) {
  memcpy(m_triTable,triTable,256*16*sizeof(int));
}

void somefunction() {
  int **myTable = {......};
  Klasse obj(myTable);
}

-----

Green Mamba:
Was spricht dagegen, im Constructor selbst nochmal eine lokale Variable mit der neuen Tabelle zu erstellen und dann die Tabelle rüberzukopieren?
PHP:
Klasse::Klasse() {
  int **newTable = {{-1,-1,....},....};
  memcpy(m_triTable,newTable,256*16*sizeof(int));
}
 
Danke für die Hilfe, so weiß ich es für´s nächste mal. Also gar nicht so einfach der Sachverhalt. Ich habe es jetzt so gelöst, dass ich die Werte einfach aus einer Datei schnell einlese. :)
 

Ähnliche Themen

Zurück
Oben