Exception willkürlich ausgelösst?



  • Ich hab versucht aus einem Char* eine Zeitewrt zu extrahieren. Das ist mein Testcode. Das komische an der Sache ist, das immer beim ersten mal (auch bei korrekten Zeitwerten) eine EConvertError-Exception ausgelösst wird und ewnn ich es dann aber anschließend gleich nochmal drüberlaufen lasse (nix verädnert) geht es aber.

    Dies war mein TestString

    [7:23:55 PM] OpenGL provider: Opengl32.dll

    __fastcall TForm1::~TForm1()
    {
      if (buffer) delete [] buffer;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      if (buffer)
        delete [] buffer;
      buffer = new char[editString->Text.Length()+1];
      buffer = editString->Text.c_str();
    
      TDateTime time;
      if (timeFunc(buffer, time))
        editTime->Text = time;
    }
    //---------------------------------------------------------------------------
    
    bool __fastcall TForm1::timeFunc(char* &timeStr, TDateTime &time)
    {
      bool isOk = true;
    
      try
      {
          char* foundFirst = strchr(timeStr, '[');
            ++foundFirst;
          char* foundLast  = strchr(foundFirst, ']');
    
          if (foundLast != 0 && *foundLast == ']')    //Endekennzeichen setzen
            *foundLast = '\0';
    
              try
              {
                time = StrToTime(foundFirst);
              }
              catch(EConvertError &err)
              {
                isOk = false;
              }
    
          if (foundLast != 0 && *foundLast == '\0')    //Endekennzeichen rücksetzen
            *foundLast = ']';
      }
      catch(...)
      {
        isOk= false;
      }
      return isOk;
    }
    //---------------------------------------------------------------------------
    


  • dann liegt es am Algorithmus der timeFunc() - nicht alles was erfolgreich kompilert wurde ist fehlerfrei. Wieso verwendest Du nicht einfacht DateTimeToStr(), DateToStr(), TimeToStr()?



  • Das es an timeFunc() liegt dachte ich mir auch, kann aber nix falsches finden beim debugen. Deine vorgeschalgenen Methoden nützen mir nix da ich nicht in String sonder von String in TDateTime wandeln möchte!

    Übrigens beim debugen habe ich festgestellt, das StrToTime() immer "7:23:55 PM" übergeben wird, also der korrekte Wert.



  • buffer = new char[editString->Text.Length()+1]; 
      buffer = editString->Text.c_str();
    

    Bevor ich überhaupt weiter denke: Was soll das hier werden?

    -junix



  • Ich muss noch kurz korrigieren. Ersteigt nur bei Werten mit AM/PM aus, die können nunmal aber auch vorkommen. Als Grund gibt er an, das er "7:23:55 P" nicht umwandeln kann, was klar ist, da das M fehlt.
    Ich versteh nur nicht warum das fehlt, da es beim aufrufen dr Übergabe mit übergeben wird. Und beim 2. Mal gehts ja dann, dann ist es auch plötzlich da??!! Echt verwirrend.

    @junix

    damit wollte ich eune neues char* erstellen und den Inhalt des Editfeldes reinkopieren und da er danach auch drinsteht bin ich davon ausgegangen das es geht und ich kein strcpy brauche.



  • Bigwill-u schrieb:

    Deine vorgeschalgenen Methoden nützen mir nix da ich nicht in String sonder von String in TDateTime wandeln möchte!

    Sorry, hab falsch geschrieben, aber es geht auch umgekehrt:
    StrToDateTime(), StrToDate(), StrToTime().



  • Die benutzt ich ja schau mal in die timeFunc.

    @junix
    thx. Hab den Fehler erkannt und korrigiert, jetzt gehts.



  • Vielleicht noch für die Allgemeinheit: Alles was Bigwill da oben produziert hat ist ein Memory-Leak. er hat Speicher reserviert und dann den Zeiger auf den Speicher mit dem temporär (und eigentlich schon ungültigen Zeiger) von c_str() überschrieben. Da dieser Zeiger dann ungültig wurde, wurde wohl auch die Exception eben so "sporadisch" geworfen, da manchmal vielleicht der Speicher überschrieben wurde und manchmal nicht. (o:

    -junix


Anmelden zum Antworten