Rekursion, undefiniertes Verhalten ?



  • trifft nur nicht ganz das Thema. Aber funktionieren tuts trotzdem ???
    Möglicherweise ist das if unnötig ?
    aber wie erwarte ich nun das ende der Rekursion, leider ist das Ende nur schwer vorzubestimmen, deshalb geht eine Fortschrittsanzeige auch nicht



  • Skym0sh0 schrieb:

    deshalb greifst du auf speicherbereiche ausserhalb des strigns zu...

    Das ist beim std::string völlig korrekt, nicht aber beim VCL-Typ AnsiString, dessen 'Zählung' beginnt bei 1, nicht wie üblich, bei 0. Stammt ürsprünglich aus Delphi...

    Was ist denn die Fehlermeldung genau? Respektive, welche Variable wird angemeckert?

    Gruß KK



  • Ich send mal mehr [...]

    class DirSearch
    {
    	private:
    		void __fastcall DirSearch::Search(AnsiString Root, std::string Filter, bool Subdirs, int Pathmode);
    	public:
    		String ListenOutput;
    		Boolean EscapePressed;
    		void __fastcall DirSearch::ListFiles(String Root, String Filter, bool Subdirs, int Pathmode);
    };
    
    DirSearch KATAL;
    	KATAL.ListenOutput = "";
    	Progress->Caption = "Suche...";
    	KATAL.ListFiles(DirectoryListBox1->Directory, Edit2->Text, CheckBox1->Checked, RadioGroup1->ItemIndex);
    	if (CB2->Checked)
    	{
    		std::string Posi;
    		std::ofstream File;
    		Posi = ModuleInformation("Appi",1);
    		Posi += Edit1->Text.c_str();
    		Posi += ".txt";
    		File.open(Posi.c_str());
    		File << KATAL.ListenOutput.c_str();
    		File.close();
    	}
    	else
    	{
        	std::string Posi;
    		std::ofstream File;
    		Posi = ModuleInformation("Appi",1);
    		Posi += "DO NOT DELETE ME !.txt";
    		File.open(Posi.c_str());
    		File << KATAL.ListenOutput.c_str(); // ÜHHH ACCESS DENIED
    		File.close();
    	}
    	Progress->Caption = "Wartet auf Benutzer";
    

    Tut mir leid hab nen Fehler gemacht, es wird AUSERHALB BENUTZT nicht in der anderen Funktion, komisch ist auch, das er angeblich so früh fertig ist, was gar nicht sein kann.



  • Step doch einfach mal mit dem Debugger durch.
    Dann siehst du was genau er macht - also wo er etwas anders macht als du es beabsichtigt hast. Meist ist dann schon offensichtlich *wieso* er etwas anders macht als du wolltest.



  • ja du hast recht mach ich.
    Aber ich war jetzt lange nicht da, aber nun frisch ans Werk



  • Ich hab einfach mal ein paar msgboxes eingebaut mit nem Bool.
    Nach ein paar reku durchläufen geht er raus.

    // deleted ! Nonsens

    Und er gibt mir verbotener Weis die MSG aus.
    GEHT ER AUCH RAUS WENN ICH NE FKT RAUS MACHE ? Dann MUSS er ja mit nem return raus !

    Edit 2: Ich lass mir das ma an eine Textbox übergeben und guck nach wo es hakt.

    //EDIT BEGRIFFLICHKEIT

    EDIT: Er ist möglicherweise doch fertig, aber er lässt den Zugriff nicht zu egal wo. Ich lass es mal als Fkt wiedergeben den String ist sicher schlauer.

    EDIT: Ich verstehe das nicht ? Jetzt dürfte dieser Fehler nicht mehr entstehen, aber er gibt immer noch den Fehler, ich werde jetzt mal sehen ob es an der Datei liegt ?

    Ich habs jetzt mit einer recht schlechten Methode gemacht und zwar die Klasse Global (wie nennt man das ? : Verb) und dann später die Infos abgerufen, der Konflikt entsteht nicht mehr.

    EDIT: Der String ist erst nach dem zweiten Aufruf gefüllt ? Nicht normal ! Ich seh mal nach woran es liegt.

    EDIT: Nein das liegt an der TextBox !



  • Wieso machst du mit Messageboxen rum, anstatt den Debugger zu verwenden?
    Breakpoint in der ersten Zeile der Funktion setzen, starten, durchsteppen, gucken was passiert. Sollte nicht so schwer sein.



  • war hier ungünstig, bei einer sehr hohen Rekursionstiefe hätte es Jahre gedauert, bis ich hinten angekommen wär. Wobei ich merk grad ich hätt sie vor der Verletzung setzen sollen, nicht in der Rekursion 🙄



  • Tim06TR schrieb:

    war hier ungünstig, bei einer sehr hohen Rekursionstiefe hätte es Jahre gedauert, bis ich hinten angekommen wär.

    Moderne IDEs bieten Conditional Breakpoints, die nur bei Eintreffen einer Bedingung ausgelöst werden. Notfalls schreibst du dir selbst eine If-Abfrage und setzt einen Breakpoint hinein (wahrscheinlich ist eine Zeile sinnloser Code notwendig).



  • Noch was...
    Kann es sein, dass es eine "Stack grenze" gibt, also kein Absturz sondern eine Einfrieren. Oder eine zu hohe Rekursionstiefe ?
    (Quelle Taskmanager): Er hat 124,xxx MB im Stack. Vorher wird er erheblich langsamer und stoppt dann vollends, kann ich dem Aus dem weg gehen ? Sobald die Festplatten partition zu viele Dateien besitzt ist Ende im Gelände.
    Dazu send ich mal die (VCL) Reku zur Katalogisierung:

    class DirSearch
    {
    	private:
    		void __fastcall DirSearch::Search(AnsiString Root, std::string Filter, bool Subdirs, int Pathmode);
    	public:
    		String ListenOutput;
    		Boolean EscapePressed;
    		void __fastcall DirSearch::ListFiles(String Root, String Filter, bool Subdirs, int Pathmode);
    		int Files;
    };
    
    void __fastcall DirSearch::Search(AnsiString Root, std::string Filter, bool Subdirs, int Pathmode)
    {
      // ListenOutput = "";
      EscapePressed = false;
      TStringList *Dirs=new TStringList();
      TSearchRec f;
      int FFRes;
      AnsiString Verz;
     // SB->SimpleText="Suche in: " + Root;
      if (Root[Root.Length()]=='\\')
    	Verz=Root+"*.*";
      else
        Verz=Root+"\\*.*";
      FFRes=FindFirst(Verz,0x10,f);   /* Verzeichnisse suchen */
      if (FFRes==0)
      {
    	while ((FFRes==0) && !EscapePressed)
        {
    	  EscapePressed=((GetAsyncKeyState(VK_ESCAPE) & 0x8000)>0);
          if ((f.Attr&0x10)==0x10)
          {
            ;//Dir
    		if (Subdirs)
              if (f.Name[1]!='.')
    			Dirs->Add(f.Name);
          }
    	  FFRes=FindNext(f);
        }
        FindClose(f);
      }
      if (Root[Root.Length()]=='\\')
    	Verz=Root + Filter.c_str();
      else
        Verz=Root + "\\" + Filter.c_str();
      FFRes=FindFirst(Verz,0x20,f);   /* Dateien suchen */
      if (FFRes==0)
      {
    	if (Pathmode==1)
    	{
    	  if (ListenOutput.Length()>0)
    		ListenOutput+=("\n");
    	  ListenOutput+=(Root);
    	  ListenOutput+=("\n");
    	  Files++;
    	}
        while ((FFRes==0) && !EscapePressed)
        {
          EscapePressed=((GetAsyncKeyState(VK_ESCAPE) & 0x8000)>0);
          if ((f.Attr&0x10)!=0x10)
          {
            ;//File
    		if (Pathmode==2)
            {
    		  if (Root[Root.Length()]=='\\')
    		  {
    			ListenOutput+=(Root+f.Name);
    			ListenOutput+="\n";
    		  }
    		  else
    		  {
    			ListenOutput+=(Root+"\\"+f.Name);
    			ListenOutput+="\n";
    		  }
            }
            else
    		{
    		  ListenOutput+=(f.Name);
    		  ListenOutput+="\n";
    		}
    		// FileAnz->Caption=FileAnz->Caption.ToInt()+1;
    	  }
          FFRes=FindNext(f);
        }
    	FindClose(f);
      }
      for (int i=0;i<Dirs->Count;i++)
      {
    	Application->ProcessMessages();
    	if (!EscapePressed)
        {
    	  if (Root[Root.Length()]=='\\')
    		Search(Root+Dirs->Strings[i],Filter,Subdirs,Pathmode);
    	  else
    		Search(Root+"\\"+Dirs->Strings[i],Filter,Subdirs,Pathmode);
        }
        else
    	{
    		break;
        }
      }
      delete Dirs;
    }
    


  • (Quelle Taskmanager): Er hat 124,xxx MB im Stack.

    nein, hat er nicht



  • 1. Was heißt das ? Es gibt folgende Auswahlmöglichkeiten:

    ____a. Ich definiere Stack falsch

    ____b. Der Taskmanager gibt falsche Angaben

    2. Und zum Thema ?



  • Ein kleine Größenänderung bei der grupierten schreibweise reicht schon, ist aber nicht verwertbar !

    D:\xampp\phpmyadmin\js\mooRainbow\images
    blank.gif
    moor_arrows.gif
    moor_boverlay.png
    moor_cursor.gif
    moor_slider.png
    moor_woverlay.png
    rainbow.png

    Jetzt zeigt tsgmgr nur 114.556 K statt 124.UNKNOWN K
    Ich versuchs nochmal in voller Schreibweise, aber das wird sicher nix bringen

    EDIT: Jetzt hats voll funktioniert mit einer größe von 299.976 K

    EDIT: Ich hab eine Auswahlmöglichkeit vergessen: falsche Einheit 😃


Anmelden zum Antworten