statische Variable

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

statische Variable

Beitragvon haderlump » 2. Jun 2018, 05:13 statische Variable

Hallo zusammen
Gibt es die Möglichkeit innerhalb einer Procedure statische Variable zu definieren, die also ihren Wert nicht nach Procedureende verlieren, sondern beim nächsten Aufruf wieder zur Verfügung stehen.
Oder geht das nur über gloale Variable?

Gruß Fritz
haderlump
 
Beiträge: 95
Registriert: 18. Jan 2013, 09:29
OS, Lazarus, FPC: Widows XP, Lazarus 1.6 | 
CPU-Target: Celeron
Nach oben

Beitragvon siro » 2. Jun 2018, 05:27 Re: statische Variable

Das sollte gehen:
So habe ich es zumindest schon ausprobiert und das scheint sich exakt wie "static" in "C" zu verhalten.

Code: Alles auswählen
const MeineVar : Integer = 1234;


Also vorn als "const" definieren,
dann einen beliebigen Init-Wert angeben,
der wird "automatisch" nur einmal beim Starten der Software gesetzt
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
siro
 
Beiträge: 290
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Niesi » 2. Jun 2018, 07:56 Re: statische Variable

Es geht auch mit var:

procedure xyz;
var
i : integer = 0;
i1 : integer = 0;
i2 : integer = 0;

...

Ist eigentlich Initieren, sollte aber "reichen" ...
Niesi
 
Beiträge: 40
Registriert: 26. Jun 2016, 18:44

Beitragvon m.fuchs » 2. Jun 2018, 08:58 Re: statische Variable

Das initiert aber den Wert bei jedem Aufruf die Variable wieder auf 0.
Der OP möchte aber den Wert vom Ende der Prozedur zum nächsten Aufruf mitnehmen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
m.fuchs
 
Beiträge: 1934
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 Warf » 2. Jun 2018, 13:07 Re: statische Variable

Afaik gibt es das in Pascal nicht.
MMn. auch aus gutem grund. Dabei handelt es sich technisch ja nur um eine globale variable, welche nur im lokalen scope verfügbar ist. Das macht unter C Sinn und hätte im rein Prozedualen programmieren bestimmt auch eine Existenzberechtigung (auch wenn es mMn. kein schöner programmierstil ist, ich würde eher globale variablen mit nem namensprefix verwenden), aber seit OOP braucht man das gar nicht mehr, da all die informationen die über die Methodenlaufzeit hinweg gespeichert werden müssen als private Feld der Klasse angelegt werden können. Kombiniert mit dem Singelton Muster benötigt man in den meisten fällen keine globalen variablen mehr, und statische variablen sind ja nichts anderes.

Edit: grad mit const ausprobiert, scheint doch zu gehen, irgendwie komisch, hätte ein solches verhalten mit const nicht erwartet
Zuletzt geändert von Warf am 2. Jun 2018, 13:12, insgesamt 1-mal geändert.
Warf
 
Beiträge: 796
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon siro » 2. Jun 2018, 13:10 Re: statische Variable

mit var geht das nicht,
aber mit const funktioniert es bei mir einwandfrei.

Code: Alles auswählen
 
procedure Test;
const x:integer = 0;    // var geht nicht !!!!!!!!!!
begin
  x:=x+1;
  form1.caption:=IntToStr(x);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Test;
end;         


benutzt man "var" wird bei jedem Wiedereintritt in die procedure Test der Wert x auf 0 gesetzt.
Bei const bleibt der Wert erhalten.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
siro
 
Beiträge: 290
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

Beitragvon m.fuchs » 2. Jun 2018, 13:12 Re: statische Variable

Warf hat geschrieben:Afaik gibt es das in Pascal nicht.

Wie kannst du denn sowas schreiben, wenn siro schon im zweiten Beitrag die Lösung geschrieben hat?

Warf hat geschrieben:auch wenn es mMn. kein schöner programmierstil ist

Definitiv ist das kein schöner Stil.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
m.fuchs
 
Beiträge: 1934
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 Warf » 2. Jun 2018, 13:14 Re: statische Variable

m.fuchs hat geschrieben:Wie kannst du denn sowas schreiben, wenn siro schon im zweiten Beitrag die Lösung geschrieben hat?


Hatte es mit const noch nicht ausprobiert gehabt, hab den post total überlesen, hatte auf die schnelle nur die "lösung" mit var gesehen, die nicht funktioniert. Ich dummerchen hatte bei const immer Konstanten im Kopf, hab an sowas nie gedacht
Warf
 
Beiträge: 796
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon m.fuchs » 2. Jun 2018, 13:20 Re: statische Variable

Warf hat geschrieben:Ich dummerchen hatte bei const immer Konstanten im Kopf, hab an sowas nie gedacht

Das ist eine furchtbare Altlast aus Turbo-Pascal-Zeiten. Wenn man einer Konstante einen Typ zuweist, dann ist sie nicht mehr konstant sondern eine statische Variable.

Mit der Compileroption
Code: Alles auswählen
{$J-}
kann man das deaktivieren. Dann verhalten sich auch typisierte Konstanten wirklich konstant.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
m.fuchs
 
