Seite 2 von 3

Re: Alle Computer im LAN auflisten »»» GetComputerNameInLAN

Verfasst: 29.12.2010 15:38
von Nino
ts-soft hat geschrieben:
CSHW89 hat geschrieben:Siehst du denn das '~' vor den 'Defined's nicht :mrgreen:

lg kevin
[...]
Trotzdem, unmöglicher Stil.
So ist es, denn ~ operiert auf Bits, und Defined() liefert als Ergebnis einen logischen Wert. Ein Compiler mit strengerer Typüberprüfung würde solchen Code gar nicht ausführen.

Re: Alle Computer im LAN auflisten »»» GetComputerNameInLAN

Verfasst: 29.12.2010 16:07
von STARGÅTE
So ist es, denn ~ operiert auf Bits, und Defined() liefert als Ergebnis einen logischen Wert. Ein Compiler mit strengerer Typüberprüfung würde solchen Code gar nicht ausführen.
Das ist Quatsch!
Hinweis: Hatte die Antwort falsch verstanden

~ ist Bitweise Not !
also %...0001 würde %...1110 werden, was immer noch <> 0 ist !
Zum Beispiel wäre ~1 = -2 und ~0 = -1

Deswegen geht der Code nur, wenn Defined() %...0000 zurück gibt, und dann %...1111 daraus wird!

Was du meinst wäre Not, was aber beim CompilerIf nicht nutzbar ist!

Code: Alles auswählen

