Runtime Error



  • Hi!
    Könnt ihr mir mal sagen wieso dieser Code ein Runtime Error bringt?

    int s_packets = 0;
        int posit2= 0;
        while(s_packets<=packets & packets != 0)
        {
              string temp_buffer;
              temp_buffer = data.substr (posit2,250);
    
              posit2 += 250;
              char ctemp_buffer [251];
              strncpy(ctemp_buffer, temp_buffer.c_str(),251);
              result = send(s,ctemp_buffer,251,0);
              if (result == 0)
              {
                       //Die Verbindung wurde von der Gegenseite zurückgesetzt
                       return 0;
              }
              s_packets++;
        }
    

    Offenbar hängt der Fehler mit dieser Code-Stelle zusammen:

    posit2 += 250;
    

    wenn ich diese Stelle rausnehme oder nur in ein + Zeichen nehme, stürzt das Programm nicht ab, aber ich brauche diese stelle, da ich die Position höchzählen muss!

    Danke im Voraus an alle die sich die Mühe machen mein Code anzuschauen...



  • Du gehst davon aus, dass ab Position posit2 noch 250 Zeichen im String vorhanden sind. Wenn das nicht der Fall ist, kracht es eben.
    Der Debugger kann dir übrigens immer sagen, wo und warum ein Fehler auftritt.



  • Hi
    Danke für diesen Hilfreichen post. Ich benutze Dev-Cpp, da ich mit VC++ nicht klar komme, da mein code nicht funktioniert, weil dynamische arrays nicht erlaubt sind. Habe aber keine Peilung wie man diese Umgehen kann. Vieleicht finde ich das ja noch via google herraus, dann kann ich es ja nochmal mit VC++ versuchen. Jedenfalls funktioniert der Debugger von Dev-Cpp nicht sonderlich gut 🙄



  • Dann zitiere ich mich mal aus einem anderen Thread:

    Nanyuki schrieb:

    Wenn du sowieso schon MinGW benutzt, würde ich Code::Blocks als IDE empfehlen.
    Du startest dein Programm mit dem Debugger mit Debug/Step into. Wenn jetzt eine segmentation fault auftritt (und das ist mit großer Sicherheit das, was bei dir passiert) wird dein Programm angehalten, du kannst dir den Callstack ansehen und sämtliche Werte aller Variablen anschauen.
    Desweiteren kannst du dein Programm bis zu einer bestimmten Zeile laufen lassen (Rechtsklick/Run to cursor) und dann zeilenweise abarbeiten lassen (Debug/next line bzw. F7) um zu schauen, wo das Problem ist. Natürlich kannst du dabei auch jederzeit alle Variablenwerte überwachen.
    So sind die meisten Probleme in unter einer Minute gefunden - der Debugger ist einer der größten Freunde jedes Programmierers.

    cobra11freak-_- schrieb:

    weil dynamische arrays nicht erlaubt sind. Habe aber keine Peilung wie man diese Umgehen kann.

    Wieso sollen dynamische Arrays in VC++ nicht erlaubt sein?
    Davon abgesehen ist std::vector Arrays sowieso fast immer vorzuziehen.



  • vll hilft dir das hier ja, hatte ich das letzte mal für jmd hier geschrieben:
    habs auch gerad noch ma angeguckt - sollte funktionieren^^

    struct connection
    {
    private:
      SOCKET sock;
    public:
    //....
      void send(const std::string &to_send);
    };
    
    void send(const std::string &to_send)
    {
    	int len;
    	for(std::string::size_type sent = 0, tosend(request.size()+1); sent != tosend; sent += len)
    	{
    		len = ::send(sock, to_send.c_str()+sent, tosend-sent, 0);
    		if(len == SOCKET_ERROR)
    		{//evtl noch weitere unterscheidungen/hier sind auch andere möglichkeiten denkbar
    			throw std::runtime_error("Cannot send blabla");
    		}
    	}
    }
    

    das hier versendet nen kompletten string mit nullterminierung...

    bb



  • Hi
    So ich habe es jezt nochmal mit VC++ probiert.
    Nachdem ich die Winsoock fehler ausgemärzt habe, bleiben noch 7 Feheler.

    error C2057: Konstanter Ausdruck erwartet
    error C2466: Zuordnung eines Arrays der konstanten Größe 0 nicht möglich.

    char sBuffer3 [lauf.size()+1];
                        strncpy(sBuffer3, lauf.c_str(), lauf.size()+1);
                        result = send (s,sBuffer3,strlen(sBuffer3),0);
    

    bei dieser konvertierung von string zu char[]



  • char Array müssen eine konstante Grösse übergeben bekommen. Ansonsten musst du wohl einen (Standard-)Container benutzen.


Anmelden zum Antworten