Beiträge: 1934
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 siro » 2. Jun 2018, 13:32 Re: statische Variable

grad probiert, mit der Option {$J-} geht es wirklich nicht mehr. Da meckert der Compiler.

Auch wenn es nicht sonderlich schön aussieht, mag ich diese Möglichkeit, leider gibt es ja das Schlüsselwort static (meines Wissen nach) "noch" nicht in Pascal.
Es gibt aber auch zugegebenermaßen wenig sinnvolle Anwendungen dafür. Im Prinzip ist das ja, wie Warf schon schrieb, nur eine Globale Variable mit
geringer Sichtbarkeit (nur innerhalb der Procedure bzw. Funktion).
Fazit: Es geht, man muss es aber nicht unbedingt benutzen...
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
siro
 
Beiträge: 290
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Warf » 2. Jun 2018, 13:55 Re: statische Variable

m.fuchs hat geschrieben:Das ist eine furchtbare Altlast aus Turbo-Pascal-Zeiten. Wenn man einer Konstante einen Typ zuweist, dann ist sie nicht mehr konstant sondern eine statische Variable.

Mit der Compileroption
Code: Alles auswählen
{$J-}
kann man das deaktivieren. Dann verhalten sich auch typisierte Konstanten wirklich konstant.


Danke, das werd ich jetzt wohl öfter benutzen müssen. Ich bin immer davon ausgegangen das es richtige konstanten wären. Klar macht das bis auf ein paar kleinere Optimierungen nicht so viel aus, aber ich will wenn ich konstanten verwende sicher gehen das wenn ich Ausversehen eine Zuweisung o.ä. mache (z.B. als var parameter übergeben) der Compiler meckert.

siro hat geschrieben:Fazit: Es geht, man muss es aber nicht unbedingt benutzen...


Um noch eine Alternative zu zeigen mit einem Singelton objekt (wäre die alternative zu einer reinen funktion, nicht zu einer Methode, da solltest du einfach das zur klasse hinzufügen):
Code: Alles auswählen
unit XYUtils
{$Mode ObjFPC}{$H+}
type
  TXYUtilities = class
  private
    CurrentInt: Integer;
  public
    function GetNextInt: Integer;
end;
 
function XYUtilities: TXYUtilities;
implementation
var MyXYUtilities: TXYUtilities;
 
function XYUtilities: TXYUtilities;
begin
  if not Assigned(MyXYUtilities) then
    MyXYUtilities = TXYUtilities.Create;
  Result := MyXYUtilities;
end;
 
function TXYUtilities.GetNextInt: Integer;
begin
  Result := CurrentInt;
  Inc(CurrentInt);
end;

Benutzen dann
Code: Alles auswählen
uses ..., XYUtils;
...
  i := XYUtilities.GetNextInt;
Warf
 
Beiträge: 796
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon Mathias » 2. Jun 2018, 16:50 Re: statische Variable

Auch wenn es nicht sonderlich schön aussieht, mag ich diese Möglichkeit, leider gibt es ja das Schlüsselwort static (meines Wissen nach) "noch" nicht in Pascal.

Dies stimmt nicht ganz, in Classen kann man static verwenden.:
Code: Alles auswählen
type
  Tclass = class
    i: integer; static;  // Dies geht
  end


Aber in einer normalen procdure hätte ich es auch lieber so:
Code: Alles auswählen
procedure Test;
var
  i: integer = 123; static;
begin
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3873
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon siro » 3. Jun 2018, 06:17 Re: statische Variable

Guten Morgen zusammen:

Mathias hat geschrieben:Dies stimmt nicht ganz, in Classen kann man static verwenden.:
Code: Alles auswählen
type
  Tclass = class
    i: integer; static;  // Dies geht
  end



Da verstehe ich jetzt nicht.
Wenn ich eine Instanz einer Klasse anlege, dann sind die Eigenschaften doch IMMER static, (sie existieren solange bis ich die Instanz freigebe)
oder hab ich da jetzt einen Gedankenfehler,
was macht das static an dieser Stelle ?, wird hier lediglich eine Sichtbarkeit unterdrückt ?
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
siro
 
Beiträge: 290
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

Beitragvon mse » 3. Jun 2018, 06:48 Re: statische Variable

siro hat geschrieben:was macht das static an dieser Stelle ?, wird hier lediglich eine Sichtbarkeit unterdrückt ?

Alle Instanzen der Klasse beziehen sich auf die gleiche globale Variable.
mse
 
Beiträge: 1905
Registriert: 16. Okt 2008, 09:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0) | 
CPU-Target: x86,x64,ARM
Nach oben

Beitragvon siro » 3. Jun 2018, 07:34 Re: statische Variable

Ach echt :shock: das kannte ich noch garnicht.
Man lernt nie aus, Ich danke Dir mse.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
siro
 
Beiträge: 290
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

» Weitere Beiträge siehe nächste Seite »
Nächste

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 3 Gäste

cron
porpoises-institution
accuracy-worried