QVector dynamisch initialisiert zugriff verweigert

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
schwenk
Beiträge: 17
Registriert: 10. April 2012 21:27

QVector dynamisch initialisiert zugriff verweigert

Beitrag 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.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QVector dynamisch initialisiert zugriff verweigert

Beitrag 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...
schwenk
Beiträge: 17
Registriert: 10. April 2012 21:27

Re: QVector dynamisch initialisiert zugriff verweigert

Beitrag von schwenk »

Ich will doch nur wissen wie ich auf die Elemente zugreifen kann xD
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: QVector dynamisch initialisiert zugriff verweigert

Beitrag 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...".
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: QVector dynamisch initialisiert zugriff verweigert

Beitrag 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 ....
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: QVector dynamisch initialisiert zugriff verweigert

Beitrag 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.
schwenk
Beiträge: 17
Registriert: 10. April 2012 21:27

Re: QVector dynamisch initialisiert zugriff verweigert

Beitrag 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.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QVector dynamisch initialisiert zugriff verweigert

Beitrag 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.
schwenk
Beiträge: 17
Registriert: 10. April 2012 21:27

Re: QVector dynamisch initialisiert zugriff verweigert

Beitrag 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.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QVector dynamisch initialisiert zugriff verweigert

Beitrag von franzf »

Zu wenig Info...
InterSection() ist ne Funktion? Vllt. passiert der SegFault da drinnen?
schwenk
Beiträge: 17
Registriert: 10. April 2012 21:27

Re: QVector dynamisch initialisiert zugriff verweigert

Beitrag von schwenk »

Ne hab ich schon ausgetestet indem ich einfach ein Struct übergeben hab der Segfault passiert genau an der stelle.
schwenk
Beiträge: 17
Registriert: 10. April 2012 21:27

Re: QVector dynamisch initialisiert zugriff verweigert

Beitrag 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); }
};
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QVector dynamisch initialisiert zugriff verweigert

Beitrag 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.
schwenk
Beiträge: 17
Registriert: 10. April 2012 21:27

Re: QVector dynamisch initialisiert zugriff verweigert

Beitrag von schwenk »

Hab den Vektor jetzt im Code deklariert und auf einmal gehts...
seltsam.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QVector dynamisch initialisiert zugriff verweigert

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