just trying to achieve similar functionality of C/C++ static local variables in ObjectPascal/Delphi.
Let’s have a following function in C:
bool update_position(int x, int y)
{
static int dx = pow(-1.0, rand() % 2);
static int dy = pow(-1.0, rand() % 2);
if (x+dx < 0 || x+dx > 640)
dx = -dx;
...
move_object(x+dx, y+dy);
...
}
Equivalent ObjectPascal code using typed constants as a static variable replacement fails to compile:
function UpdatePosition(x,y: Integer): Boolean;
const
dx: Integer = Trunc( Power(-1, Random(2)) ); // error E2026
dy: Integer = Trunc( Power(-1, Random(2)) );
begin
if (x+dx < 0) or (x+dx > 640) then
dx := -dx;
...
MoveObject(x+dx, y+dy);
...
end;
[DCC Error] test_f.pas(332): E2026 Constant expression expected
So is there some way for a one-time pass initialized local variable ?
There’s no direct equivalent of a C static variable in Delphi.
A writeable typed constant (see user1092187’s answer) is almost equivalent. It has the same scoping and instancing properties, but does not allow the one-time initialization that is possible with a C or C++ static variable. In any case it is my opinion that writeable typed constants should be shunned as a quaint historical footnote.
You can use a global variable.
You have to do the one-time initialization in the
initializationsection:Of course this make a mess of the global namespace unlike the limited scope of a C static variable. In modern Delphi you can wrap it all up in a class and use a combination of class methods, class vars, class constructors to avoid polluting the global namespace.