relativ dynamischer Array

Verschiedenes zu Qt
webmaster1987
Beiträge: 73
Registriert: 2. September 2006 18:30
Wohnort: Köln
Kontaktdaten:

relativ dynamischer Array

Beitrag 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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

was soll das denn sein:

Code: Alles auswählen

GWuerfel* Wuerfel[WuerfelCount]; 
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
webmaster1987
Beiträge: 73
Registriert: 2. September 2006 18:30
Wohnort: Köln
Kontaktdaten:

Beitrag 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 :?:
tachyon
Beiträge: 29
Registriert: 22. Juli 2006 10:03

Beitrag 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).
webmaster1987
Beiträge: 73
Registriert: 2. September 2006 18:30
Wohnort: Köln
Kontaktdaten:

Beitrag von webmaster1987 »

ich wollte aus konfigurationtechnichengründen eine variable als zähler und megenanzahl für den array nehmen
Adi
Beiträge: 87
Registriert: 1. Januar 2006 14:51

Beitrag 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.
Win 2k, Win XP
QT Win Opensource 4.1.1
MinGW 3.4.2
isifloh
Beiträge: 37
Registriert: 31. August 2006 09:40

Beitrag 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
webmaster1987
Beiträge: 73
Registriert: 2. September 2006 18:30
Wohnort: Köln
Kontaktdaten:

Beitrag 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?
tachyon
Beiträge: 29
Registriert: 22. Juli 2006 10:03

Beitrag 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.
Zuletzt geändert von tachyon am 29. September 2006 19:27, insgesamt 2-mal geändert.
tachyon
Beiträge: 29
Registriert: 22. Juli 2006 10:03

Beitrag von tachyon »

Edit:
Ups, da habe ich mich ausversehen selbst zitiert, anstatt zu editieren. Bitte löschen.
webmaster1987
Beiträge: 73
Registriert: 2. September 2006 18:30
Wohnort: Köln
Kontaktdaten:

Beitrag 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?
Adi
Beiträge: 87
Registriert: 1. Januar 2006 14:51

Beitrag 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: )
Win 2k, Win XP
QT Win Opensource 4.1.1
MinGW 3.4.2
webmaster1987
Beiträge: 73
Registriert: 2. September 2006 18:30
Wohnort: Köln
Kontaktdaten:

Beitrag 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?
Adi
Beiträge: 87
Registriert: 1. Januar 2006 14:51

Beitrag 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.
Win 2k, Win XP
QT Win Opensource 4.1.1
MinGW 3.4.2
webmaster1987
Beiträge: 73
Registriert: 2. September 2006 18:30
Wohnort: Köln
Kontaktdaten:

Beitrag 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 -.-
Antworten