Seite 1 von 1

dynamisches array

Verfasst: 9. September 2007 21:23
von mollitz
hallo,

ich hab eine frage zu c++/standardprogrammierung. und zwar will ich in eine anwendung eine tabelle reinmachen mit den variablen maßen zwischen 5x5 und 9x9. da ist alles erlaubt dazwischen.
jetzt will ich jedes feld mit einem int wert "füllen". also brauche ich ein array. jedoch können arrays nicht dynamisch erstellt werden. die werte müssen bei der kompilierung schon klar sein. wie kann ich das jetzt lösen?
wie ich die tabelle "graphisch" erstelle weiss ich schon.

danke, moritz

Verfasst: 9. September 2007 21:59
von Andy
Wenn die Größe zur Compilezeit schon klar sind, kannst du die Array-Größe über ein
define festlegen:

#define ARRAY_SIZE 5
...
int array[ARRAY_SIZE];


oder alternativ, mit echter dynamischer Größe, kannst du dir mal vector aus der STL anschauen. (http://www.cplusplus.com/reference/stl/)

Verfasst: 10. September 2007 00:46
von slash-ex
das sind grundlagen!

vergiss das obere beispiel; beschäftige dich mal mit new und delete! wenn du sowas wie dynamische arrays erstellen willst.

int *var = new int[dim];
damit kannst du speicher allokieren (dim*int) und mit delete [] var löscht dus wieder.
ansonsten wären verkettete listen und {oder} dieQList <Template> ne möglichkeit, diese ist wohl selber eine verk. liste.

Verfasst: 10. September 2007 12:43
von Sephral
Hallo,

die Lösung hängt schwer davon ab, was du am Ende mit den Daten anstellen willst und welche/wieviele Daten du pro Element speichern willst.

Wenn du eine Anzeige in Tabellenform (oder als Tree) planst, wäre es vielleicht am einfachsten, wenn du Deine Datenbasis direkt als Model schreibst (QAbstractItemModel). Dann könntest du mit einem Aufwasch auch gleich Icons, Tooltips, Schriftare/Farbe und ggf. Auswertungen der Daten unterbringen (z.B. Schriftfarbe, abhängig vom Wert des Feldes). Das Model könntest du dann auch gleich mit Delegates editieren über die GUI...

Wenn es einfach nur um Strings geht, die nicht in einem View angezeigt werden sollen, kann auch schon soetwas helfen (Vorsicht beim Zugriff *g*):

Code: Alles auswählen

QHash<QString, QStringList>>
Du kannst auch soetwas verwegenes machen :-) :

Code: Alles auswählen

QHash<QString, int> list;

// Füllen der Liste

// Koordinaten für Zugriff
QString x = "1";
QString y = "2";

int myValue = list.value(x+y);
Möglichkeiten gibts genug, du musst entscheiden was für Dich das Beste ist.


Ciao,
Sephral

Verfasst: 10. September 2007 14:32
von mollitz
slash-ex hat geschrieben:das sind grundlagen!

vergiss das obere beispiel; beschäftige dich mal mit new und delete! wenn du sowas wie dynamische arrays erstellen willst.

int *var = new int[dim];
damit kannst du speicher allokieren (dim*int) und mit delete [] var löscht dus wieder.
ansonsten wären verkettete listen und {oder} dieQList <Template> ne möglichkeit, diese ist wohl selber eine verk. liste.
und dim muss nich zur kompilierung schon klar sein ?
das wär gut, danke!

Verfasst: 10. September 2007 17:40
von slash-ex
nein, es ist möglich mit new den speicher zu allokieren, wenn er während der betriebszeit benötigt wird.

Verfasst: 10. September 2007 18:58
von mollitz
jaja das mit new hab ich eigetnlich schon begriffen.

jetzt ist da noch das problem, dass das array 2-dimensional is, weils ja ne tabelle gibt.
jetzt hab ich das so in der headerdatei gemacht: (von ner klasse)
int **feldwert;
und so in der cpp-datei
feldwert = new int[lay_x][lay_y];
da kommt aber der fehler
src\mainwindowimpl.cpp:41: error: `MainWindowImpl::lay_y' cannot appear in a constant-expression

wie gehts richtig?
danke, moritz