CompilerIf ~Defined(True, #PB_Constant)
 Debug "~1"
CompilerEndIf

CompilerIf ~Defined(Laber, #PB_Constant)
 Debug "~0"
CompilerEndIf

CompilerIf Defined(True, #PB_Constant) = 0
 Debug "1=0"
CompilerEndIf

CompilerIf Defined(Laber, #PB_Constant) = 0
 Debug "0=0"
CompilerEndIf

Re: Alle Computer im LAN auflisten »»» GetComputerNameInLAN

Verfasst: 29.12.2010 17:15
von Nino
STARGÅTE hat geschrieben:
So ist es, denn ~ operiert auf Bits, und Defined() liefert als Ergebnis einen logischen Wert. Ein Compiler mit strengerer Typüberprüfung würde solchen Code gar nicht ausführen.
Das ist Quatsch!
Richtig, deine Antwort ist Quatsch.
Wenn Du verstanden hättest was ich geschrieben habe, wäre sie evtl. anders ausgefallen.
STARGÅTE hat geschrieben:~ ist Bitweise Not !
Gut erkannt. Deshalb hatte ich auch geschrieben:
~ operiert auf Bits
STARGÅTE hat geschrieben:also %...0001 würde %...1110 werden, was immer noch <> 0 ist !
Zum Beispiel wäre ~1 = -2 und ~0 = -1

Deswegen geht der Code nur, wenn Defined() %...0000 zurück gibt, und dann %...1111 daraus wird!
Wäre, hätte, könnte, ...
Defined() gibt einen logischen Wert zurück, d.h. #True oder #False, und logische Werte sind nicht aus diversen Bits zusammengesetzt. Dass PB z.Z. für #True 1 und für #False 0 verwendet ist eine ganz andere Sache. Das kann sich im Prinzip morgen ändern und liegt wie schon gesagt daran, dass der PB-Compiler keine strenge Typüberprüfung durchführt.
STARGÅTE hat geschrieben:Was du meinst wäre Not, was aber beim CompilerIf nicht nutzbar ist!
Nein, was ich meine ist dass man z.B. statt

Code: Alles auswählen

CompilerIf ~Defined(True, #PB_Constant)
   Debug "Hallo"
CompilerEndIf
besser schreiben sollte

Code: Alles auswählen

CompilerIf Defined(True, #PB_Constant) = #False
   Debug "Hallo"
CompilerEndIf
Das funktioniert durchaus.

Re: Alle Computer im LAN auflisten »»» GetComputerNameInLAN

Verfasst: 29.12.2010 19:39
von STARGÅTE
Ja sry, habe deine Antwort falsch verstanden.

Trotzdem frag ich dich:
"Defined() gibt einen logischen Wert zurück, d.h. #True oder #False"
Du meinst also Defined() hat den gleichen "Rückgabetypen" wie ein Vergleich A=B, C<D, welcher also Wahr und Falsch sein kann?
Sowas gibts meiner Meinung nach nicht in PureBasic.
Defined() ist eine "Funktion" wie jede andere welche eben nur 0 und 1 zurück gibt, was mit dem Wahr und Falsch wie wir es kennen nichts zu tun hat.
Deswegen schreiben wir ja auch
Defined(True, #PB_Constant) = #False
Weil wir hier die Zahl 1 mit #False also 0 vergleichen und nicht Wahr und Falsch.

Re: Alle Computer im LAN auflisten »»» GetComputerNameInLAN

Verfasst: 29.12.2010 20:35
von PMV
:?

Defined() ist eine Compilerdirektive wie ein selbst erstelltes Macro.
Genau genommen wird der Compiler damit direkt gesteuert, den
dieser schaut hier in einer internet Liste nach, ob die Variabe,
Konstante, usw. bekannt ist oder nicht und compiliert den
nachfolgenen Codeblock oder eben nicht, da er nur
mit CompilerIf zulässig (und sinnvoll) ist.

MFG PMV

Re: Alle Computer im LAN auflisten »»» GetComputerNameInLAN

Verfasst: 29.12.2010 21:17
von Max_der_Held
haha :D

Leute regen sich auf ^^ :D:D
ich wäre für diese Lösung:

Code: Alles auswählen

Macro Nicht 
  ~
EndMacro 


CompilerIf Nicht Defined(haus, #PB_Constant) 
   Debug "Hallo"
CompilerEndIf

ODER, auch für ~programmierer (Nicht-programmierer) leichter verständlich:

Code: Alles auswählen

Macro Wenn_Haus_defined_ist
  CompilerIf ~ Defined(haus, #PB_Constant) 
EndMacro 

Macro Dann_schreibe_hallo
  Debug "hallo"
EndMacro 

Macro Und_gehe_nach_Haus_e
  CompilerEndIf 
EndMacro 


Wenn_Haus_defined_ist
dann_schreibe_hallo
Und_gehe_nach_Haus_e
Wahlweise beim 1. Code "nicht" mit "nott" ersetzen..

frohe Feiertage :)

Re: Alle Computer im LAN auflisten »»» GetComputerNameInLAN

Verfasst: 29.12.2010 21:35
von STARGÅTE
@PMV

Alles klar, es gibt also garkein Typ ^^

@Max_der_Held

Wir waren uns doch alle einig das ~ (Bitweise Not) hier falsch ist!
(Scheinbar bin ich nicht der einzige, der hier einiges durcheinander wirft)

Code: Alles auswählen

Macro Nicht 
  ~
EndMacro 
CompilerIf Nicht Defined(True, #PB_Constant) 
   Debug "Hallo"
CompilerEndIf 
#True gibt es aber , also sollte der Code nicht ausgeführt werden.

Dein Macro muss so lauten:

Code: Alles auswählen

Macro Nicht 
  0 =
EndMacro 
CompilerIf Nicht Defined(True, #PB_Constant) 
   Debug "Hallo"
CompilerEndIf 

Re: Alle Computer im LAN auflisten »»» GetComputerNameInLAN

Verfasst: 29.12.2010 21:47
von Max_der_Held
ah ja sry.. folgendig stimmts..:

Code: Alles auswählen

Macro Wenn_Haus_defined_ist
  CompilerIf ((~Defined(haus,#PB_Constant)) & %00000001)
EndMacro 

Macro Dann_schreibe_hallo
  Debug "hallo"
EndMacro 

Macro Und_gehe_nach_Haus_e
   CompilerEndIf 
EndMacro 

#haus = 1

Wenn_Haus_defined_ist
dann_schreibe_hallo
Und_gehe_nach_Haus_e
CompilerEndIf

ps.. was ich mich frage.. warum es mit dem "doppelten" compilerendif geht, solange die Konstante definiert ist.. sobald man sie rausnimmt sagt er "doppeltes compilerendif"
Makro-fehler?..

pps: dein Code ist aber auch ausgefeilt!. Respekt -> :allright:

Re: Alle Computer im LAN auflisten »»» GetComputerNameInLAN

Verfasst: 29.12.2010 23:27
von Nino
PMV hat geschrieben::?

Defined() ist eine Compilerdirektive wie ein selbst erstelltes Macro.
Genau genommen wird der Compiler damit direkt gesteuert, den
dieser schaut hier in einer internet Liste nach, ob die Variabe,
Konstante, usw. bekannt ist oder nicht und compiliert den
nachfolgenen Codeblock oder eben nicht, da er nur
mit CompilerIf zulässig (und sinnvoll) ist.

MFG PMV
Nein, der Compiler wird nicht direkt von Defined() gesteuert, sondern von CompilerIf.
CompilerIf vergleicht 2 Ausdrücke miteinander, die Steuerung ist abhängig vom Ergebnis des Vergleichs. Einer der beiden Ausdrücke ist in diesem Fall Defined(). Defined() gibt an, ob des betr. Objekt bereits definiert ist oder nicht, es ist offensichtlich dass der Wert also entweder #True oder #False ist.

Re: Alle Computer im LAN auflisten »»» GetComputerNameInLAN

Verfasst: 30.12.2010 00:07
von PMV
:lol:

Und als was steht Defined() hinter CompilerIf? Als einer der beiden
Ausdrücke, die der Compiler auswertet :wink: Und da wir hier tatsächlich
nur vom Compiler reden, der hier sein verhalten ändert, gibs hier auch
keine klassischen Rückgabewerte wie es in einem Programm wäre. Das
Defined() intern natürlich als Ergebnis ein "Rückgabewert" hat, der mit
dem 2. Audruck verglichen wird ... ist ja wohl klar :? ... aber wie Max
schon schrieb:
Max_der_Held hat geschrieben:haha :D

Leute regen sich auf ^^ :D:D
MFG PMV