AND, OR, XOR

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
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

AND, OR, XOR

Beitrag von Josef Sniatecki »

Weil sich schon viele User unsicher waren, wie die logischen Verknüpfungen
AND, OR und XOR von PureBasic verarbeitet werden, werde ich mal hier
alles in diesem Thread klar machen.

Wir nehmen mal an, dass der Ausdurck vor der Verknüpfung "L" heißt und
der nach der Verknüpfung "R".

Code: Alles auswählen

If X() and Y()
In diesem Ausdruck, wird L (also "X()") immer ausgeführt. Ist L nicht
wahr, dann wird R erst garnicht begonnen. D.h. die Funktion Y() wird nicht
aufgerufen, wenn X() "0" zurückgibt.

Code: Alles auswählen

If X() Or Y()
Wenn L wahr ist, dann wird R nicht ausgeführt.

Code: Alles auswählen

If X() XOr Y()
Bei XOR werden immer L und R ausgeführt und ausgewertet. Es wird
also nie ein Ausdruck ausgelassen.

Wenn man über das alles bescheid weiß, kann man folgedes machen:

Code: Alles auswählen

If *Pointer And *Pointer\L=10
  ...
Man ist sich bewusst, dass "*Pointer\L" zu einem Fehler führen kann,
wenn "*Pointer" auf Null zeigt. Doch wenn *Pointer gleich 0 ist, dann
wird der zweite Ausdruck ("*Pointer\L=10") nach dem AND erst garnicht
ausgeführt. Und so kommt es dann auch nicht zu einem Fehler.



Ich hoffe ich konnte euch damit helfen.
Gruß Josef
PB 4.61 | Windows Vista - 32Bit
Homepage

"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

sorry, aber dein zweiter absatz ist nicht korrekt.

solche konstrukte ergeben nur sinn, wenn der vergleichs-operator
und der zuweisungs-operator verschiedene zeichen sind.

die abfrage ob *Pointer\L gleich 10 ist, ergibt nicht dann einen fehler,
wenn der pointer #Null ist, sondern dann, wenn er nicht Long strukturiert ist.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Die rede ist von einem Laufzeitfehler, nicht von einem Compilerfehler. Ist
*Pointer = 0 wird versucht an der Speicheradresse 0 ein Longwert aus zu
lesen.

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

hm...
so gesehen, ok, dann versteh ich den gedanken dahinter.

gibt ja nur mindestens 2^31 andere werte als 0 die nen IMA erzeugen,
sehr sinnvolle fehlervermeidung.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Ich nutz das eigentlich sehr häufig ... z.b. für übergabeparameter in
Prozeduren, die aber auch nicht unbedingt nötig sind. Und wenn man das
nicht möchte, bleibt es 0. Wenn AllocateMemory() fehl schlägt, wird 0
zurück gegeben. Alle 2^31 anderen Werte sind (in der theorie) also keine
Fehler. Und es geht auch nicht darum, alle möglichen Fehler aus zu
schließen, die irgend ein Programmierer machen könnte, sondern nur die
Offensichtlichen oder solche, die als Alternative funktionieren sollen :wink:

Wie war das noch mal, als Dieter Nur von "Unerwarteten Fehlern"
gesprochen hat? ... Super! Die anderen waren also alle erwartet :?
:D

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten