"Segmentation fault (core dumped)" bei einem Array aus Zeigern

Clund

(aka Cpp-Freak)
Hallo zusammen,
ich programmiere gerade eine Physiksimulation mitsamt grafischer Darstellung. Dabei Verwende ich Globale/Statische Variablen:
C++:
class MassPointHelper
{
    public:
        MassPointHelper(); //for testing "probes"
        MassPointHelper(long AnzObj); //for initilyzing **Objekte
        MassPointHelper(Objekt* objTs); //for objekt
        ~MassPointHelper();

        void getF(ld actX, ld actY, ld actZ, ld actMass, VectorHelper* RetWert); //get the F (= Kraft)

        static bool debug;

    protected:
    private:

        int Obj_Pointer; //die Pos in Objekte

        static Objekt **Objekte;
            //Nr. 0 ist der initialisierer
            //Obj Pointer wird bei testen auf 0 gesetzt

        static long next_Pointer;
        static long MAX_Pointer;
};
C++:
MassPointHelper::MassPointHelper(long AnzObj){
    MAX_Pointer = AnzObj-1;
    Objekte = new Objekt*[AnzObj];
    GLOBALOBJECTS = Objekte;
    debug = 0;
}
wobei GLOBALOBJECTS von dem gesamten Programm verwendet wird (Grafik, etcpp). Allerdings nicht während des Absturzes (der Thread ist gar nicht gestartet)
wenn ich dann folgendes Ausführe:
C++:
        if (Eingabe == "testobj"){
            objIni = new Simulation::MassPointHelper(10);
            cout << "objIni initialisiert!" << endl;
            GLOBALOBJECTS[1] = new Simulation::Objekt(5, 10, -10, 50, false);
            GLOBALOBJECTS[2] = new Simulation::Objekt(5, 5, 5, 65, false);
            GLOBALOBJECTS[3] = new Simulation::Objekt(10, 10, 0, 10, false);
            GLOBALOBJECTS[4] = new Simulation::Objekt(-20, -20, 0, 25, false);
            GLOBALOBJECTS[5] = new Simulation::Objekt(0, 0, 0, 50, false);
        }
bekomme ich:
Code:
simon@simon-P55-USB3 ~/Visualeiemc2/xsv $ ./Visualeiemc2 
Visual e=mc^2
by Simon Michalke
Version t4/Viiiieeele Klassen!
>testobj
objIni initialisiert!
Segmentation fault (core dumped)
simon@simon-P55-USB3 ~/Visualeiemc2/xsv $
kann mir irgendjemand sagen, wo ich hier den Denkfehler drin habe?
Clund
P.S. falls jemand den ganzen Code haben will, kann ich ihn per e-mail schicken, aber ich will ihn nicht öffentlich hier reinstellen, das Projekt geht noch zum JuFo-Wettbewerb :p
 
Zuletzt bearbeitet von einem Moderator:
Hi.

Verwende einen Debugger. Dann hast du die fehlerhafte Codestelle in null-komma-nix.

Ich würde vermuten, dass der Fehler im Konstruktor der Objekt Klasse zu suchen ist.

Wobei auch seltsam ist, dass du GLOBALOBJECTS 1 bis 5 initialisierst und nicht 0 bis 4. Es könnte also auch ein OBOE sein...
 
Soo...deepthroat liegt wieder richtig, ohne etwas vom Code gesehen zu haben :)

Kurz: Jedes deiner Objekte macht wieder einen Masspointhelper,
der das globale Array überschreibt. Mit false als Größe.


Bei den 4 new-Objekt´s die Konstruktorparameter:
4 int-artige und ein bool. So einen Konstruktor gibts nicht.

Es gibt Parameterlos, ein int, 3int+bool, 5int oder 3int+bool+int
Genommen wird dann wohl der mit 5 int´s.

Wenn du trotz der theoretischen Durchmischbarkeit alles schön in long, int und bool aufteilst
und dann false für ein int übergibst...


Weiter gehts in den Konst vom MassPointHelper, der das false als Elementanzahl=0 hernimmt
und ein neues Pointerarray, Größe 0, in GLOBALOBJECTS erstellt. Kaputt.
...

Was du eigentlich wolltest kann ich mir derzeit nicht denken.
Zu viele glob.Vars, die überall verstreut sind, verwirren etwas.

5000 :D
 
