Entwickler-Ecke
Sonstiges (Delphi) - STACK Overflow
M. Raab - So 26.01.03 16:33
Titel: STACK Overflow
Hallo NG,
in meinem Programm mußte ich den Stack vergrössern - das klappt auch recht gut. Ich mache das mit:
Quelltext
1: 2: 3:
| UNIT XYZ; Interface; {$M 16384,290000000} |
Vor allem nach einigen Programmaufrufen und während des Compilierens konnt es aber immer wieder mal zu Stack Overflows. Meine Frage nun: kann das damit zusammenhängen, dass ich die Größe nicht wieder reduziere beim Beenden reduziere ? Muss man den Stack irgendwie wieder frei geben ? Wenn man ihn wieder reduzieren muss, welche Größe ist ideal ?
Gruss
Markus
Udontknow - Mo 27.01.03 10:50
Hi!
Während des Kompilierens kommt es zum Stacküberlauf? Das hat dann aber nichts mit deiner Einstellung $M zu tun, diese setzt nur den Stack für das zu kompilierende Programm. Oder kommt es kurz nach dem Compilieren, sobald das Programm läuft, zum o.g. Fehler?
Hast du vielleicht irgendwelche eigenenen Komponenten in der IDE installiert? Diese würde ich dann mal überprüfen.
Stack-Überläufe werden häufig durch Rekursionen erzeugt.
Cu,
Udontknow
M. Raab - Mo 27.01.03 13:36
Hallo
der Stack Overflow wird zur Laufzeit erzeugt. Die Ursache sind aber keine Rekursionen sondern die Arrays. Ich benutze einige DLLs denen man Arrays mit übergeben muss. Diese Arrays sind aber so gross, dass es sofort zum Overflow kommen würde. Das ganze sieht so aus:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64:
| mmax=1000; nnxest=50; nnyest=50; LLWRK=(7*(NNXEST-4)*(NNYEST-4)+25*(NNXEST-4))*(NNXEST-3)+2*((NNXEST-4)+(NNYEST-4)+4*MMAX)+ 100+23*(NNXEST-4)+56; LLIWRK=MMAX+2*(NNXEST-7)*(NNYEST-7)+10;
type
TForm1 = class(TForm) .... private { Private-Deklarationen } public { Public-Deklarationen } end;
double_mmax = array[1..mmax] of double; double_lamda = array[1..NnXEST] of double; double_mu = array[1..NnYEST] of double; double_c = array[1..((NnXEST-4)*(NnXEST-4))] of double; double_lwrk = array[1..LLWRK] of double; integer_liwrk = array[1..LLIWRK] of integer;
double_xmx = array[1..1] of double; double_ymy = array[1..1] of double; double_fg = array[1..1] of double;
Func_PHI1 = function(Var Y:double):double;stdcall; Func_PHI2 = function(Var Y:double):double;stdcall; Func_F = function(Var X:double;Var Y:double):double;stdcall;
var
Form1 : TForm1;
xmax2 : double; xmin2 : double; ymax2 : double; ymin2 : double; zmin2 : double; zmax2 : double;
xmax1 : double; xmin1 : double; ymax1 : double; ymin1 : double; zmin1 : double; zmax1 : double;
lamda2 : double_lamda; lamda1 : double_lamda; mu1 : double_mu; mu2 : double_mu; c2 : double_c; c1 : double_c;
x2 : integer; x1 : integer; y2 : integer; y1 : integer; |
Den Array benutze ich dann in einer Prozedur mit:
Quelltext
1: 2: 3: 4: 5: 6:
| lx : double_mmax; ly : double_mmax; lz : double_mmax; lw : double_mmax; work : double_lwrk; iwork : integer_liwrk; |
Hier kommt es dann zur Laufzeit zum Overflow. Ich habe den $M Befehl benutzt und das funktioniert auch meistens. Nur ab und wann kommt der Overflow. Mach ich da was falsch ?
Gruss
Markus
Udontknow - Mo 27.01.03 18:50
Hmm, Arrays und Stack, wüsste nicht, daß das was miteinander zu tun hat.
Kann es sein, daß die DLL selber eine Rekursion durchführt, die in der o.g. Fehlermeldung dann endet?
Cu,
Udontknow
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!