Ich habe eine Frage zum Verhalten von Variablen:
In "C" gibt es ja für loakle Variablen (also nur innerhalb der Funktion sichtbar) das Schlüsselwort static.
Das ist im Prinzip eine Globale Variable, die ihren Inhalt auch nach dem Verlassen der Funktion beibehält,
jedoch nur innerhalb der Funktion auch sichtbar ist.
Sie befindet sich demnach nicht auf dem Stack sondern im Datensegment
In Lazarus hab ich jetzt festgestellt, gelesen, weis ich auch nicht mehr genau
man kann hier die Variablen als const deklarieren und auch entsprechend initialisieren.
Das hab ich jetzt mal ausprobiert und bin POSITIV überrascht worden,
denn das funktioniert ja ausgezeichnt. Das entspricht, meiner Meinung nach, exakt dem Verhalten von static "C"
Ich habe eine Integer optimierte Filterfunktion geschrieben und hier müssen einige Werte erhalten bleiben und beim nächsten Aufruf wieder verwendet werden.
Da es mehrere Filter gibt, müsste ich sonst die Variablen global halten und dann auch
jeweils einen anderen Namen vergeben. Das macht das Ganze nicht sonderlich übersichtlich, da diese Variablen
ja nur innerhalb der eigentlichen Funktion wieder benötigt werden.
Wenn man diese dann als const MyConst:Integer=0; deklariert, funktioniert es augenscheinlich
exakt wie das Schlüsselwort static in C.
So haben in mehreren Filterfunktionen die Variablen den gleichen Namen sind aber dennoch
nur innerhalb der Funktion verfügbar und behalten auch ihre Werte.
Das sieht dann so aus:
Code: Alles auswählen
function FilterTP_10(value:Integer):Integer; // Tiefpass
const d = 3991; // Filter Centerfrequenz 10 Hz bei Samplerate 1KHz
const n : Integer = 0; // static local (im Datensegent)
const rest : Integer = 0; // static local (im Datensegent)
var xx : Integer = 0; // local auf dem Stack
begin
value:= value - n;
xx := value * d;
rest := (xx + rest) MOD 65536;
xx := (xx + rest) DIV 65536;
n := n + xx;
result:=n;
end;
function FilterTP_50(value:Integer):Integer; // Tiefpass
const d = 17668; // Filter Centerfrequenz 50 Hz bei Samplerate 1KHz
const n : Integer = 0; // static local (im Datensegent)
const rest : Integer = 0; // static local (im Datensegent)
var xx : Integer = 0; // local auf dem Stack
begin
value:= value - n;
xx := value * d;
rest := (xx + rest) MOD 65536;
xx := (xx + rest) DIV 65536;
n := n + xx;
result:=n;
end;
// info: d:=(1-exp(-(2*pi*Centerfrequenz) / Samplerate)) * 65536;
Ist das ein "offizelles" Verhalten von Lazarus (bzw. FPC), also funktioniert das dann auch auf Microcontrollern ?
Ich habe es nur in der Windows Umgebung mit Lazarus 1.8.0 getestet.
Siro