Seite 1 von 1

Doppeltes Init vermeiden

Verfasst: 12.04.2012 13:03
von ts-soft
Es gibt in PB ja eine menge Libs, die ein "Init" benötigen, z.B. InitNetWork().
Bei doppeltem Aufruf meckert der Compiler :mrgreen: , deshalb werden diese
Funktionen bei Templates (Bausteinen) meist weggelassen. Hier ein kleines
WorkAround, um diese Problem zu umgehen.
Das Beispiel ist jetzt für InitNetwork(), funktioniert nach entsprechender Anpassung
natürlich auch für die anderen Initfunktionen.

Code: Alles auswählen

CompilerIf Defined(InitNetworkEx, #PB_Procedure) = #False
Procedure InitNetworkEx()
  Static IsInit = #False

  If Not IsInit
    IsInit = InitNetwork()
  EndIf
  ProcedureReturn IsInit
EndProcedure

Macro InitNetwork()
  InitNetworkEx()
EndMacro
CompilerEndIf

; Beispiel, erzeugt normallerweise einen Fehler
InitNetwork()
InitNetwork()

Das ist jetzt nichts weltbewegendes, aber manchmal kommt man einfach nicht drauf :wink:

Der Code muss aber vor dem ersten InitNetwork() eingefügt werden!

Re: Doppeltes Init vermeiden

Verfasst: 12.04.2012 13:25
von NicTheQuick
Typisch. Verschachtelungen gehen natürlich mal wieder nicht in PB. /:->

Code: Alles auswählen

Macro Init(_NAME_)
	CompilerIf Defined(Init#_NAME_#Ex, #PB_Procedure) = #False
	Procedure Init#_NAME_#Ex()
	  Static IsInit = #False
	
	  If Not IsInit
	    IsInit = Init#_NAME_#()
	  EndIf
	  ProcedureReturn IsInit
	EndProcedure
	
	Macro Init#_NAME_#()
	  Init#_NAME_#Ex()
	EndMacro
	CompilerEndIf
EndMacro

Init(Network)
Init(Sound)
Init(Sprite)

; Beispiel, erzeugt normallerweise einen Fehler
InitNetwork()
InitNetwork()

Re: Doppeltes Init vermeiden

Verfasst: 12.04.2012 17:10
von edel
Ich wuerde es dann so machen :

Code: Alles auswählen

Import ""
	PB_Network_Objects
EndImport

If Not PB_Network_Objects
	InitNetwork()
EndIf


Re: Doppeltes Init vermeiden

Verfasst: 12.04.2012 17:26
von ts-soft
Das funktioniert aber nur für Deinen Code, nicht für fremde Templates, die InitNetwork() enthalten.
Wenn das nicht benötigt wird, finde ich die Variante allerdings auch besser als meine.

Re: Doppeltes Init vermeiden

Verfasst: 12.04.2012 18:21
von RSBasic
@ts-soft & @edel
:allright: