Doppeltes Init vermeiden

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Doppeltes Init vermeiden

Beitrag 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!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Doppeltes Init vermeiden

Beitrag 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()
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Doppeltes Init vermeiden

Beitrag von edel »

Ich wuerde es dann so machen :

Code: Alles auswählen

Import ""
	PB_Network_Objects
EndImport

If Not PB_Network_Objects
	InitNetwork()
EndIf

Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Doppeltes Init vermeiden

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Doppeltes Init vermeiden

Beitrag von RSBasic »

@ts-soft & @edel
:allright:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Antworten