This application has requested the Runtime.....



  • Kann mir jemand sagen was das bedeutet?
    Wenn ich mein Programm bei mir in code::blocks compiliere dann kommt nach kurzer Zeit immer (nach zwei cins):
    This application has requested the Runtime to terminate it in an unusual way.
    Please contact the application's support team for more information.
    Aber das steht halt in der Eingabeaufforderung drin und dann wird das Programm beendet, bzw. es ist halt noch dieses waitkey von der IDE da.
    Wenn ich ganz normal die kompilierte Exe ausführe dann beender es sofort (is ja klar weil ich den Error so schnell nicht sehen kann da ja das waitkey von der IDE nicht mehr dabei ist.)
    So aber warum passiert das jetzt? Ich hab weder irgendwelche Zeiger oder ähnliches die auf Speicher vom Betriesystem zugreifen, und somit das Programm beenden könnten drin. An was kann das den liegen?



  • Hallo

    du hast einen Fehler in deinem Code.

    bis bald
    akari



  • Hm aber warum wird der Error dann nicht vor dem compilieren angezeigt?



  • Weil es ein Laufzeitfehler ist.



  • Stromberg schrieb:

    Hm aber warum wird der Error dann nicht vor dem compilieren angezeigt?

    Dummerweise gibts Fehler die der Compiler nicht erkennen kann.
    Kurt



  • Hallo

    oder um es anders auszudrücken : ohne den relevanten Code mitsamt kurzer Beschreibung können wir dir nicht helfen, weil wir keine Hellseher sind.

    Man braucht keine Pointer für Speicherfehler, da reicht schon ein Zugriff auf ein Array außerhalb desen Dimension aus.

    bis bald
    akari



  • Stromberg schrieb:

    Ich hab weder irgendwelche Zeiger oder ähnliches die auf Speicher vom Betriesystem zugreifen, und somit das Programm beenden könnten drin. An was kann das den liegen?

    throw ?

    Ohne Code wird man dir nicht viel weiter helfen können. Kannst ja auch mal mit dem Debugger durchsteppen...



  • Mh ja ich wollt nicht den ganzen Code reinmachen weil der is vll. zu lang. (Weiß nicht ob das erlaubt ist???)
    Okay nehmts mir nicht böse, ich poste den mal und wenn es stört dann kann den ja ein Moderator wieder weg machen.

    //main
    #include "Bot_functions.h"
    #include "Initial.h"
    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    
    int main()
    {
        //initialisiert die string vetoren
        GRUSS();
        STANDARDS();
    
        //die Startzahl für den Zufall ist time(0) und somit immer unterschiedlich
        srand(time(0));
        //hier wird der Zufall noch mal durchgemischt
        rand();
    
        string temp;
        string UserText;
        bool x;
    
        cout << "***  'Assozialer Bot' made by Andy  ***\n\n\n";
    
        do
        {
            if (CheckWord(temp,25)!=all_right)
            {
                cout << "Unter welchem Nicknamen wollen sie sich mit dem Bot unterhalten?" << endl;
                cout << "(Namen " << "\x81" << "ber 25 Buchstaben sind nicht erlaubt) Eingabe:";
                GetString(temp,50);
                if (CheckWord(temp,25)!=all_right)
                {
                    cout << "\n### ERROR ###  >> ";
                    if (CheckWord(temp,25)==too_long)
                    cout << "Der Nickname hat " << "\x81" << "ber 25 Buchstaben du Matschbirne.\n" << endl;
                    else
                    cout << "Es ist noch kein Nickname eingegeben du Vollidiot.\n" << endl;
                }
    
            }
    
            if (CheckWord(temp,25)==all_right)
            {
                if (x!=true)
                {
                    cout << "\n\n\n            **----------- Now speaking to Andy's Bot -----------** \n\n\n";
                    BotSay(gruss);  //### warum kommen hier auch vector strings von standard obwohl gruss angegeben ist? Es soll ein Satz durch Zufall
                                    //von dem vector string gruss ausgegeben werden manchmal gibt er aber auch Sätze von vector string standard aus.
                                    //das verstehe ich nicht wie der auf den vector string standards kommt. ### 
                    x=true;
                }
                UserSay(temp,UserText); //### Nach dem hier wird abgebrochen ###
                BotSay(standards);
            }
    
        }while(0);
    
    	return 0;
    }
    
    //Bot_functions.cpp
    include "Bot_functions.h"
    #include <iostream>
    #include <string>
    #include <cstring>
    #include <cctype>
    #include <algorithm>
    #include <stdlib.h>
    #include <vector>
    using namespace std;
    
    //ganz normal GetString Funktion
    void GetString(string &s,int maxlength)
    {
        char *temp=new char[maxlength+1];
        cin.getline(temp,maxlength);
        s=temp;
        delete []temp;
    }
    
    //ganz am anfang beim Programm Start schaut diese Funktion wie lange der Nickname ist. Wemm er über 25 Buchstaben
    //ist (kann man mit dem Parameter maxlength bestimmen, wie lange der Nickname sein soll) bzw. wenn noch gar nichts
    //eingegeben wurde bzw. wenn ein Nick mit richtiger Buchstabenlänge eingegeben wurde gibt die Funktion entweder
    //too_long,no_characters oder all_right
    ERROR CheckWord(const string &s,int maxlength)
    {
        if (s.size()>maxlength)  //wenn string größer als die höchstlänge dann 1
        {
            return too_long;
        }
        else if (s.size()==0)    //wenn im string noch gar nichts drin steht 2
        {
            return no_characters;
        }
        else if (s.size()<=maxlength)   //wenn string die höchstlänge nicht überschreitet und was drin steht 3
        {
            return all_right;
        }
    }
    
    //gibt eine Zufallszahl (nur ganzzahl) im Intervall von Parameter a bis Parameter b. Parameter b kann man weg
    //lassen und b nimmt als Standard die höchstgröße von long signed (vorzeichenbehaftet) an
    
    long rnd(long a,long b)
    {
         return (rand() % (b-a+1)) + a;
    }
    
    //hier kann man einen vector string angeben und die Funktion gibt mit Hilfe der Funktion rnd (Zufall) ein Feld von
    // dem vector string aus. (natürlich nur wenn er mehrer Felder hat, wenn nicht dann ist es halt immer der gleiche)
    vector<string> converse(const vector<string> v)
    {
        vector<string> temp;
        int Random=rnd(0,v.size());
        temp.push_back(v.at(Random));
        return temp;
    }
    
    //hier gibt man einen vector an und die Funktion schreibt durch zufall ein Feld des vectors mit cout in den
    //Kommandointerpreten und schreibt noch zusätzlich "Bot: " als Postfix (vorangestellt) hin. Die Funktion nimmt sich
    //converse() zur Hilfe
    void BotSay(const vector<string> v)
    {
        cout << "Bot: " << converse(v).at(0) << endl;
    }
    
    //diese Funktion schreibt den Nicknamen in den Kommandointerpreten, und führt innerhalb die Funktion GetString aus
    //wobei man beim 2ten Parameter einen string dafür angeben muss in welchem die Eingabe gespeichert wird.
    //Parameter1 enthält den Nicknamen des Users
    void UserSay(const string &s,string &ut)
    {
        cout << s << ": ";
        GetString(ut,5000);
    }
    
    //Bot_functions.h
    #ifndef BOT_FUNCTIONS_H_INCLUDED
    #define BOT_FUNCTIONS_H_INCLUDED
    
    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    
    enum ERROR {too_long,no_characters,all_right};
    
    void GetString(string &s,int maxlength);
    ERROR CheckWord(const string &s,int maxlength);
    long rnd(long a=0,long b=2147483647);
    vector<string> converse(const vector<string> v);
    void BotSay(const vector<string> v);
    void UserSay(const string &s,string &ut);
    
    #endif // BOT_FUNCTIONS_H_INCLUDED
    
    //Initial.h
    #ifndef INITIAL_H_INCLUDED
    #define INITIAL_H_INCLUDED
    
    #include <string>
    #include <vector>
    
    std::vector<std::string> gruss;
    std::vector<std::string> standards;
    
    //Begrüßungen des Bots
    void GRUSS()
    {
        gruss.push_back("Hello");
        gruss.push_back("Hallo");
        gruss.push_back("Sers");
        gruss.push_back("Seeeeeees");
        gruss.push_back("Salut");
        gruss.push_back("Serv\x81s");
        gruss.push_back("Bonjour");
        gruss.push_back("Guten Tag");
        gruss.push_back("Ave");
        gruss.push_back("Sers Schneckle");
        gruss.push_back("Gr\x81\xe1 dich");
        gruss.push_back("Gr\x81\xe1 Gott");
        gruss.push_back("Na du?");
        gruss.push_back("Alles klar Herr Kommissar?");
        gruss.push_back("Was gibts?");
        gruss.push_back("Na, hast keine Freunde?");
    }
    
    //normale Standard Sätze
    void STANDARDS()
    {
        gruss.push_back("Schön dich zu sehen");
        gruss.push_back("Warum nervst du mich?");
        gruss.push_back("Was bistn du für einer?");
        gruss.push_back("Kein Wunder das es mit Deutschland nicht aufwärts geht. Schau dich mal an");
        gruss.push_back("Raus, mit sowas wie dir unterhalte ich mich nicht");
        gruss.push_back("Such dir Freunde und keine Bots");
    
    }
    
    #endif // INITIAL_H_INCLUDED
    

    So das wärs. Ich hab die Stellen mit ### gekennzeichnet. Und was ich auch nicht versteh bei einer Funktion (BotSay) greift der auf den vector string standards und gruss zu. Ich will aber das er nur auf gruss zugreift, und versteh auch nicht wie der auf vector string kommt. Hab ich da was mit den vectoren falsch verstanden oder so? Die sind doch jeder für sich mit einem namen gekennzeichnet und so kann keiner irgendwie auf den anderen zugreifen oder???



  • Der letzte gültige Index für einen Vector ist size() - 1. Das musst du bei der Ermittlung deiner Zufallszahl berücksichtigen.

    Und die Funktion GetString kannst du einfach durch std::getline ersetzen, die kann auch direkt in einen std::string einlesen.



  • 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