AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Stack Overflow trotz iterativen Algorithmus
Thema durchsuchen
Ansicht
Themen-Optionen

Stack Overflow trotz iterativen Algorithmus

Ein Thema von stoxx · begonnen am 23. Aug 2003 · letzter Beitrag vom 24. Aug 2003
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#1

Stack Overflow trotz iterativen Algorithmus

  Alt 23. Aug 2003, 18:55
Hi zusammen,

ich kapier das nicht, und mein Kopf raucht gerade.
Ich habe keine rekursiven Algorithmen .. alles iterativ.
Trotzdem kommt bei meinen Berechnungen ein Stack Overflow.
Wie ist das denn nun mit dem Stack ? ..
Auf was sollte ich achten, damit mein Algorithmus trotzdem läuft ?
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Stack Overflow trotz iterativen Algorithmus

  Alt 23. Aug 2003, 19:21
Vielleicht reservierst du in jedem Iterationsschritt Stack-Speicher, den du nicht wieder freigibst. Poste doch mal den Code.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#3

Re: Stack Overflow trotz iterativen Algorithmus

  Alt 23. Aug 2003, 19:44
Zitat von Chewie:
Vielleicht reservierst du in jedem Iterationsschritt Stack-Speicher, den du nicht wieder freigibst. Poste doch mal den Code.

eigentlich nicht.
Wie reserviert man Stack Speicher ?
Ich dachte bisher immer, dass wenn man eine variable in einer Funktion oder prodedure definiert, dass diese nach dem Aufruf dieser Procedure wieder freigegeben wird.
Der Code ist eigentlich nicht weiter kompliziert, es werden nur in einem Array elemente einsortiert.
Das Array wird immer sortiert gehalten ...


Delphi-Quellcode:
<pre>
function search1 (was : intx ; wo : array of TDatensatz; var position : longint) : boolean;
       var mi,le,ri : LongInt;

       begin
           le := 0;
           ri := High(wo);
           repeat
               mi := (le + ri) div 2;
               If was < wo[mi].key Then ri := mi - 1 Else le := mi + 1;
           Until (wo[mi].key = was) Or (le > ri);
           if wo[mi].key = was then
             begin
               search1 := true;
               position := mi;
             end else
             begin
               search1 := false;
               if ri = -1 then position := 0 else
                begin
                 while ( wo[mi].key < was ) do inc(mi);
                 position := mi;
                end;

             end;
       End; // von search1

///////////////////////////////////////////////////////////////////////




procedure TStatistikFeld.increin(TD : TDatensatz);
var i : longint;
    position : longint;
    l : longint;



begin


if search1(td.key,afeld, position) then
 begin
    inc( afeld [position].anzahl );
 end else // von gefunden
 begin

   l := length(afeld);
   l := l +1;
   setlength(afeld, l );


   for i := l-1 downto position + 1 do
   afeld[i] := afeld[i-1];

   td.anzahl := 1;
   afeld[position] := TD;


 end; // von nicht gefunden

end; // von increin
</pre>
[edit=Christian Seehase] Delphi-Tags gesetzt. Bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit]
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Stack Overflow trotz iterativen Algorithmus

  Alt 23. Aug 2003, 19:46
Setz das bitte mal in Delphi-Tags, ich hab keine Lust mir das so anzusehen.
Stackspeicher reservierst du durch das Deklarieren einer lokalen Variable, durch das manuelle Zuweisen oder durch das Instantiieren einer Klasse.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Assarbad
(Gast)

n/a Beiträge
 
#5

Re: Stack Overflow trotz iterativen Algorithmus

  Alt 23. Aug 2003, 19:47
Für jede neue "Instanz" einer rekursiven Routine werden die lokalen Variablen neu auf dem Stack plaziert (denn jede hat ja ihre privaten lokalen Variablen).

Der Titel sollte also eher heißen: "Stack Overflow wegen rekursivem Algorithmus" ... denn das ist eine allgemeine Gefahr bei Rekursionen!

SORRY, HATTE ITERATION UND REKURSION DURCHEINANDER GEHAUEN. Vergiß meinen Beitrag einfach
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Stack Overflow trotz iterativen Algorithmus

  Alt 23. Aug 2003, 19:52
Zitat von Assarbad:
Für jede neue "Instanz" einer iterativen Routine werden die lokalen Variablen neu auf dem Stack plaziert (denn jede hat ja ihre privaten lokalen Variablen).
Was genau meinst du hier mit Instanz? Wenn ein Prozeduraufruf nach dem andern folgt, wird doch der reservierte Speicher nach dem Abarbeiten jeder Prozedur freigegeben. Oder etwa nicht?
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Stack Overflow trotz iterativen Algorithmus

  Alt 23. Aug 2003, 19:53
Moin stoxx,

kleiner Tip am Rande:
Verwende für den Rückgabewert der Funktion statt des Funktionsnamens lieber die, bei jeder Funktion intern vorhandene, Variable Result.
Die ist flexibler zu handhaben (kann z.B. in der Funktion auch auf der rechten Seite einer Zuweisung stehen, oder als Parameter verwendet werden).
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#8

Re: Stack Overflow trotz iterativen Algorithmus

  Alt 23. Aug 2003, 20:25
Hallo,

die eine Ursache habe ich gefunden.
Lag an einer Procedure vor dem Auruf.

ich hatte eigentlich getestet, ob ein array nach einer procedure Beendigung wieder freigegeben wird ohne dass man es auf setlength(ar,0); setzen muss, und das ging.
Ich weise einer property dieses array zu, da funktioniert das wahrscheinlich nicht mehr.
Ich habe das array jetzt global gemacht, da gehts.

Jetzt hab ich aber 5 Min später (in der Berechnung - dauert so lange)
gleich wieder ein neues Problem.

diesmal kommt die Meldung "Zu wenig Arbeitsspeicher"
Obwohl noch Massen Platz ist ..
Meine Exe ist 52 MB im Speicher groß.
Habe 1 GB Hauptspeicher ..
komisch ?!? *grrr*
  Mit Zitat antworten Zitat
Assarbad
(Gast)

n/a Beiträge
 
#9

Re: Stack Overflow trotz iterativen Algorithmus

  Alt 23. Aug 2003, 20:39
Zitat von Chewie:
Was genau meinst du hier mit Instanz? Wenn ein Prozeduraufruf nach dem andern folgt, wird doch der reservierte Speicher nach dem Abarbeiten jeder Prozedur freigegeben. Oder etwa nicht?
Schwer zu erklären ... Instanz soll heißen "Kontext eines Aufrufes einer Routine ..." genauer kann ich es nicht ausdrücken.
Exakt Chewie ... der Speicher wird freigegeben ... ABER ERST nachdem alle aufgerufenen "Instanzen" der Routine beendet sind. Je nach Rekursionstiefe wird also die Menge und größe der lokalen Variablen (und natürlich auch der allozierten Heapbereiche auf den Speicherbedarf Einfuß nehmen.
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Stack Overflow trotz iterativen Algorithmus

  Alt 23. Aug 2003, 20:40
Genau, je nach Rekursiontiefe. Aber es geht hier um eine Iteration, also Rekursionstiefe = 1 = 1 "Instanz" gleichzeitig.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz