Seite 1 von 1

Fehler bei STATIC Variable initialization [erledigt]

Verfasst: Sa, 23. Apr 2022 11:03
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()
.
.


Re: Fehler bei STATIC Variable initialization

Verfasst: Sa, 23. Apr 2022 11:17
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

Re: Fehler bei STATIC Variable initialization

Verfasst: Sa, 23. Apr 2022 11:23
von Wolfgang_B
Hallo Jan,
da will man mal was Schönes machen .... wieder nix :?

Re: Fehler bei STATIC Variable initialization

Verfasst: Sa, 23. Apr 2022 11:53
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

Re: Fehler bei STATIC Variable initialization

Verfasst: Sa, 23. Apr 2022 11:57
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ß.

Re: Fehler bei STATIC Variable initialization

Verfasst: Sa, 23. Apr 2022 12:26
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

Re: Fehler bei STATIC Variable initialization

Verfasst: Sa, 23. Apr 2022 12:28
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.

Re: Fehler bei STATIC Variable initialization

Verfasst: Sa, 23. Apr 2022 12:47
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

Re: Fehler bei STATIC Variable initialization

Verfasst: Sa, 23. Apr 2022 13:16
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 ...

Re: Fehler bei STATIC Variable initialization

Verfasst: Sa, 23. Apr 2022 13:20
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.

Re: Fehler bei STATIC Variable initialization

Verfasst: Sa, 23. Apr 2022 13:41
von Wolfgang_B
Alles klar. Danke!

Re: Fehler bei STATIC Variable initialization [erledigt]

Verfasst: Sa, 23. Apr 2022 14:30
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

Re: Fehler bei STATIC Variable initialization [erledigt]

Verfasst: Sa, 23. Apr 2022 15:58
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.

Re: Fehler bei STATIC Variable initialization [erledigt]

Verfasst: Sa, 23. Apr 2022 17:05
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.