QVector dynamisch initialisiert zugriff verweigert
QVector dynamisch initialisiert zugriff verweigert
Hallo hab ein keines Problem:
Hab nen QVector volgendermaßen Initalisiert:
InterSec = new QVector<Coord>;
Coord Pos;
Pos.x = x;
Pos.y = y;
InterSec->push_back(Pos);
Jetzt möcht ich auf die x bzw. y. Elemente zugreifen, weiß aber nicht wie da der Compeiler mir bei beider Versionen "->" und "." nen Fehler ausgiebt.
Hab nen QVector volgendermaßen Initalisiert:
InterSec = new QVector<Coord>;
Coord Pos;
Pos.x = x;
Pos.y = y;
InterSec->push_back(Pos);
Jetzt möcht ich auf die x bzw. y. Elemente zugreifen, weiß aber nicht wie da der Compeiler mir bei beider Versionen "->" und "." nen Fehler ausgiebt.
Re: QVector dynamisch initialisiert zugriff verweigert
Naja.... Compiler sind kompliziert. Da läuft erst ein Präprozessor drüber, dann wird geparst+gelext. Da kann überall was schief gehen.schwenk hat geschrieben:weiß aber nicht wie da der Compeiler mir bei beider Versionen "->" und "." nen Fehler ausgiebt.
Wenn du wissen willst, wie das mit dem Fehler finden und Ausgeben genau funktioniert, musst du dich tiefer mit Compilerbau beschäftigen...
Re: QVector dynamisch initialisiert zugriff verweigert
Ich will doch nur wissen wie ich auf die Elemente zugreifen kann xD
Re: QVector dynamisch initialisiert zugriff verweigert
InterSec->at(0).x
bzw.
InterSec->at(0).y
oder auch
(*InterSec)[0].x/y <-- da bin ich mir mit der Operator Reihenfolge nicht sicher, evtl. werden die Klammern nicht gebraucht.
Einen QVector per new auf dem Heap zu erzeugen ist übrigens nur nötig, wenn Du Dir ganz sicher bist, dass Du das willst!
Btw. wenn Dir der "Compeiler" Fehler ausgibt und Du wissen möchtest, wie Du sie beheben kannst, ist es in einem Forum (nicht nur diesem) immer hilfreich die Fehlermeldung zu posten. Richtig toll ist es dann auch noch, wenn Du den genauen Code, der den Fehler verursacht, postest und nicht nur sagst "so und so geht es nicht...".
bzw.
InterSec->at(0).y
oder auch
(*InterSec)[0].x/y <-- da bin ich mir mit der Operator Reihenfolge nicht sicher, evtl. werden die Klammern nicht gebraucht.
Einen QVector per new auf dem Heap zu erzeugen ist übrigens nur nötig, wenn Du Dir ganz sicher bist, dass Du das willst!
Btw. wenn Dir der "Compeiler" Fehler ausgibt und Du wissen möchtest, wie Du sie beheben kannst, ist es in einem Forum (nicht nur diesem) immer hilfreich die Fehlermeldung zu posten. Richtig toll ist es dann auch noch, wenn Du den genauen Code, der den Fehler verursacht, postest und nicht nur sagst "so und so geht es nicht...".
Re: QVector dynamisch initialisiert zugriff verweigert
Sagen wir besser: in 90% der Faelle ist es sinnlos, oder "zweifelhaftes" design ...Einen QVector per new auf dem Heap zu erzeugen ist übrigens nur nötig, wenn Du Dir ganz sicher bist, dass Du das willst!
der vector selber legt im Context nur verwaltungsdaten an, das ist nicht sooo viel mehr wie nen zeiger ...
seine beinhaltenden daten pusht er eh aufn heap ...
Gründe warum man nen container aufn Heap schieben wollte:
- lifecycle Problem
- Pimpeln (abhaengigkeiten vermeiden) von der beinhaltenden Klasse (so dass die forwarden kannst).
dann wuerd ich zumindest nen smartpointer verwenden
oder besser, ne warapper klasse drumrum (was aber zuviel aufwand sein koennte ...naja, je nachdem was da noch hindeligieren kanns).
wenn unbedingt den [] operator brauchst, solltest das auch so schreiben koennen
InterSec->operator[](0).x
alternativ kannst auch ne referenz fix ziehen und mit der normalen syntax arbeiten ...
QVector<Coord> & rInterSec = *Intersec; // wichtig, checken ob Intersec wirklich nen gueltiger zeiger auf nen Vector ist ....
rIntersec[0].y
besser aber die (sicherere) at funktion verwenden ....
Re: QVector dynamisch initialisiert zugriff verweigert
Ja, das stimmt natürlich aber da fand ich das dereferenzieren des Zeigers doch etwas handlicher.RHBaum hat geschrieben: wenn unbedingt den [] operator brauchst, solltest das auch so schreiben koennen
InterSec->operator[](0).x
Re: QVector dynamisch initialisiert zugriff verweigert
Danke schomal vielmals.
Jetzt hab ich noch ein anderes kleines problem wenn ich:
InterSec->push_back(InterSection(Pos,alpha,i));
"mache" gibts zwar keine Compilerfeheler dafür stürtzt das laufende Programm ab . Jemand ne ahnung warum ?
Der Debugger gibt einen Segmentation Fault aus.
Jetzt hab ich noch ein anderes kleines problem wenn ich:
InterSec->push_back(InterSection(Pos,alpha,i));
"mache" gibts zwar keine Compilerfeheler dafür stürtzt das laufende Programm ab . Jemand ne ahnung warum ?
Der Debugger gibt einen Segmentation Fault aus.
Re: QVector dynamisch initialisiert zugriff verweigert
Warum legst du den Vector weiterhin als Zeiger an? Hast du nicht verstanden, was man dir sagen wollte?
Und der Debugger sagt dir nicht, dass es einen SegFault gegeben hat, das macht die runtime. Der Debugger sollte dir nen Backtrace geben.
Im Qt-Creator ist das unten der Tab "Stack", da siehst du die Aufrufe, die zum SegFault geführt haben.
Wenn du damit nicht klar kommst, reduzier dein Programm auf ein Minimum, sodass wir es kompilieren könnenund der SegFault entsteht.
Und der Debugger sagt dir nicht, dass es einen SegFault gegeben hat, das macht die runtime. Der Debugger sollte dir nen Backtrace geben.
Im Qt-Creator ist das unten der Tab "Stack", da siehst du die Aufrufe, die zum SegFault geführt haben.
Wenn du damit nicht klar kommst, reduzier dein Programm auf ein Minimum, sodass wir es kompilieren könnenund der SegFault entsteht.
Re: QVector dynamisch initialisiert zugriff verweigert
Also habs jetzt wie vorgeschlagen gamacht :
Trotzdem stürtzt das Programm an der Stelle immer ab.
Code: Alles auswählen
QVector<Coord> InterSec;
Code: Alles auswählen
for(int i = 0; i < _Daten.getSize(); i++)
{
InterSec.push_back(this->InterSection(Pos,alpha,i));
}
Re: QVector dynamisch initialisiert zugriff verweigert
Zu wenig Info...
InterSection() ist ne Funktion? Vllt. passiert der SegFault da drinnen?
InterSection() ist ne Funktion? Vllt. passiert der SegFault da drinnen?
Re: QVector dynamisch initialisiert zugriff verweigert
Ne hab ich schon ausgetestet indem ich einfach ein Struct übergeben hab der Segfault passiert genau an der stelle.
Re: QVector dynamisch initialisiert zugriff verweigert
Da stoppt der Debugger:
Code: Alles auswählen
{ // private inheritance as we must not access QVectorData member thought QVectorTypedData
// as this would break strict aliasing rules. (in the case of shared_null)
T array[1];
--> static inline void free(QVectorTypedData<T> *x, int alignment) { QVectorData::free(static_cast<QVectorData *>(x), alignment); }
};
Re: QVector dynamisch initialisiert zugriff verweigert
Dann bitte die komplette Klassendefinition + die komplette Definition der Methode, in der diese Schleife steckt. Wenn noch mehr Typen involviert sind entsprechende Klassen- + Funktionsdefinitionen.
(Lies: Definitionen, nicht Deklarationen!)
Am allerbequemsten wäre ein .zip mit abgespecktem Code, der dein Problem verdeutlicht.
(Lies: Definitionen, nicht Deklarationen!)
Am allerbequemsten wäre ein .zip mit abgespecktem Code, der dein Problem verdeutlicht.
Re: QVector dynamisch initialisiert zugriff verweigert
Hab den Vektor jetzt im Code deklariert und auf einmal gehts...
seltsam.
seltsam.
Re: QVector dynamisch initialisiert zugriff verweigert
Ohne Deklaration hätte der Compiler aussteigen müssen (Compile error). Wenn er das nicht tat, war vorher etwas komplett falsch. Wenn du den Erfolg deiner Änderung seltsam findest, hast du nicht verstanden, was du geändert hast.
Bitte zeig Code (s.O.), damit wir das vollständig klären können, am besten mit kleinem vorher/nachher.
Bitte zeig Code (s.O.), damit wir das vollständig klären können, am besten mit kleinem vorher/nachher.