Aktuelle Zeit: 21.05.2013 09:15

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Doppeltes Init vermeiden
BeitragVerfasst: 12.04.2012 13:03 
Offline
CodeCommander
Benutzeravatar

Registriert: 08.09.2004 00:57
Wohnort: Berlin
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:
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.11 | Windows 7 SP1 (x64) | Linux Mint 14 (x64) | RealSource
Bild
Der CodeCommander, der seine Finger sowohl von Windows 8, wie auch dem Monitor lässt!


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Doppeltes Init vermeiden
BeitragVerfasst: 12.04.2012 13:25 
Offline
StudiMod oder sowas in der Art
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Homburg (Saar)
Typisch. Verschachtelungen gehen natürlich mal wieder nicht in PB. /:->
Code:
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()

_________________
Bild

NEU! Elektronik, Bastelei, Verrücktes, Interessantes, Schlaues, alles in Text, Bild und Ton? Klick hier! NEU!
Linux Mint 14 x64, PureBasic 5.11 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10)

Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Doppeltes Init vermeiden
BeitragVerfasst: 12.04.2012 17:10 
Offline
Benutzeravatar

Registriert: 28.07.2005 12:39
Ich wuerde es dann so machen :

Code:
Import ""
   PB_Network_Objects
EndImport

If Not PB_Network_Objects
   InitNetwork()
EndIf


_________________
Suche


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Doppeltes Init vermeiden
BeitragVerfasst: 12.04.2012 17:26 
Offline
CodeCommander
Benutzeravatar

Registriert: 08.09.2004 00:57
Wohnort: Berlin
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.11 | Windows 7 SP1 (x64) | Linux Mint 14 (x64) | RealSource
Bild
Der CodeCommander, der seine Finger sowohl von Windows 8, wie auch dem Monitor lässt!


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Doppeltes Init vermeiden
BeitragVerfasst: 12.04.2012 18:21 
Offline
Moderator
Benutzeravatar

Registriert: 05.10.2006 18:55
Wohnort: Überall
@ts-soft & @edel
:allright:

_________________
Bild Bild
Bild PureBasic 5.10 x86/x64 Bild| Downloads | WinAPI Library | Tipps und Tricks | Backups (23.03.2013) (+89 Dateien (308 MB))
Das Benutzen von EnableExplicit ist kostenlos und vermeidet Fehler. | Gib Goto keine Chance. | Avira? Nein Danke.


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye