statisch lokale Variablen (static)

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

statisch lokale Variablen (static)

Beitrag von siro »

Einen schönen guten Morgen zusammen,

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
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: statisch lokale Variablen (static)

Beitrag von Mathias »

Ist das ein "offizelles" Verhalten von Lazarus (bzw. FPC), also funktioniert das dann auch auf Microcontrollern ?

Ja das Verhalten ist normal, siehe segPos im folgendem Tutorial:

http://wiki.freepascal.org/AVR_Embedded ... ltiplex/de

Ich muss sagen, da hat C++ einen Vorsprung zu Pascal, mit dem Schlüsselwort const
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: statisch lokale Variablen (static)

Beitrag von m.fuchs »

Mathias hat geschrieben:Ich muss sagen, da hat C++ einen Vorsprung zu Pascal, mit dem Schlüsselwort const

Wie meinst du das?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: statisch lokale Variablen (static)

Beitrag von Mathias »

Ich meinte static, habe mich verschrieben. :cry:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: statisch lokale Variablen (static)

Beitrag von siro »

Oh, vielen Dank Mathias,
in deinem Link wird das ja exakt so gemacht im AVR Code.
Dann ist das also tatsächlich offizell.
Ich finde das absolut super, klar hätte man das auch static nennen können,
aber da es ja identisch funktioniert ist das okay.
Ich benutze das auch im Standard C so. (also ohne ++)

Das man eine Konstante verändert sieht schon etwas merkwürdig aus,
aber da hab ich schon erschreckendere Dinge in "C" erlebt.... :lol:
Siro
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: statisch lokale Variablen (static)

Beitrag von Mathias »

Ich finde das absolut super, klar hätte man das auch static nennen können,

Nur ist somit eine Konstante somit zweideutig. Eigentlich wäre eine Konstante ein Wert, der man zur Laufzeit nicht mehr ändern kann.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: statisch lokale Variablen (static)

Beitrag von m.fuchs »

Mathias hat geschrieben:Nur ist somit eine Konstante somit zweideutig. Eigentlich wäre eine Konstante ein Wert, der man zur Laufzeit nicht mehr ändern kann.

Wenn dich da (zurecht) stört, kannst du mit

Code: Alles auswählen

{$J-}

die Veränderbarkeit von typisierten Konstanten abschalten.

Wozu braucht man eigentlich lokale, statische Variablen?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: statisch lokale Variablen (static)

Beitrag von Mathias »

Wozu braucht man eigentlich lokale, statische Variablen?

Ich brauche sowas noch recht häufig.

Code: Alles auswählen

program Project1;
uses
  Crt;
 
  procedure bewege;
  const
    p: integer = 1;
  begin
    GotoXY(p, 10);
    DelLine;
    Write(' X');
    Inc(p);
    if p > 20 then begin
      p := 1;
    end;
  end;
 
begin
  repeat
    bewege;
    Delay(100);
  until KeyPressed;
end.

Oder willst du p lieber global ausserhalb deklarieren ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: statisch lokale Variablen (static)

Beitrag von m.fuchs »

Mathias hat geschrieben:Oder willst du p lieber global ausserhalb deklarieren ?

In diesem Fall: ja. Wenn ich p vor externen Zugriffen verstecken möchte, dann würde ich wohl OOP nehmen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten