Unberechenbare Programmabstürze - Compiler Schuld?



  • 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