1. Dashboard
  2. Artikel
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  1. HTML - Webmaster Forum
  2. Programmierung - Entwickler Forum
  3. Forum für alle anderen Programmiersprachen

Freaky C++

  • The User
  • 27. April 2009 um 23:58
  • The User
    Forum Guru
    Beiträge
    4.044
    • 27. April 2009 um 23:58
    • #1

    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

    Freiheit bedeutet mehr.

    "Mir ist die gefährliche Freiheit lieber als eine ruhige Knechtschaft."
    (Jean Jacques Rousseau)
    Mein Blog zum Programmieren, GNU/Linux etc.
    Free Chelsea Manning!
    Stolzer Nutzer von KDE, openSUSE und Qt.

  • The User
    Forum Guru
    Beiträge
    4.044
    • 28. April 2009 um 00:09
    • #2

    Erste Sache:
    Man kann SIGSEGV (Null-Dereferenzierung) und ähnliches (Division durch 0...) abfangen:
    Folgender Code:

    C
    #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;
    }
    Alles anzeigen


    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

    Freiheit bedeutet mehr.

    "Mir ist die gefährliche Freiheit lieber als eine ruhige Knechtschaft."
    (Jean Jacques Rousseau)
    Mein Blog zum Programmieren, GNU/Linux etc.
    Free Chelsea Manning!
    Stolzer Nutzer von KDE, openSUSE und Qt.

  • The User
    Forum Guru
    Beiträge
    4.044
    • 28. April 2009 um 00:20
    • #3

    Zweite Sache:
    Links zu: Metaprogrammierung - Interessantes im Forum
    ]cout << cin
    Original freakycpp, Allgemeines zu Typlisten und Policies ähnlich zu "Modernes C++ Design"
    Interessantes über Meta-Programmierung, Host-Sprachen und effizientes Rechnen

    Freiheit bedeutet mehr.

    "Mir ist die gefährliche Freiheit lieber als eine ruhige Knechtschaft."
    (Jean Jacques Rousseau)
    Mein Blog zum Programmieren, GNU/Linux etc.
    Free Chelsea Manning!
    Stolzer Nutzer von KDE, openSUSE und Qt.

  • The User
    Forum Guru
    Beiträge
    4.044
    • 17. Mai 2009 um 11:57
    • #4

    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)

    Freiheit bedeutet mehr.

    "Mir ist die gefährliche Freiheit lieber als eine ruhige Knechtschaft."
    (Jean Jacques Rousseau)
    Mein Blog zum Programmieren, GNU/Linux etc.
    Free Chelsea Manning!
    Stolzer Nutzer von KDE, openSUSE und Qt.

  • minder
    Gast
    • 30. Juni 2009 um 09:39
    • #5
    Zitat von The User

    Erste Sache:
    Man kann SIGSEGV (Null-Dereferenzierung) und ähnliches (Division durch 0...) abfangen:
    Folgender Code:

    C
    #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;
    }
    Alles anzeigen

    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

  • The User
    Forum Guru
    Beiträge
    4.044
    • 30. Juni 2009 um 11:29
    • #6

    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.

    Freiheit bedeutet mehr.

    "Mir ist die gefährliche Freiheit lieber als eine ruhige Knechtschaft."
    (Jean Jacques Rousseau)
    Mein Blog zum Programmieren, GNU/Linux etc.
    Free Chelsea Manning!
    Stolzer Nutzer von KDE, openSUSE und Qt.

  • minder
    Gast
    • 30. Juni 2009 um 16:34
    • #7

    ah ok aber es geht:D

  • The User
    Forum Guru
    Beiträge
    4.044
    • 30. Juni 2009 um 18:14
    • #8

    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.

    Freiheit bedeutet mehr.

    "Mir ist die gefährliche Freiheit lieber als eine ruhige Knechtschaft."
    (Jean Jacques Rousseau)
    Mein Blog zum Programmieren, GNU/Linux etc.
    Free Chelsea Manning!
    Stolzer Nutzer von KDE, openSUSE und Qt.

Tags

  • forum
  • hilfe
  • windows
  • funktion
  • code
  • hardware
  • freunde
  • error
  • wind
  • templates
  • ring
  • programmierung
  • include
  • standard
  • string
  • catch
  • template
  • public
  • c++
  • int
  • signale
  • kompilieren
  • message
  • meta-programmierung
  1. Datenschutzerklärung
  2. Impressum
Community-Software: WoltLab Suite™
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
Zitat speichern