Umgekehrte Kompilierung von Parametern

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Umgekehrte Kompilierung von Parametern

Beitrag von Josef Sniatecki »

Hi,

ich habe da etwas bemerkt, was eigentlich nicht normal ist:

Code: Alles auswählen

Procedure.l GebeAus(Text.s)
  Debug Text
EndProcedure
Procedure.l Test(Parameter1.l,Parameter2.l)
  Debug "Test() wurde ausgeführt."
EndProcedure

Test(GebeAus("Hello"),GebeAus("World"))
Die Ausgabe lautet bei mir (V 4.0):

Code: Alles auswählen

World
Hello
Test() wurde ausgeführt.
Die Parameter werden in falscher Richtung ausgeführt. Ich habe mal den
selben Code in sämtlichen anderen Sprachen kompiliert. Die Ausgabe war
immer richtig herum ("Hello","World","Test() wurde...").

Ist das bei euch auch so? Denn ich habe 4.0 (Das Thema will ich nicht
wieder diskutieren. Ich werde mir schon bald die neue Version holen. :wink: )
Wenn ihr das selbe Problem habt, kann man dann dieses als Bug zählen?

Danke im Voraus.



mfg 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ß
Benutzeravatar
shadow
Beiträge: 189
Registriert: 23.03.2005 17:52
Wohnort: Lübeck

Beitrag von shadow »

Hi,

das hängt glaub ich mit der Parameterübergabe zusammen. Bei API-Aufrufen (bei irgend welchen Schnittstellen, weiß grad nicht genau welche) werden die Parameter auch in der anderen Reihenfolge übergeben.
Das hängt irgendwie damit zusammen, wie die Daten im Speicher abgelegt werden (LIFO-Prinzip = "last in, first out"). Wenn du in Assembler die Parameter holst fängst du auch mit dem letzten an.

Aber wie genau das jetzt funktioniert bin ich im Moment überfragt...
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Unter C ist es auch umgekehrt.
Als Bug kann man sowas nicht zählen, weil ja nirgends in der Hilfe steht, daß die Parameter der Reihe nach abgearbeitet werden.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Diesen Umstand habe ich schon vor 2 Jahren bemerkt.
Irgendwann seit dem hat freak auf noch ein paar Worte dazu verloren, glaube aber das war in einem anderen Thread. Den finde ich auf Anhieb aber nicht.

Mein Thread: PB dröselt Parameter von hinten auf?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

danke fü die Info

das erklärt nun auch meinen Bug den ich hatte wenn ich Dateien ausgelesen habe und "gleichzeitig" verarbeiten wollte:

Code: Alles auswählen

SetPoint2D(ReadFloat(1), ReadFloat(1))
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Jo, das ist doof, STARGATE. Was meinste, weshalb ich mir früher die Haare gerauft habe? Daran ist nur PB schuld - das ist schon meine 4. Perücke!! :lol:

Nochmal zur Info:
  • Bei Proceduren scheinen die Parameter von hinten abgearbeitet zu werden.
  • Bei If-Abfragen werden die Parameter von links nach rechts abgearbeitet. Beispiel:

    Code: Alles auswählen

    If OpenWindow() And CreateGadgetList()
    Es gibt genügend Beispiele in der Hilfe, die Zeilen wie diese Verwenden. Und wenn auch If von hinten arbeiten würde, hätte unser Josef Sniatecki bestimmt schon früher etwas gemerkt. :mrgreen:
  • Achtung bei If-Abfragen mit veränderter Reihenfolge bedingt durch Priorität! Ich habe es nicht getestet, könnte ja jemand noch tun, aber sicherlich führen Klammern bei If zu einer anderen Reihenfolge:

    Code: Alles auswählen

    If InitNetwork() And (CreateFile() Or FreeMemory())
    Ich vermute, hier wird erst CreateFile(), dann FreeMemory(), dann InitNetwork() aufgerufen.
  • Vorsicht bei falschen (un-wahren) Boolean-Werten!
    In folgendem Beispiel wird FreeMemory() nicht ausgeführt, wenn CreateFile() wahr ist, also erfolgreich ausgeführt wurde:

    Code: Alles auswählen

    If CreateFile() Or FreeMemory()
    Warum? Bei Or wird der rechte Ausdruck nur evaluiert (ausgewertet), wenn der linke Operand falsch (#False) ergibt. Ist der linke Teil aber bereits positiv bzw. True (wahr), dann ist es aus Gründen der Performance NICHT nötig, den rechten Teil auch noch auszuwerten!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

hier noch mal ein "Testbares" Beispiel:

Code: Alles auswählen

Procedure Wert(Chr$, Wahr)
 Debug Chr$
 ProcedureReturn Wahr
EndProcedure

Debug "Test 1 :"
If Wert("A",1) Or Wert("B",1) : EndIf
Debug ""

Debug "Test 2 :"
If Wert("A",0) And Wert("B",1) : EndIf
Debug ""

Debug "Test 3 :"
If ( Wert("A",1) And Wert("B",1) And Wert("C",0) ) Or Wert("D",1) : EndIf
Debug ""

Debug "Test 4 :"
If ( Wert("A",0) Or Wert("B",0) Or Wert("C",1) ) And Wert("D",1) : EndIf
Debug ""
Da man ja weiß wie der PC den Ausdruck auswertet, sollte man immer "mit ihm" zusammenarbeiten, und solche Ausdrücke so günstig wie möglich ordnen... sodass so wenig wie nötig Ausdrücke ausgewertet werden.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten