und schon wieder ein iterator Problem von mir
-
Hi,
langsam hab ich das Gefühl ich geh euch auf den Sack, weil ich ständig mit meinen vectoren und ihren iteratoren nicht klarkomme.
Diesesmal ist wieder ein Iterator 0, der gar nicht 0 sein kann (meiner Meinung nach).zahl_pos::zahl_pos(double diezahl, vector<int>::iterator deriterator, vector<int> &dervector) { zahl = diezahl; int i = 0; for(vector<int>::iterator it = dervector.begin(); it < deriterator; it++) { i++; } index = i; }deriterator ist nicht dereferenzierbar, entsprechend schlägt auch der Vergleich fehl ("vector iterators incompatible").
Aufgerufen wird der Konstruktor in diesem Fall (sonst funzt er ja) so:/*...*/zahl_pos(val_of_block, c_rechenablauf.erase(index_zu_it(c_rechenablauf, erste_oeffnend), index_zu_it(c_rechenablauf, passende_schliessend+1)), c_rechenablauf)/*...*/deriterator._Mycont ist 0 wie sich im Debugger herausstellte.
deriterator ist aber c_rechenablauf.erase(/.../)
Also müsste _Mycont die Adresse (?) von c_rechenablauf beinhalten.Ich hoffe mal, dass einer von euch hier besser durchblickt als ich.
-
deriterator kann fehlerhaft sein, weil erase einen Iterator hinter den zu löschenden Bereich zurückgibt. deriterator kann also auf end() liegen und damit ungültig sein.
-
Hmm ja, jetzt wo ich drüber geschlafen hab komm ich schon eher drauf.
Im Debugger wird mir ein Wert für deriterator angezeigt, dieser ist gleich dem letzten Element vor end(), ich habe dabei aber nicht bedacht, dass der MS Debugger auch den Wert von Pointern anzeigt die ins leere zeigen, wird bei Iteratoren also nicht anders sein.
Ich glaub das nächste mal bevor ich einen Thread eröffne schlafe ich nochmal drüber.Gelöst hat sich mein Problem trotzdem noch nicht damit, denn wenn ich mal einfach ein Element weniger lösche und deriterator also auf ein früheres Element zeigt, dann kommt der gleiche Fehler.
Ich werd mal sehen, ob ich irgendwie an die Adresse komme, auf die deriterator zeigt.OK habe jetzt festgestellt, dass deriterator 80 Bytes hinter begin() liegt, jedes Element von dervector ist 16 Byte groß, speziell hier habe ich blos 3 Elemente, somit liegt 32 Byte zu weit hinten (was aber auch nicht end() entspricht glaube ich).
Ich muss mir jetzt wohl irgendwie eine Andere Lösung als erase() überlegen um an meinen Iterator zu kommen.