InitNetwork() can be called only once

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

InitNetwork() can be called only once

Beitrag von Kiffi »

Hallo,

ich schreibe derzeit ein Include, in dem Netzwerkfunktionalitäten verwendet
werden. Demzufolge führe ich dort ein InitNetwork() aus.

Wenn nun aber der Code, in dem ich das Include einbinde, ebenfalls ein
InitNetwork() verwendet, dann gibt es einen Debugger-Fehler:
Debugger hat geschrieben:[ERROR]: InitNetwork() can be called only once
wie kann man diese überflüssige Meldung unterdrücken?

Danke im voraus & Grüße ... Kiffi
a²+b²=mc²
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: InitNetwork() can be called only once

Beitrag von DarkDragon »

Kiffi hat geschrieben:Hallo,

ich schreibe derzeit ein Include, in dem Netzwerkfunktionalitäten verwendet
werden. Demzufolge führe ich dort ein InitNetwork() aus.

Wenn nun aber der Code, in dem ich das Include einbinde, ebenfalls ein
InitNetwork() verwendet, dann gibt es einen Debugger-Fehler:
Debugger hat geschrieben:[ERROR]: InitNetwork() can be called only once
wie kann man diese überflüssige Meldung unterdrücken?

Danke im voraus & Grüße ... Kiffi

Code: Alles auswählen

InitNetwork()
DisableDebugger
InitNetwork()
EnableDebugger
;-) So gehts.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

du kannst in deinem Include sowas einbaun:

Code: Alles auswählen

Procedure NetworkInit()
  ProcedureReturn 1
EndProcedure 

Macro InitNetwork()
  NetworkInit()
EndMacro
das verhindert, dass der andere Programmteil InitNetwork ein zweites Mal aufrufen kann.

... du musst dann allerdings dir was ausfuchsen, wie du von deiner Init-Routine
aus das native InitNetwork aufrufen kannst, ohne in deinem Macro zu landen...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

So läufts ohne Probleme:

Code: Alles auswählen

Procedure NetworkInit()
  Static IsNetWorkInit
  If Not IsNetWorkInit
    IsNetWorkInit = #True
    InitNetwork()
  EndIf
EndProcedure

Macro InitNetwork()
  NetworkInit()
EndMacro

; Zum Testen beide auskommentieren
InitNetwork()
InitNetwork()

CreateNetworkServer(1 ,80) ; Zum Testen
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> So läufts ohne Probleme:

echt? keine rekursion?
kewl!
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

Kaeru Gaman hat geschrieben:> So läufts ohne Probleme:

echt? keine rekursion?
kewl!
Keine Rekursion. Liegt vlt. daran das das Macro in der 1. Procedure noch nicht bekannt ist und der Compiler einfach dann die native Funktion verwendet.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Ich würd aber noch den letzten Rückgabewert zurückgeben:

Code: Alles auswählen

Procedure NetworkInit()
  Static IsNetWorkInit
  Static ReturnValue
  
  If Not IsNetWorkInit
    IsNetWorkInit = #True
    ReturnValue = InitNetwork()
  EndIf
  
  ProcedureReturn ReturnValue
EndProcedure
Wobei das ist ja schon blöd, was wenn InitNetwork nun nicht funktioniert hat, weil kein Netzwerk da ist, dann wartet man, der User installiert ein Netzwerk und nun ruft man wieder InitNetwork auf, welches einen Wert <> 0 zurückgeben sollte und der Debugger meckert das an.

D.h. der Nutzer muss erst das Programm neustarten, damit es das Netzwerk erkennen darf, oder wie darf man das verstehen?
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

So, das sollte jetzt korrekt sein:

Code: Alles auswählen

Procedure NetworkInit()
  Static IsNetWorkInit
  If Not IsNetWorkInit
    If InitNetwork()
      IsNetWorkInit = #True
    EndIf
  EndIf
  ProcedureReturn IsNetWorkInit
EndProcedure

Macro InitNetwork()
  NetworkInit()
EndMacro

; Zum Testen beide auskommentieren
Debug InitNetwork()
Debug InitNetwork()

CreateNetworkServer(1 ,80) ; Zum Testen
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Jungs, Ihr seid spitze! :allright:

Danke & Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Code: Alles auswählen

Procedure NetworkInit()
  Static IsNetWorkInit
  If Not IsNetWorkInit
      IsNetWorkInit = InitNetwork()
  EndIf
  ProcedureReturn IsNetWorkInit
EndProcedure

Macro InitNetwork()
  NetworkInit()
EndMacro

; Zum Testen beide auskommentieren
Debug InitNetwork()
Debug InitNetwork()

CreateNetworkServer(1 ,80) ; Zum Testen
So geht es auch ohne #True Flag und einer zweiten If-Abfrage.

Wenn mans so macht, kann man NetworkInit() ohne Probleme auch mehrmals aufrufen, falls die Initialisierung beim 1. Mal nicht geklappt haben solle. Es wird dann immer der korrekte Rückgabewert zurückgegeben und die Initialisierung ggf. nochmal versucht.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten