This application has requested the Runtime.....



  • Na, für deinen letzten Codeabschnitt, mit gruss und standards hast du doch einen Copy-Paste-Fehler! In STANDARDS() füllst du den gruss-Vector... dabei willst du doch bestimmt den standard-Vector füllen? Naja, offensichtliche Fehler fallen am schwierigsten ins Auge. 😉



  • Achja, warum machst du die Implementierung deiner beiden Funktionen in Initial.h??? Lager die mal in ein Initial.cpp aus, sonst wird das wegen Mehrfachdefinition der Funktionen noch Mecker vom Compiler geben. Und die Variablen gruss und standards gehören auch in die cpp-Datei. Sonst sind die auch mehrfach definiert, sobald der Header Initial.h irgend woanders noch inkludiert wird.



  • Achja, und du kannst auch nicht davon ausgehen, das dein Vector immer mind. ein Element hat. Das hier wäre noch ganz gut:

    void BotSay(const vector<string>& v) // v auch als by-Reference-Parameter.
    {
       try
       {
          cout << "Bot: " << converse(v).at(0) << endl;
       }
       catch(std::out_of_range &e)
       {
          clog << e.what() << endl;
       }
    }
    

    Wenn dein Vector mal Null Elemente hat, fliegt dir das Programm wenigstens nicht um die Ohren. 😃 Eine Laufzeitfehler-Quelle weniger.



  • @all
    Erst mal vielen Dank für eure schnelle und gute Hilfe es funktioniert jetzt alles so wie ich es mit vorgestellt habe. 😃
    @Artchi
    Das mit der Funktion STANDARDS das ich da immer gruss.push_back(....) geschrieben habe anstatt standard.push_back(....) äh ja peinlihc peinlich für mich würde ich mal sagen. 😞
    Das mit der Initial.h und der zusätzlichen Initial.cpp werde ich jetzt auch gleich noch umsetzen.
    Aber die BotSay funktion von dir verstehe ich nicht. Das mit dem try hab ich anfangs ja überhaupt nicht verstanden hab dann aber in meinem Büchlein im Inhaltsverzeichnis nachgeschut wo stand:
    try: Wird innerhalb eines try-Anweisungsblocks eine Ausnahme geworfen, so kann sie mit hinter dem try-Block definierten catch-Blöcken aufgefangen
    werden.
    Okay hab ich verstanden aber woher kommt out_of_range (is das jetzt in ner speziellen header Datei?). Und dann die Referenz e woher kommt die?
    Und weiter gehts 😃 mit clog is wohl cout gedacht? Und was bewirkt die Funktion what() und aus welcher header kommt die? Ist die ganz normale aus #include <vector>??
    Dankeschön schon mal im Voraus.



  • Bzgl. try und catch. Das sind C++ Sprachfeatures, die du noch nicht kennst. Aber früher oder später stösst man da halt drauf. Es werden dir noch vieeele C++ Sachen die nächsten Monate über den Weg laufen.

    A) du nimmst das try/catch erstmal so hin, wenn das bisher zu viel Infos sind. Oder
    😎 du kannst hier was über Exceptions nachlesen.

    Da std::out_of_range aus dem std-Namespace ist, ist es aus der C++ Standardbibliothek. Alle Methoden aus der Standardlib die sich at() nennen, können ein out_of_range werfen. Im Prinzip heißt das, das der Zugriff von dir ausserhalb des Index-Bereiches war. Wenn dein Vector nur 2 Elemente enthält, und du z.B. auf das 3. Element zugreifst, wirft at() die out_of_rage-Exception. Am besten zu liest was zu den Exceptions.



  • Achja:

    cout -> Ausgabestream-Objekt für normale Textausgaben.
    cerr -> Ausgabestream-Objekt für Fehlermeldungen.
    clog -> Ausgabestream-Objekt für Logging-Meldungen.



  • So ich war wieder auf deiner Page und hab mir den Link von dir durchgearbeitet nur leider bin ich schon bei throw (3.1) stehen geblieben, warum funktioniert das den bei mir nicht.

    #include <iostream>
    #include <string>
    #include <exception>
    
    void foo(void *p) throw (std::exception);
    
    int main(int argc, char* argv[])
    {
    
    }
    
    void foo(void *p) throw (std::exception)
    {
        if( p == NULL )
            throw std::exception("Exception: p ist NULL!");
    
    }
    

    ERROR:
    Compiling: C:\MinGW\Andi\C++\exeptions.cpp
    C:\MinGW\Andi\C++\exeptions.cpp: In function void foo(int*)': C:\\MinGW\\Andi\\C++\\exeptions.cpp:17: error: no matching function for call tostd::exception::exception(const char[23])'
    c:/mingw/bin/../lib/gcc/mingw32/3.4.4/../../../../include/c++/3.4.4/exception:53: note: candidates are: std::exception::exception(const std::exception&)
    c:/mingw/bin/../lib/gcc/mingw32/3.4.4/../../../../include/c++/3.4.4/exception:55: note: std::exception::exception()
    Process terminated with status 1 (0 minutes, 0 seconds)
    3 errors, 0 warnings



  • Hem, in meinem MSVC7.1 funktioniert es. Habe aber jetzt nochmal in der MSDN-Doku und Stroustrup nachgeschaut, std::exception hat tatsächlich keinen Konstruktor der Strings entgegen nimmt. Nur davon abgeleitete Exceptions stellen einen solchen Konstruktor bereit.

    Gut, das macht aber nichts. Dann lass einfach in Zeile 17 den String weg. Also so:

    throw std::exception();
    

    Werde mein Tutorial entsprechend abändern.



  • Was ich noch nicht so ganz verstehe wann weiß ich jetzt z.B. bei dem vector da das ich z.B. out_of_range und nicht overflow_error verwenden muss. (okay out_of_range sagt ja der Name schon ein bisschen). Aber du hast irgendwas vorhin gemeint mit alle Methoden asu der standard lib die sich at() nennen können einen out_of_range werfen. Mh ich versteh jetzt nicht ganz woher soll ich wissen wie die ganzen methoden heißen und ich versteh das auch nicht mit dem "...die sich at() nennen..." es können doch nicht alle Methoden den Namen at() haben??? Oder wie ist das jetzt zu verstehen.
    Genauso auf deiner Page da hast du ja so eine Tabelle erstellt aber mh, manche werden von Bibliotheken geworfen andere von der Sprache. z.B. bei bad_alloc steht geworfen von new is da dieses new gemeint --> int a=new int; ????
    Äh und noch was:

    void foo(void *p) throw (std::exception)
    {
        if( p == NULL )
            throw std::exception();
    
    }
    

    Bei der Funktion hier, da steht als Parameter void *p. Was soll bitte void für einen Typ darstellen? Void ist bei mir "nichts". Was speichert man in einem void Typ???

    Dankeschön schon mal im Voraus.



  • Was ich noch nicht so ganz verstehe wann weiß ich jetzt z.B. bei dem vector da das ich z.B. out_of_range und nicht overflow_error verwenden muss. (okay out_of_range sagt ja der Name schon ein bisschen).

    In dem man das nachliest? Es ist wichtig das man Literatur hat oder weiß wo es steht. (z.B. in meinem Tutorial 😉 ) Das ist wie in der Mathematik und Physik: man muß nicht alle Formeln auswendig können, man muß nur wissen, wo die Formeln zu finden sind.

    Beim Programmieren bzw. bei der Benutzung von Bibliotheken ist das auch nicht anders. Klassen und Funktionen die man regelmäßig benutzt, hat man dann auch automatisch irgendwann auswenig gelernt. Sachen die man seltener benutzt, schlägt man halt nach. Entweder in einem Buch oder online.

    Ich schlage meistens in meinem Büchern nach, was in meinen Büchern nicht drin steht, schlage ich in der MSDN nach, weil die natürlich umfangreicher und detailierter als ein Buch ist. Wer keines von beidem nutzen kann, kann sich mit dem kleinen aber feinen http://www.cppreference.com behelfen. Z.B. steht bei der Beschreibung von at() unter http://www.cppreference.com/cppvector/at.html einiges an Infos. Vorallem im letzten Satz! Da steht was davon, das at() eine Exception wirft. Naja, leider steht da nicht genau welche.

    Die GCC-Website hat glaub ich auch eine sehr gute Dokumentation zur Standard-Library.
    http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/ Weiß aber nicht, ob das der offizielle Einstiegslink ist.

    Aber du hast irgendwas vorhin gemeint mit alle Methoden asu der standard lib die sich at() nennen können einen out_of_range werfen. Mh ich versteh jetzt nicht ganz woher soll ich wissen wie die ganzen methoden heißen und ich versteh das auch nicht mit dem "...die sich at() nennen..." es können doch nicht alle Methoden den Namen at() haben??? Oder wie ist das jetzt zu verstehen.

    Na, alle Methoden die sich at() nennen. Ist doch wie "Alle Autos die rot sind, machen ...".

    Beispiele: vector hat eine at()-Methode, aber auch string um auf einzelne Buchstaben zuzugreifen. Es gibt wahrscheinlich noch ein paar andere Klassen die das haben. Weiß ich aber nicht auswendig.

    Genauso auf deiner Page da hast du ja so eine Tabelle erstellt aber mh, manche werden von Bibliotheken geworfen andere von der Sprache. z.B. bei bad_alloc steht geworfen von new is da dieses new gemeint --> int a=new int;

    Genau! Wenn du new aufrufst, forderst du ja neuen Speicher an. Aber Speicher ist begrenzt. Wenn es zu wenig freien Speicher gibt (kannst du ja im Windows-Taskmanaber beobachten), wirft new eine bad_alloc-Exception (bad allocation). Wenn du sie nicht abfängst, zeigt dir Windows eine Fehlermeldung an, was aber schlecht für dein Programm ist.

    Fängst du sie aber ab, kannst du deinem Benutzer sagen, das zu wenig Speicher frei ist. Und das Programm kann einen alternativen Weg einschlagen.

    Bei der Funktion hier, da steht als Parameter void *p. Was soll bitte void für einen Typ darstellen? Void ist bei mir "nichts". Was speichert man in einem void Typ???

    Ja, void ist nichts bzw. void-Pointer zeigen dann halt einfach auf eine Speicheradresse. Typ unbekannt. Wirst du als normaler Anwendungsprogrammierer selten bis garnicht brauchen. Braucht man meistens für Lowlevel-Programmierung.

    Aber das ist ja in meinem Tutorial auch völlig wurscht, weil es ja für die Demonstration ist. Das ist sozusagen "Pseudo-Code". Es geht nur ums Prinzip der Exceptions, der void-Pointer muß halt als Statist herhalten. Ich hätte auch einen int-Pointer nehmen können, würde aber am Beispiel nichts ändern. 😉



  • Hallo,
    habe mich hierhin durchgeklickt, vllt. kann mir ja jemand helfen:

    Seit einigen Tagen erhalte ich, wenn ich ins Internet gehe, die Meldung
    Microsoft Visual C++ Runtime Library Runtime Error Program C:\Programme\Internet Explorer\iexplore.exe

    Seiten werden blockiert bzw. ich muss sie schließen.

    Was kann ich dagegen tun?
    (Bin völliger Amateur, habe nichts hilfreiches im Netz gefunden. Forensuche hier hat auch nichts gebracht, Beitrag ggf. bitte verschieben!)

    Es dankt
    Carmen


Anmelden zum Antworten