Unberechenbare Programmabstürze - Compiler Schuld?



  • quaid schrieb:

    Erfolgsquote liegt bei gefühlten 79%

    Was denn, keine Kommastellen? Hätte mir mehr von dir erwartet...



  • Nexus schrieb:

    Simon2 schrieb:

    Das ist ein ziemlich komplexes Problem bei Containern und wird gerne mal übersehen...

    ...und bei einer gut implementierten Standardbibliothek in vielen Fällen durch Assertions aufgedeckt. 🙂

    Ich hab das Gefühl, das Problem liegt hier eher bei den Zeigern. Nur so eine Vermutung...

    Meine doch auch!

    Ungültig gewordene Iteratoren könnte eine STL (vermutlich aber auch nur im Debugmodus) evtl. noch abfangen ... bei Zeigern fällt mir nicht ein, wie das gehen könnte.
    Meine Argumentation war eher: Wenn schon Iteratoren ungültig werden, dann Zeiger erst recht.

    Gruß,

    Simon2.



  • So, ich habe mich jetzt vom Pointer Wirr-Warr verabschiedet und arbeite mit den STL-Containern. Alles läuft super und der Code sieht auch gleich viiieeeeel sauberer aus. Schnell genug arbeiten die Dinger auch. Die paar hundert MB werden jedenfalls in 20 Sekunden abgearbeitet und währenddessen werden Millionen(!) von vectoren und listen erzeugt, verändert und gelöscht.

    Ich hänge jetzt an einer anderen Stelle. Wenn einer Lust hat, kann er mir schnell sagen wie ich assertions von vectoren abfangen kann, denn das brauch ich grad.

    Ansonsten vielen vielen Dank für alle Antworten und den Tip mit der STL. Ich bin definitiv bekehrt worden. 👍

    Also. Thema geschlossen.

    Tschöö!



  • assert fängt man nicht ab. die gibts, wenn du was programmiert hast was nicht sein soll und das muss geändert werden.



  • Hi quaid,

    uknow schrieb:

    assert fängt man nicht ab. die gibts, wenn du was programmiert hast was nicht sein soll und das muss geändert werden.

    Sehe ich auch so .... allerdings vermute ich, dass Du eine assertion von vector::operator[]() (im Debugmode) wegen Indexüberschreitung bekommst.
    Als Erstes solltest Du da debuggen, ob/wo/warum Du dem vector irgendwohin greifen willst, wo er es nicht gerne hat ;).
    Dann solltest Du entscheiden, ob
    a) ein simpler Programmierfehler vorliegt,
    b) Du mit einer vorherigen Abfrage klarkommst oder
    c) Du besser vector::at() verwendest (der prüft solche Fehler).

    c) würde ich nicht unbedingt als Standardlösung vorschlagen, aber es gibt Programme, da ist es das richtige Mittel (wenn man permanent Indizes von "außen" hereingereicht bekommt und jedesmal selbst prüfen müsste, kann man das besser at() machen lassen).

    Gruß,

    Simon2



  • Ich hab den Fehler gefunden, und diesmal lags nicht an mir! 🕶 😃

    Bei sehr großen Datensätzen kam der Rechner nicht mehr mit. Genauer gesagt, nachdem der 5.450.153te Vector angelegt wurde. Diese Vektoren habe ich nun durch statische Arrays ersetzt, da ohnehin nicht mehr als 3 Einträge gebraucht werden. Jetzt funktioniert alles bestens.

    Man sollte also doch nicht unbedingt immer grundsätzlich mit Vektoren arbeiten :p

    So, nochmal vielen Dank für alle Antworten und tschöö!



  • quaid schrieb:

    Bei sehr großen Datensätzen kam der Rechner nicht mehr mit. Genauer gesagt, nachdem der 5.450.153te Vector angelegt wurde. Diese Vektoren habe ich nun durch statische Arrays ersetzt, da ohnehin nicht mehr als 3 Einträge gebraucht werden. Jetzt funktioniert alles bestens.

    Schön, wenn es funktioniert - auch, wenn mir der Grund ein wenig unglaubwürdig erscheint x)

    bb


  • Administrator

    quaid schrieb:

    Bei sehr großen Datensätzen kam der Rechner nicht mehr mit. Genauer gesagt, nachdem der 5.450.153te Vector angelegt wurde. Diese Vektoren habe ich nun durch statische Arrays ersetzt, da ohnehin nicht mehr als 3 Einträge gebraucht werden. Jetzt funktioniert alles bestens.

    Darf ich fragen, wofür du 5'450'153 mal einen std::vector brauchst?

    quaid schrieb:

    Man sollte also doch nicht unbedingt immer grundsätzlich mit Vektoren arbeiten :p

    Das stimmt durchaus, aber mich würde ehrlich gesagt interessieren, ob es hier wirklich auch der Fall ist, bzw. ob man vielleicht nicht einiges mehr anders machen könnte.

    Aber das ist natürlich dir überlassen, ob du uns noch weiterhin in dem Bereich konsultieren möchtest 🙂

    Grüssli



  • Da ich ja jetzt überaus stolz bin, dass alles funktioniert erkläre ichs natürlich auch gerne. 🕶

    Ich lese einen 3D-Datensatz ein und speichere den in einer Face-Based Datenstruktur. Ich habe also alle Dreiecke inklusive Nachbarschaftsbeziehung im Speicher. Die Dreiecke werden alle in einen Vektor gepackt. Theoretisch kann jedes Dreieck beliebig viele Nachbarn haben (Nachbarschaft ist über die Kanten definiert). Diese Nachbarliste wollte ich halt auch bequem in einem Vektor speichern.

    Allerdings haben wir wie gesagt riesige Datensätze mit mehreren Millionen Dreiecken, womit auch Millionen von Vektoren angelegt wurden. Bei besagter Zahl war eben Schluss. Genauer gesagt war nicht beim Anlegen eines Nachbarvektors Schluss, sondern bei einem ...push_back(newNeighborId).

    Ich hab die Vektoren entfernt und einen statischen Array für jedes Dreieck angelegt. Da die Netze mit denen wir arbeiten immer Manifolds sind, also über jede Kante nur maximal einen Nachbarn haben, ist das so okay.
    Wenn ich aber irgendwann mal non-manifolds einlesen will ist das natürlich doof, aber wer weiß ob das überhaupt passiert!

    So, ich hoffe das hilft euch jetzt beim Einschlafen 😉



  • quaid schrieb:

    ...einen 3D-Datensatz ...

    Also da wundere ich mich sowieso, wie Du auf vector gekommen bist. Das klingt sogar so als ob Du mit einem struct auch gut gefahren wärst.
    vector ist großartig, wo man eine variable oder eine große Dimension hat und die Elemente gleichwertig sind.
    Das scheint in Deinem Fall nicht zuzutreffen.
    Ich bin nicht einmal davon überzeugt, dass ein Array für Dich die beste Wahl ist.
    Vermutlich hast Du doch noch "Fachlichkeit in der Dimension versteckt", oder?
    (so in dem Sinne "a[0] ist der x-Wert, a[1] ist der y-Wert und a[2] ist der z-Wert")

    Gruß,

    Simon2.



  • Die Koordinaten speichere ich in einer Klasse Vec3f. Die hat der Lehrstuhl zur Verfügung gestellt. Damit kann man auch direkt alle möglichen Vektorrechnungen durchführen (wie Kreuzprodukt, Norm, ...) Da die Dreiecke ja in meinem Fall jetzt alle den gleichen Aufbau haben hab ich ja jetzt einen Vektor der viele gleichwertige Daten enthält.

    Ein Vektor bzw. Array ist auch nötig, da die Dreiecke indiziert werden. So bekomme ich z.B. alle Nachbarn eines Punktes, indem ich die anliegenden Dreiecke durchlaufe. D.h. jeder Punkt verweist erstmal auf ein anliegendes Dreieck und von da aus suche ich die Punktenachbarschaft (über die Nachbardreiecke). Das ist das Prinzip einer Face-Based Datenstruktur.
    Ausserdem werde ich auch Dezimierungsalgorithmen implementieren, da muss ich dann einzelne Dreiecke löschen, was auch schnell gehen soll.

    Hmm, beim Schreiben merk ich grad dass da vll eine Liste besser wäre. Aber wenn ich jetzt umsteige muss ich aus den Verweisen über ID wieder Pointerverweise machen... 🙄

    Ich änder aber nix mehr, sonst wird mir noch schwindelig. Ich bin mit der aktuellen Lösung zufrieden. Es läuft schnell und zuverlässig! Und vor allem hab ich keinen Ärger mehr mit irgendwelchen ungültigen Pointern... 👍



  • quaid schrieb:

    ,,,Ich bin mit der aktuellen Lösung zufrieden. Es läuft schnell und zuverlässig! Und vor allem hab ich keinen Ärger mehr mit irgendwelchen ungültigen Pointern... 👍

    👍 👍
    Na - das ist doch das Wichtigste!! (meine ich ganz ernst)
    😋 😋

    Gruß,

    Simon2.


Anmelden zum Antworten