Seite 1 von 2

relativ dynamischer Array

Verfasst: 23. September 2006 13:28
von webmaster1987
Ich wollte einen Array Dynamisch gestallten jedoch scheind das nicht so einfach zu sein :roll: ist nur ein ausschnitt der vorher funktionierte.
Folgender Code funktioniert nicht:

Code: Alles auswählen

....
	int WuerfelCount = 5;
	GWuerfel* Wuerfel[WuerfelCount];
	for(int i=;i<WuerfelCount;i++){
		Wuerfel[i] = new GWuerfel(1,6);
		hboxLayout->addWidget(Wuerfel[i]);
		QObject::connect(Werfer, SIGNAL(clicked()), Wuerfel[i], SLOT(Werfen()));
	}
....
Was mache ich Falsch?

Verfasst: 23. September 2006 13:43
von Christian81
was soll das denn sein:

Code: Alles auswählen

GWuerfel* Wuerfel[WuerfelCount]; 

Verfasst: 23. September 2006 14:49
von webmaster1987
das wollt ich von euch hören :D

das ganze würde man sonst ja so schreiben
GWuerfel* Wuerfel[5];
nur ich würde das gerne dynamisch gestallten und wenn ich gerade dabei bin ist es möglich arrays zu erstellen die keine obergrenze haben so wie in php :?:

Verfasst: 23. September 2006 15:02
von tachyon
Ich weiß zwar nach wie vor nicht, was Deine Codezeilen bezwecken sollen, aber trotzdem solltest Du Dir mal die Containerklassen von Qt oder aus der STL angucken. (QVector, QList etc. bzw. vector, list etc. für die STL Varianten).

Verfasst: 23. September 2006 17:00
von webmaster1987
ich wollte aus konfigurationtechnichengründen eine variable als zähler und megenanzahl für den array nehmen

Verfasst: 29. September 2006 08:58
von Adi

Code: Alles auswählen

GWuerfel* Wuerfel[WuerfelCount]; 
Hast du früher in Visual Basic programmiert :wink: ?
Man kann leider keinen dynamischen Array-Bereich implementieren.

Man kann allerhöchstens

Code: Alles auswählen

#define WUERFELCOUNT 5

GWuerfel* Wuerfel[WUERFELCOUNT];
Ansonsten gibt es von QT bereits eine Klasse für Array-Funktion.

Verfasst: 29. September 2006 13:39
von isifloh
hi

naja ich glaub da liegt ein kleiner tip fehler vor
ein dynamsiches array in C++ (also pur one Qt geht schon).
nur musst du es mit new machen.

statt
int WuerfelCount = 5;
GWuerfel* Wuerfel[WuerfelCount];

also
int WuerfelCount = 5;
GWuerfel** Wuerfel;
Wuerfel = new GWuerfel*[WuerfelCount];

damit solltest du ein dynamisches array von zeigern bekommen.

nur wers nicht einfach z.b.
QVector<GWuerfel* > zu benutzen ?

denn ein qvector is ja auch dynamisch.

mfg

Verfasst: 29. September 2006 18:11
von webmaster1987
vielen dank :P

ich würde allerdings noch gerne verstehen was dort passiert

GWuerfel** Wuerfel;

Zeiger auf einen Zeiger warum ist das nötig bzw was passiert an dieser stelle

Wuerfel = new GWuerfel*[WuerfelCount];

warum wird die anzahl der elemente mit einem * verbunden ist das in diesem fall wieder ein zeiger?

Verfasst: 29. September 2006 19:17
von tachyon
Der new-Operator liefert Dir einen Zeiger auf den Anfang Deines Arrays (oder genau genommen auf den Anfang eines Speicherbereiches den Du mit new anforderst). Da Du in deinem Array Zeiger speichern willst, muss der Variablentyp in dem Du den Anfangspunkt Deines Arrays speicherst also vom Typ Zeiger auf Zeiger sein (Du willst ja auf den Anfangsbereich eines Speicherbereiches zeigen, der Zeiger enthält).
Wichtig ist dabei noch zu wissen, daß Du angeforderten Speicher auch selbst wieder freigeben musst. Das geht mit dem delete-Oprator

also in etwa so:

Code: Alles auswählen

GWuerfel** Wuerfel;
Wuerfel = new GWuerfel*[count]

/* auf dem Array rumrödeln */

delete [] Wuerfel; 
Wenn Du allerdings nicht mit dem Umgang von dynamischem Speicher unter C/C++ vertraut bist, solltest Du Dir evtl. noch ein paar Tutorials dazu ansehen. Falscher Umgang hiermit ist einer der häufigsten Fehlerursachen (Speicherlecks oder hängende Zeiger).
Einfacher (und sicherer und objektorientierter :D) ist es auf jeden Fall QVector von Qt oder vector aus der Standard Template Library (ist bei jedem modernen C++ Compiler dabei und über #include <vector> einzubinden) zu benutzen.

Verfasst: 29. September 2006 19:19
von tachyon
Edit:
Ups, da habe ich mich ausversehen selbst zitiert, anstatt zu editieren. Bitte löschen.

Verfasst: 30. September 2006 09:12
von webmaster1987
okay oweit verstanden nur das mit dem speicher freigeben
muss das delete zwangsläufig vor dem beenden des programms ausgeführt werden oder werden beim beenden alle reservierten speicher freigegeben?

Verfasst: 30. September 2006 09:31
von Adi
tachyon hat geschrieben:,,,Wichtig ist dabei noch zu wissen, daß Du angeforderten Speicher auch selbst wieder freigeben musst. Das geht mit dem delete-Oprator....
Es kann(?) durchaus passieren, das Speicher-Platz verloren gehen, da nicht mehr mit delete freigegebnen wurde (Man spricht dan von Memory-Leak). Es immer besser die Objekte, die man mit new erzeugt hat wieder zu löschen. Am besten machst du das im Destruktor (Ich hoffe, du programmierst Objektorientiert :wink: )

Verfasst: 30. September 2006 10:22
von webmaster1987
sicher doch :D

wir machen das ganze in der schule aber ich wollte noch ein paar mehr Informationen. Wenn ich Objete statisch anlege muss ich sie nicht deleten oder? Un wie ist das mit dem destruktor muss ich dort sagen
delete this;
oder wird das automatisch gemacht?

Verfasst: 30. September 2006 11:37
von Adi
Sieh Posting von tachyon. Er hat das geschrieben. :wink:

Wo du das Delete aufrufst ist egal. Optimal ist es im Destruktor, da dies Aufgerufen wird, wenn das Objekt entladet wird.

Objekte die nicht mit new erzeugt wierde, benötigen kein delete (geht also automatisch).

Aber da du das ja in der Schule hast, kann man das dir dort sicher zeigen.

Verfasst: 30. September 2006 12:27
von webmaster1987
ok so wie ich das verstanden hab sollte das so sein:

Ist das so richtig bzw. Stylistich korrekt?

oder ruft delete nur den destruktor auf?

(hab das unten ausprobiert und es funktioniert)

Code: Alles auswählen

GWuerfel::~GWuerfel() {
	delete this;
}
...
void Formular::closeEvent(QCloseEvent *event) {
	for(int i=0;i<WuerfelCount;i++) Wuerfel[i]->~GWuerfel();
	event->accept();
}
und zum Thema schule: Da wir dort nur so langsam voran kommen weil es soviele Programmier "Noobs" in der Klasse gibt. Und da ich in der schule nicht verdummen will, versuch ich selbt noch was zu lernen. Wenn man so eine frage wie die hier stellt heißt es meißt: "Da kommen wir später noch zu." nur das später irgendwie nie eintritt -.-