Seite 1 von 1

QVector dynamisch initialisiert zugriff verweigert

Verfasst: 12. April 2012 20:43
von schwenk
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.

Re: QVector dynamisch initialisiert zugriff verweigert

Verfasst: 12. April 2012 21:16
von franzf
schwenk hat geschrieben:weiß aber nicht wie da der Compeiler mir bei beider Versionen "->" und "." nen Fehler ausgiebt.
Naja.... Compiler sind kompliziert. Da läuft erst ein Präprozessor drüber, dann wird geparst+gelext. Da kann überall was schief gehen.
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

Verfasst: 12. April 2012 21:31
von schwenk
Ich will doch nur wissen wie ich auf die Elemente zugreifen kann xD

Re: QVector dynamisch initialisiert zugriff verweigert

Verfasst: 13. April 2012 00:33
von brax
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...".

Re: QVector dynamisch initialisiert zugriff verweigert

Verfasst: 13. April 2012 09:34
von RHBaum
Einen QVector per new auf dem Heap zu erzeugen ist übrigens nur nötig, wenn Du Dir ganz sicher bist, dass Du das willst!
Sagen wir besser: in 90% der Faelle ist es sinnlos, oder "zweifelhaftes" design ...
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

Verfasst: 13. April 2012 11:10
von brax
RHBaum hat geschrieben: wenn unbedingt den [] operator brauchst, solltest das auch so schreiben koennen
InterSec->operator[](0).x
Ja, das stimmt natürlich aber da fand ich das dereferenzieren des Zeigers doch etwas handlicher.

Re: QVector dynamisch initialisiert zugriff verweigert

Verfasst: 13. April 2012 17:16
von schwenk
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.

Re: QVector dynamisch initialisiert zugriff verweigert

Verfasst: 14. April 2012 07:37
von franzf
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.

Re: QVector dynamisch initialisiert zugriff verweigert

Verfasst: 14. April 2012 15:39
von schwenk
Also habs jetzt wie vorgeschlagen gamacht :

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));
    }
Trotzdem stürtzt das Programm an der Stelle immer ab.

Re: QVector dynamisch initialisiert zugriff verweigert

Verfasst: 14. April 2012 15:58
von franzf
Zu wenig Info...
InterSection() ist ne Funktion? Vllt. passiert der SegFault da drinnen?

Re: QVector dynamisch initialisiert zugriff verweigert

Verfasst: 14. April 2012 15:59
von schwenk
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

Verfasst: 14. April 2012 16:02
von schwenk
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

Verfasst: 14. April 2012 16:04
von franzf
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.

Re: QVector dynamisch initialisiert zugriff verweigert

Verfasst: 14. April 2012 16:09
von schwenk
Hab den Vektor jetzt im Code deklariert und auf einmal gehts...
seltsam.

Re: QVector dynamisch initialisiert zugriff verweigert

Verfasst: 14. April 2012 16:13
von franzf
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.