Ich glaube mich daran zu erinnern, dass eine Const-Deklaration innerhalb einer Prozedur nicht eine Konstante definiert, sondern eine statische Variable, welche beim verlassen/reentry der Prozedur ihre(n) vorherige(n) Wert(e) behält.
Von daher ist deine Verwendung mit Initialisierung in diesem Kontext eigentlich Unfug, da du eigentlich willst, dass die Variable ihre Werte vom vorherigen Durchlauf der Prozedur behält, welchem du mit der Initialisierung widersprichst.
"Const" in diesem Zusammenhang ist eine "unglückliche" Bezeichnung.
Was willst du eigentlich machen?
Proof of Concept
Code: Alles auswählen
program Project1;
{$mode ObjFPC}{$H+}
Function MyFunc(Const AReset:Boolean):Boolean;
Const Cnt:Integer=-4;
i:Integer=0;
Begin
If AReset Then i:=0;
Writeln('Cnt=',Cnt,' - i=',i);
Inc(Cnt);
Inc(i);
If i<5 Then Begin
Result:=True;
MyFunc(False) //Recursive call
end
Else
Result:=False;
End;
begin
MyFunc(True);
Writeln('Zweite Runde');
MyFunc(True);
Readln;
end.
ergibt
Code: Alles auswählen
Cnt=-4 - i=0
Cnt=-3 - i=1
Cnt=-2 - i=2
Cnt=-1 - i=3
Cnt=0 - i=4
Zweite Runde
Cnt=1 - i=0
Cnt=2 - i=1
Cnt=3 - i=2
Cnt=4 - i=3
Cnt=5 - i=4
Klar erkennbar, dass die Zeile "Const Cnt:Integer=-4;" nur beim absolut ersten Aufruf tatsächlich initialisiert, und bei nachfolgenden Aufrufen die Initialisierung ignoriert wird.
Dein Code
wird also genau einmal beim ersten Aufruf in der Schleife auch tatsächlich mit "leer" initialisiert, und bei den restlichen 60000 Durchläufen ignoriert.
Heisst auch im Umkehrschluss:
Dein
sollte in der Write-Zeile von 1 bis 60001 rennen.
Und solltest du WÄHREND der (äusseren) Schleife einen Wert im Array EINMALIG ändern (Bsp. arr.arr[42]:=42;), behält diese Array-Zelle diesen Wert in allen nachfolgenden Aufrufen.
heisst: Innerhalb deiner Prozedur solltest du dann ab dieser Zelle deine Fehlermeldung erhalten, welche jedesmal neu kommt bei den nachfolgenden Aufrufen der äusseren Schleife