Seite 1 von 1
Umgekehrte Kompilierung von Parametern
Verfasst: 18.09.2008 13:01
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):
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.

)
Wenn ihr das selbe Problem habt, kann man dann dieses als Bug zählen?
Danke im Voraus.
mfg Josef
Verfasst: 18.09.2008 13:14
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...
Verfasst: 18.09.2008 13:24
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.
Verfasst: 18.09.2008 13:29
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?
Verfasst: 18.09.2008 13:42
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:
Verfasst: 18.09.2008 13:59
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!!
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: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.

- 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: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: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!
Verfasst: 18.09.2008 14:36
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.