Announcement

Collapse
No announcement yet.

Exception std::out_of_range Fehler

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Exception std::out_of_range Fehler

    Hallo zusammen...

    Ich hab folgendes Progrämmchen geschrieben und beim schreiben in die Datei bekomm ich nach dem 13. Eintrag eine Exception (s. Bild)

    Hier der Code:

    Code:
    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    #include <iostream.h>
    #include <fstream>
    #include <winsock.h>
    #include <stdio.h>
    #include <string>
    #include <stdexcept.h>
    
    using namespace std;
    using namespace System;
    //using std::string;
    
    
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    
    
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    
    }
    
    string ausgabetmp,temp;
    AnsiString inserttmp,datei,tmp;
    ofstream dat_aus;
    size_t found;
    
    int loschen,lines;
    
    
    
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    
    if (OpenDialog1->Execute())
    {
    datei = OpenDialog1->FileName;
    Edit1->Text = datei;
    ListBox1->Items->LoadFromFile(datei);
    }
    }
    
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    string endung = "._cu";
    string dateiname = datei.c_str();
    dateiname = dateiname + endung;
    dat_aus.open(dateiname.c_str(), ios_base::app);
    lines = ListBox1->Items->Capacity;
    
    for (int x = 0;x<=lines;x++)
    {
    tmp = "";
    temp = "";
    ausgabetmp = "";
    tmp = ListBox1->Items->Strings[x];
    ausgabetmp = tmp.c_str();
    temp = tmp.c_str();
    int len = ausgabetmp.size();
    found=ausgabetmp.find_first_of("abcdefaghijklmnopqrstuvwxyz");
    ListBox2->Items->Add(temp.substr(found-1,len).c_str());
    dat_aus << temp.substr(found-1,len).c_str() << endl;
    }
    }
    //-----------------------

    Kann mir jmd helfen?

    Ich weiss nicht was das sein soll...

    Danke schonmal im Vorraus...
    Attached Files
    Windows Mobile Tools

  • #2
    Hi,

    nun eine Vermutung, aber was passiert eigentlich, wenn der folgende Code nichts findet:

    Code:
    found=ausgabetmp.find_first_of("abcdefaghijklmnopqrstuvwxyz");
    ListBox2->Items->Add(temp.substr(found-1,len).c_str());
    Ich kenne mich in der Sprache zwar nicht, aber du scheinst die Länge der Zeichenkette in len zu speichern. Dann bestimmst du die Startposition von substr aber dynamisch. Musst du von der Länge nicht die Startposition abziehen? Oder muss hier die Endposition übergeben werden.

    Vielleicht bringen dich meine Anregungen ja weiter.
    "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)

    Viele Grüße Novi

    Comment


    • #3
      Der Code ist eine Vermischung aus der STL und der VCL. Wenn du mit der VCL programmierst nutze die Klasse String oder AnsiString für die Stringverarbeitung. Damit lassen sich schon 50% der Fehler vermeiden


      Der Fehler liegt hier:

      lines = ListBox1->Items->Capacity;

      Zwischen Capacity und Count ist ein entscheidener Unterschied
      Christian

      Comment


      • #4
        Originally posted by Stephan J. View Post
        int loschen,lines;
        Weshalb declarierst du global?


        lines = ListBox1->Items->Capacity;
        lines = ListBox1->Items->Count.

        Aber noch besser die variabele local definieren:
        int llines = ListBox1->Items->Count;


        for (int x = 0;x<=lines;x++)
        for (int x = 0;x<lines;x++)

        Comment


        • #5
          Mag sein aber der Fehler lag im Eintrag der ListBox1.

          Hatte nur a-z aufgenommen
          Code:
          found=ausgabetmp.find_first_of("abcdefaghijklmnopqrstuvwxyz");
          musst das aber so aufnehmen:
          Code:
          found=ausgabetmp.find_first_of("&abcdefaghijklmnopqrstuvwxyz");
          Der hat ja immer nach Pop abgebrochen und da nach Pop r&B kam hat er iwi das net ganz verstanden der alte borland 5.0.

          aber egal habs hinbekommen.. aber danke nochmal für die hilfe..

          Übrigens :

          Code:
          ListBox2->Items->Add(temp.substr(found-1,len).c_str());
          Das found ist die "vorerste Stelle" (deswegen - 1) und len ist die länge des einzelnden Strings.
          die sind bei jedem Schleifen durchlauf ne gesetzt:
          Code:
          tmp = ListBox1->Items->Strings[x];
          ausgabetmp = tmp.c_str();
          
          int len = ausgabetmp.size();
          tmp ist ja bei jedem durchlauf anders (String[x] -> X wird ja immer dekrementiert (x++) und somit ist tmp = ausgabetmp auch anders..

          mit dem
          Code:
          lines = ListBox1->Items->Capacity;
          Das weiss ich nicht aber es geht!

          MFG



          Originally posted by Christian Marquardt View Post
          Der Code ist eine Vermischung aus der STL und der VCL. Wenn du mit der VCL programmierst nutze die Klasse String oder AnsiString für die Stringverarbeitung. Damit lassen sich schon 50% der Fehler vermeiden


          Der Fehler liegt hier:

          lines = ListBox1->Items->Capacity;

          Zwischen Capacity und Count ist ein entscheidener Unterschied
          ----------------------------------
          // EDIT
          ----------------------------------

          Originally posted by Hans G View Post
          Weshalb declarierst du global?




          lines = ListBox1->Items->Count.

          Aber noch besser die variabele local definieren:
          int llines = ListBox1->Items->Count;




          for (int x = 0;x<lines;x++)
          Wie meinst du global?
          Zuletzt editiert von Stephan J.; 12.11.2009, 23:36. Reason: angehangen...
          Windows Mobile Tools

          Comment


          • #6
            Das weiss ich nicht aber es geht!
            Dann würde ich mal in der Hilfe zu Capacity und Count nachschlagen. Wenn dir hier jemand schon einen Hinweis gibt ist

            Das weiss ich nicht aber es geht!
            die falsche Reaktion
            Zuletzt editiert von Christian Marquardt; 13.11.2009, 10:47. Reason: Rechtschreibung
            Christian

            Comment

            Working...
            X