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
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
Leute regen sich auf ^^

: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 ->

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
Und als was steht Defined() hinter CompilerIf? Als einer der beiden
Ausdrücke, die der Compiler auswertet

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
Leute regen sich auf ^^

:D
MFG PMV