Ok, mein Fehler, ist etwas kompeliziert, aber ich versuche meine Absicht zu erklären ...
Wobei auch seltsam ist, dass du GLOBALOBJECTS 1 bis 5 initialisierst und nicht 0 bis 4. Es könnte also auch ein OBOE sein...
Dass ist gewollt. Das Objekt x hat auch den Masspointhelper x. Der MassPointhelper 0 ist zum initialisieren der Objekte bzw wenn getF (also Kraft ausrechnen) mit Parameter 0 ausgeführt wird, wird die Kraft vom eigenem Objekt nicht mirgerechnet ...
Der (Denk-)Fehler war, dass in dem letzen Argument von:
C++:
GLOBALOBJECTS[1] = new Simulation::Objekt(5, 10, -10, 50, false);
vor einer Änderung das letzte Argument angeben sollte, ob relativistisch oder nicht gerechnet werden soll. Nach hinzufügen der Variable int Obj_Pointerts im Konstruktor wurde der Konstruktor eines länger und die letzte Variable wurde der Onjekt Pointer d.h. damit der MassPointHelper des Objektes weiß, welches Objekt er gerade berechnet (außer 0, dass ist wieder nen anderer Fall, hierbei kann man "TestMassepunkte" angeben, um das Gravitationsfeld anzuzeigen).
nun ja, den new() Befehl in der Main habe ich nach dem hinzufügen nicht verändert, sodass Obj_Pointer immer false bzw 0 war ...
wenn du willst, deepthroat kann ich dir das Projekt mal gerne schicken ...
Simon
P.S. richtig sollte es heißen: (jetzt wird es denke ich klar)
C++:
            GLOBALOBJECTS[1] = new Simulation::Objekt(5, 10, -10, 50, 1);
            GLOBALOBJECTS[2] = new Simulation::Objekt(5, 5, 5, 65, 2);
            GLOBALOBJECTS[3] = new Simulation::Objekt(10, 10, 0, 10, 3);
            GLOBALOBJECTS[4] = new Simulation::Objekt(-20, -20, 0, 25, 4);
            GLOBALOBJECTS[5] = new Simulation::Objekt(0, 0, 0, 50, 5);
[Edit] sorry, ich hab erst jetzt gemerkt dass ich einen Konstruktor mit long und einen mit int habe ... ich werde mir da was überlegen müssen. Warscheinlich eine Klasse, die nur für die Verwaltung von Objekten zuständig ist ... fürs erste setze ich mal die Anzahl der maximalen Objekte in dem "long"-initialisier-Konstruktor manuell auf ne konstante Zahl.
 
Zuletzt bearbeitet:
Ok,
nächstes Problem, hier sind ein Paar Mathematiker gefragt: :p
Die Klasse VectorHelper soll 3D Vektoren (X, Y und Z) in einen "Betrag" und ein Richtung á la Polkoordinate umwandeln (sowie umgekehrt)
mein bisheriger Ansatz:
Die Headerfile: (#define ld long double)
C++:
class VectorHelper
{
    public:
        VectorHelper();
        ~VectorHelper();

        ld X, Y, Z;

        float rotY, rotX;
        ld Wert;

        void convertRotWertToYXZ();
        void convertXYZToRotWert();
    protected:
    private:
};
Die Sourcefile:
C++:
void VectorHelper::convertRotWertToYXZ(){
    ld a;
    a = Wert * cos(rotX);
    Y = Wert * sin(rotX);
    Z = a * cos(rotY);
    X = a * sin(rotY);
}

void VectorHelper::convertXYZToRotWert(){
    ld a;
    a = pow(X*X+Z*Z, 0.5);
    rotY = acos(Z/a);
    Wert = pow(a*a+Y*Y, 0.5);
    rotX = asin(Y/Wert);
}
Den Wert a kann man sich dabei als den Betrag eines "waagerechten" Vektors Vorstellen, also nicht nach oben oder unten gedreht. a und Y sollten ein Rechteck bilden, wobei die Diagonale der Betrag ist.
Ich hab die Variablen zwecks Performance auf Public gesetzt.
Simon
 
Moin,
Ok, das Problem lag (immer noch) bei den Zeiger, globals & Co ...
ich musste nur das initialisieren der Objekte:
C++:
GLOBALOBJECTS = new Simulation::Objekt*[10];
von masspointhelper in die main() verschieben ... :suspekt:
keine Ahnung wieso, aber jetzt geht alles.
Simon
 
Zurück