statisch lokale Variablen (static)

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

statisch lokale Variablen (static)

Beitragvon siro » 10. Feb 2018, 09:10 statisch lokale Variablen (static)

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...
siro
 
Beiträge: 305
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Mathias » 10. Feb 2018, 21:14 Re: statisch lokale Variablen (static)

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4327
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon m.fuchs » 10. Feb 2018, 21:18 Re: statisch lokale Variablen (static)

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
m.fuchs
 
Beiträge: 1970
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon Mathias » 10. Feb 2018, 21:31 Re: statisch lokale Variablen (static)

Ich meinte static, habe mich verschrieben. :cry:
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4327
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon siro » 10. Feb 2018, 22:05 Re: statisch lokale Variablen (static)

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...
siro
 
Beiträge: 305
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Mathias » 11. Feb 2018, 17:06 Re: statisch lokale Variablen (static)

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4327
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon m.fuchs » 11. Feb 2018, 17:58 Re: statisch lokale Variablen (static)

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
m.fuchs
 
Beiträge: 1970
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon Mathias » 11. Feb 2018, 18:08 Re: statisch lokale Variablen (static)

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4327
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon m.fuchs » 11. Feb 2018, 20:16 Re: statisch lokale Variablen (static)

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
m.fuchs
 
Beiträge: 1970
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

porpoises-institution
accuracy-worried