Ergebnis 1 bis 8 von 8

Thema: Freaky C++

  1. #1
    Forum Guru Avatar von The User
    Registriert seit
    28.10.2007
    Ort
    Zwischen Pazifik und Atlantik...
    Beiträge
    4.044
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard Freaky C++

    Hi C++-Freunde!
    Da C++ immer wieder für Überraschungen gut ist, mache ich hier einmal einen Sammelthread für die erstaunlichsten Dinge in C++ auf. Ob hardwarenaher Kram oder Template-Meta-Programmierung, Hauptsache lustig.

    Da das keine FAQ o.ä. ist, kann ruhig alles in einzelne Posts getan werden.

    Viele liebe Grüße
    The User
    Achtung: Dies ist ein alter Thread im HTML und Webmaster Forum
    Diese Diskussion ist älter als 90 Tage. Die darin enthaltenen Informationen sind möglicherweise nicht mehr aktuell. Erstelle bitte zu deiner Frage ein neues Thema im Forum !!!!!

  2. #2
    Forum Guru
    Themenstarter
    Avatar von The User
    Registriert seit
    28.10.2007
    Ort
    Zwischen Pazifik und Atlantik...
    Beiträge
    4.044
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard AW: Freaky C++

    Erste Sache:
    Man kann SIGSEGV (Null-Dereferenzierung) und ähnliches (Division durch 0...) abfangen:
    Folgender Code:
    Code:
    #include <iostream>                                    
    #include <csignal>                                     
    #include <stdexcept>                                   
    using namespace std;                                   
    
    struct seg_error : public runtime_error
    {                                      
      int key;                             
      seg_error(string message = "", int _key = 0) : runtime_error(message), key(_key)
      {}
    };
    
    void segmentationFault(int key) throw(seg_error)
    {
            throw seg_error("Segmentation Fault! Error key is: ", key);
    }
    
    int main()
    {
            signal(SIGSEGV, segmentationFault);
            try
            {
                    int *x = 0;
                    cout << *x;
            }
            catch(seg_error e)
            {
                    cout << "Hi!" << endl;
                    cout << e.what() << e.key << endl;
            }
            cout << "still alive..." << endl;
            return 0;
    }
    Bei Empfang des entsprechenden Signals wird die Funktion aufgerufen und eine Ausnahme ausgelöst.
    Beim Kompilieren muss die Aufrechterhaltung der korrekten Stack-Abwicklung berücksichtigt werden:
    Code:
    g++ -o catchsigsegv ./catchsigsegv.cpp -fnon-call-exceptions -fasynchronous-unwind-tables -funwind-tables
    ./catchsigsegv
    Obwohl das Standard-C++ ist, funktioniert es unter Windows nicht, da dort keine Signale versendet werden.

    Viele liebe Grüße
    The User

  3. #3
    Forum Guru
    Themenstarter
    Avatar von The User
    Registriert seit
    28.10.2007
    Ort
    Zwischen Pazifik und Atlantik...
    Beiträge
    4.044
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

  4. #4
    Forum Guru
    Themenstarter
    Avatar von The User
    Registriert seit
    28.10.2007
    Ort
    Zwischen Pazifik und Atlantik...
    Beiträge
    4.044
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard AW: Freaky C++

    Mathematik-Bibliotheken sind natürlich besonders interessant:
    http://issc.uj.ac.za/symbolic/symbolic.html (Symbolische Mathematik, alles über Symbolic-Klasse)
    http://eigen.tuxfamily.org/ (Template-Basierte Matrizen und Vektoren)

  5. #5
    minder
    Gast

    Standard AW: Freaky C++

    Zitat Zitat von The User Beitrag anzeigen
    Erste Sache:
    Man kann SIGSEGV (Null-Dereferenzierung) und ähnliches (Division durch 0...) abfangen:
    Folgender Code:
    Code:
    #include <iostream>                                    
    #include <csignal>                                     
    #include <stdexcept>                                   
    using namespace std;                                   
    
    struct seg_error : public runtime_error
    {                                      
      int key;                             
      seg_error(string message = "", int _key = 0) : runtime_error(message), key(_key)
      {}
    };
    
    void segmentationFault(int key) throw(seg_error)
    {
            throw seg_error("Segmentation Fault! Error key is: ", key);
    }
    
    int main()
    {
            signal(SIGSEGV, segmentationFault);
            try
            {
                    int *x = 0;
                    cout << *x;
            }
            catch(seg_error e)
            {
                    cout << "Hi!" << endl;
                    cout << e.what() << e.key << endl;
            }
            cout << "still alive..." << endl;
            return 0;
    }
    Bei Empfang des entsprechenden Signals wird die Funktion aufgerufen und eine Ausnahme ausgelöst.
    Beim Kompilieren muss die Aufrechterhaltung der korrekten Stack-Abwicklung berücksichtigt werden:
    Code:
    g++ -o catchsigsegv ./catchsigsegv.cpp -fnon-call-exceptions -fasynchronous-unwind-tables -funwind-tables
    ./catchsigsegv
    Obwohl das Standard-C++ ist, funktioniert es unter Windows nicht, da dort keine Signale versendet werden.

    Viele liebe Grüße
    The User
    Ich dachte try, catch geht unter windows auch

  6. #6
    Forum Guru
    Themenstarter
    Avatar von The User
    Registriert seit
    28.10.2007
    Ort
    Zwischen Pazifik und Atlantik...
    Beiträge
    4.044
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard AW: Freaky C++

    Windows erfüllt jedoch nicht den POSIX-Standard und unterstützt nicht die Signale. Der Code wird unter Windows kompilieren (Signale gehören auch zu ANSI-C), bloß werden keine Signale ankommen. Unter Windows gibt es da SEH, das jedoch nicht zu ANSI-C gehört.

  7. #7
    minder
    Gast

    Standard AW: Freaky C++

    ah ok aber es geht

  8. #8
    Forum Guru
    Themenstarter
    Avatar von The User
    Registriert seit
    28.10.2007
    Ort
    Zwischen Pazifik und Atlantik...
    Beiträge
    4.044
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard AW: Freaky C++

    Es klappt bei dir?
    Ist ja cool...

    Aber nicht vergessen:
    Wir sind hier nicht in Java. Ein sauberes Programm läuft ohne diese Exceptions. Das ist sinnvoll, wenn du von Fehlern und Inkonsistenzen weißt, insbesondere in modularen Anwendungen. Ist das Programm fertig, solltest du es ohne diese Optionen ausführen können.

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •