Bug oder nur eine Frage des verständnisses

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

freedimension hat geschrieben:Manchmal kann überzeugen echt schwer sein :)
OK, dann halte ich mich raus.

Ich würde Dir 2 Schritte empfehlen um Gewissheit zu bekommen:
1.) ASM-Code davon checken
2.) Mit Fred darüber reden (am besten im Chat, privat und in Ruhe)

Ich nehme mal an das Fred Dir das Gleiche sagt wie ich,
daß es bisher so angedacht war von links nach rechts zu
prüfen, und sobald etwas nicht wahr ist springt es raus.
Du kannst ihm dann selbst Lösungen aufzeigen und ihn
überzeugen. Oder es in die Referenz schreiben, und die
Sache somit klarstellen (links nach rechts; Klammern für
Eindeutigkeit verwenden).
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
MARTIN
Beiträge: 454
Registriert: 08.09.2004 14:03
Wohnort: Kiel

Beitrag von MARTIN »

Narmalerweise hat "AND" Vorrang vor "OR".
Sollte das in PB anders sein muss das geändert werden.
Amilo 1667|Suse Linux 10.1_64bit/WinXP |PB 4.00/3.94
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

das ist der mann der alles zweimal sagt. zweimal sagt.

warum sollte AND vorrang haben?
wer sagt das? wo steht das?
mit welcher begründung?

[edit]
in der help steht kein hinweis auf eine unterschiedliche wertigkeit
der beiden logischen verknüpfungen.
in meiner mathe-formelsammlung auch nicht.

> ...muss das geändert werden.

finde ich da ne echt anmassende aussage :?
Zuletzt geändert von Kaeru Gaman am 10.12.2004 19:05, insgesamt 2-mal geändert.
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

Code: Alles auswählen

a = 0
b = 0
c = 1
If a And b Or c
  d = 42
EndIf
ergibt

Code: Alles auswählen

; a = 0
  MOV    dword [v_a],0
; b = 0
  MOV    dword [v_b],0
; c = 1
  MOV    dword [v_c],1
; If a And b Or c
  CMP    dword [v_a],0
  JE    _AO_No0
  CMP    dword [v_b],0
  JE    _AO_No0
  CMP    dword [v_c],0
  JNE   _AO_Ok0
  JMP   _AO_No0
_AO_Ok0:
  MOV    eax,1
  JMP   _AO0
_AO_No0:
  XOR    eax,eax
_AO0:
  AND    eax,eax
  JE    _EndIf2
; d = 42
  MOV    dword [v_d],42
; EndIf
_EndIf2:
(habe IMHO unwichtigen Code weggelassen)
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Beitrag von helpy »

MARTIN hat geschrieben:Narmalerweise hat "AND" Vorrang vor "OR".
Sollte das in PB anders sein muss das geändert werden.
Es ist eindeutig anders in PB!

[ GELOESCHT ... nicht relevant, da PB anders funktioniert ]

Die Logik von PB scheint mir nicht ganz nachvollziehbar zu sein.

cu, helpy
Zuletzt geändert von helpy am 10.12.2004 22:57, insgesamt 1-mal geändert.
Exabot
Beiträge: 63
Registriert: 10.12.2004 09:50

Beitrag von Exabot »

@ Danilo

wenn Du recht hättest, müsste dann nicht der umgekehrte Fall, also:
1 and 1 or 0
nicht True ergeben ?

Code: Alles auswählen

Debug 1 and 1 or 0 ; Ergebnis 0 ?
(Bis eben wahr ich geneigt Dir zuzustimmen, jetzt verteh ich aber gar nicht mehr :? )

mfg
Spider

-----------
PB has no brain, use yur own!!
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Ob PB das so wie in C macht, beim ersten Falschen Ergebnis raus springt, oder ob das nicht so ist ...

^^das sollte unabhängig davon, ob Fred das "fixt" (verändert) oder so lässt in die PB Hilfe geschrieben werden ...

Damit zum einen auch Neulinge wissen, wie PB das hand habt und zum anderen, damit auch alle anderen sofort wissen, wie das ganze Funktionieren soll. (Damit wäre so eine Diskusion nie nötig gewesen :wink: ) ... aber Interezant isse alle mal, bin mal gespannt, was Fred dazu sagt.

Aber Andre ... bitte in die Hilfe schreiben :D ... mir ist nen problem mit den If's schon früh aufgefallen ... jetzt weis ich endlich den grund :o *gg*

Und ... wenn Fred das nicht als Bug ausgibt und PB wirklich bei dem ersten False die Abfrage abbricht, wäre ich dafür, es so zu lassen ... so kann man nämlich mehrere Abfragen eine machen, wo die 2, 3 usw. nicht abgefragt werden darf, wenn die davor Falsch ist :D ... sonnst musst man immer ne neue Abfrage machen. (ich mag nicht so gern viele If-Abfragen zu machen, lieber ne "längere" Zeile :D )

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Beitrag von helpy »

Spider hat geschrieben:@ Danilo

wenn Du recht hättest, müsste dann nicht der umgekehrte Fall, also:
1 and 1 or 0
nicht True ergeben ?

Code: Alles auswählen

Debug 1 and 1 or 0 ; Ergebnis 0 ?
Das ist aber nun wirklich ein Bug ... egal wie man es sieht
MARTIN
Beiträge: 454
Registriert: 08.09.2004 14:03
Wohnort: Kiel

Beitrag von MARTIN »

Bei mir ergibt das:

Code: Alles auswählen

If (1 and 1 or 0 and 0);oder (0 and 0 or 1 and 1)
  printN("Wahr")
Else
  printN("Falsch")   
EndIf
ergibt:"Falsch"
So als würden die operatoren von links nach rechts ausgewertet.
Aber dann müsste das beispiel von Spider:

Code: Alles auswählen

If (1 and 1 or 0)
  printN("Wahr")
Else
  printN("Falsch")   
EndIf
"Wahr" ergeben.Tut es aber nicht.

Das aber (mit dem gcc compilert):

Code: Alles auswählen

#include <iostream>
using namespace std;
int main()
{
  if(1 && 1 || 0 && 0) //oder (1 && 1 || 0) oder (0 && 0 || 1 && 1)
  {
     cout << "Wahr" << endl;
  }
  else
  {
     cout << "Falsch" << endl;
  }
  
  return 0;
}
ergibt:"Wahr"

Es gibt also eine kleine inkonsistenz was logische operatoren angeht.
> ...muss das geändert werden.

finde ich da ne echt anmassende aussage
ok ok war nur n Vorschlag, ich bestehe gar nicht darauf, aber warum nicht einfach rang der operatoren so wie in C/C++ setzten ?
Also "AND" vor "OR".
Amilo 1667|Suse Linux 10.1_64bit/WinXP |PB 4.00/3.94
Exabot
Beiträge: 63
Registriert: 10.12.2004 09:50

Beitrag von Exabot »

@ MARTIN

wenn ich Dein C-Beispiel nachvollziehe kommt And (&&) nicht
vor Or (||) sondern es wird der gesamte Ausdruck korrekt von
links nach rechts ausgewertet, ohne beim 1. False (0 && 0) abzubrechen.

Wenn ich mein 2. Beispiel ( 1 and 1 or 0 ) hernehme, stelle ich fest,
dass PB wohl auf gleicher Ebene (also ohne Klammern) nur 1 and oder or
korrekt auswertet.

Lösung: Wie seither auch - und von Danilo vorgeschlagen - () verwenden!

Gruss
Spider
Antworten