Fehler bei STATIC Variable initialization [erledigt]

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Fehler bei STATIC Variable initialization [erledigt]

Beitrag von Wolfgang_B »

Guten Morgen ..
Warum bekomme ich hier diesen Fehler?

error XBT0212: Illegal initialization of STATIC variable

Die Deklaration der Variable backupdat steht nach den #includes und vor der ersten Funktion

Code: Alles auswählen

#include "nls.ch"

// *************************************************
STATIC backupdat := DTOS(DATE())+"_"+SUBSTR(TIME(),1,2)+SUBSTR(TIME(),4,2)+SUBSTR(TIME(),7,2)+"_"        
 
FUNCTION CHECK_STRUCT()
.
.

Zuletzt geändert von Wolfgang_B am Sa, 23. Apr 2022 13:41, insgesamt 1-mal geändert.
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Fehler bei STATIC Variable initialization

Beitrag von Jan »

Moin Wolfgang,

offensichtlich darfst du außerhalb einer FUNCTION keine Funktionsrückgaben zuweisen. Normale Strings etc. gehen. Aber DTOS() oder Time() nicht.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Fehler bei STATIC Variable initialization

Beitrag von Wolfgang_B »

Hallo Jan,
da will man mal was Schönes machen .... wieder nix :?
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Fehler bei STATIC Variable initialization

Beitrag von Tom »

Genau. Wenn man komplexe Ausdrücke in STATICs packen will, muss man so agieren:

Code: Alles auswählen

FUNCTION MeinZeug()
STATIC xVar := NIL
IF xVAR == NIL
  * initialisieren
ENDIF
* Funktionscode
RETURN xReturnValue
Herzlich,
Tom
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Fehler bei STATIC Variable initialization

Beitrag von Wolfgang_B »

ich hätte es aber gerne ausserhalb einer Funktion, damit es für die gesamte Programmdatei gilt. Innerhalb einer Funktion kann ich ja auch eine LOCAL Variable verwenden (wie ich es jetzt auch schon hatte). Wollte das jetzt nur eleganter mit der STATIC Variable lösen, damit ich nicht in jeder Funktion der Programmdatei die Variable "backupdat" neu deklarieren muß.
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Fehler bei STATIC Variable initialization

Beitrag von Werner_Bayern »

Servus Wolfgang,
STATIC variables can be initialized with constants or literal arrays of any dimension and size, and the value must be known at compile time.
Jan liegt falsch, das gilt für alle Statics.

Toms Vorschlag zeigt, wie es auch mit prg-weiten Statics geht:

Code: Alles auswählen

#include "nls.ch"

// *************************************************
STATIC backupdat

FUNCTION CHECK_STRUCT()

IF backupdat == NIL
  backupdat := DTOS(DATE())+"_"+SUBSTR(TIME(),1,2)+SUBSTR(TIME(),4,2)+SUBSTR(TIME(),7,2)+"_"  
ENDIF
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Fehler bei STATIC Variable initialization

Beitrag von Tom »

Dann nimm eine Get-Set-Funktion dafür:

Code: Alles auswählen

FUNCTION BackupDate(dSetDate)
STATIC dBackupDate := NIL
IF dBackupDate == NIL
  dBackupDate := Date()
ENDIF
IF pCount() > 0
  dBackupDate := dSetDate
ENDIF
RETURN dBackupDate
Wenn Du "BackupDate()" verwendest, bekommst Du immer das eingestellte Datum. Du kannst das Datum aber setzen, indem Du die Funktion mit einem Parameter aufrufst. Danach bekommst Du dann immer dieses Datum zurück.
Herzlich,
Tom
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Fehler bei STATIC Variable initialization

Beitrag von Marcus Herz »

oder so:

Code: Alles auswählen

STATIC backupdat 
INIT PROC InitBackuppdat()
	backupdat := DTOS(DATE())+"_"+SUBSTR(TIME(),1,2)+SUBSTR(TIME(),4,2)+SUBSTR(TIME(),7,2)+"_"  
RETURN	
INIT Proc werden noch vor Appsys beim Laden der APP automatisch von Xbase aufgerufen
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Fehler bei STATIC Variable initialization

Beitrag von Wolfgang_B »

Villeicht verstehe ich das falsch. Die Gültigkeit der Static Variable soll nur für die eine Programmdatei gelten in der sie definiert ist ...
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Fehler bei STATIC Variable initialization

Beitrag von Werner_Bayern »

Dann nimm meine Lösung :wink:. Musst nur sicherstellen, dass die Abfrage

Code: Alles auswählen

IF backupdat == NIL
  backupdat := DTOS(DATE())+"_"+SUBSTR(TIME(),1,2)+SUBSTR(TIME(),4,2)+SUBSTR(TIME(),7,2)+"_"  
ENDIF
gleich als erstes, bzw. vor der ersten Benutzung der Variable in der prg ausgeführt wird, damit die Static-Variable korrekt belegt wird.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Fehler bei STATIC Variable initialization

Beitrag von Wolfgang_B »

Alles klar. Danke!
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Fehler bei STATIC Variable initialization [erledigt]

Beitrag von Marcus Herz »

Ich denke, es ist grundsätzlich so, dass STATIC Variablen bei Programmstart angelegt und gegebenenfalls initialisiert werden, und nicht erst, wenn eine Funktion in dem PRG aufgerufen wird. Auch wenn die Sichtbarkeit auf ein PRG begrenzt ist.
Wenn deine Initiialisierung funktionieren würde:

Code: Alles auswählen

****************************
STATIC backupdat := DTOS(DATE())+"_"+SUBSTR(TIME(),1,2)+SUBSTR(TIME(),4,2)+SUBSTR(TIME(),7,2)+"_"     
dann wäre das der Zeitpunkt des Programmstarts. Mir ist nicht klar geworden, welchen Zeitstempel du eigentlich benötigst.
- Zeitpunkt des Programmstarts => INIT PROC
oder
- Zeitpunkt wann du das erste Mal eine Funktion in dem PRG aufrufst. => Werners oder Toms Lösung
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Fehler bei STATIC Variable initialization [erledigt]

Beitrag von Wolfgang_B »

Hallo Marcus,
ich glaube ich hatte hier einen Denkfehler. Ich habe in der Programmdatei meine ganzen Backupfunktionen, die von unterschiedlichsten Funktionen außerhalb dieser Programmdatei aufgerufen werden. Insbesondere Backups von Dateien die geändert werden und für die ich eventuell einen Rollback machen muß. Hier brauche ich natürlich jedesmal den aktuellen Datum-Zeit Stempel. Insofern ist die Verwendung von einer Static-Variable an dieser Stelle sowieso nicht brauchbar.

Aber vielen Dank, an anderer Stelle sind die von Euch genannten Tipps sicher hilfreich.
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Fehler bei STATIC Variable initialization [erledigt]

Beitrag von georg »

Hallo,


auch wenn es eine andere Lösung gibt, möchte ich noch einen Lösungsansatz aufzeigen:

Code: Alles auswählen

STATIC sMyStatic
....
INIT PROCEDURE DatisSo
   sMyStatic := IrgendEineFunktion()
RETURN
Da die INIT PROCEDURE vor dem "normalen" Programmcode ausgeführt wird, ist so sichergestellt, dass die Static initialisiert ist, und man unterliegt nicht mehr den besonderen Bedingungen, was die Initialisierung von programm-weiten STATICs angeht.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Antworten