Blitz übergibt Parameter in falscher Reihenfolge?!

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

PacMani

Betreff: Blitz übergibt Parameter in falscher Reihenfolge?!

BeitragSo, Jan 30, 2011 23:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallihallo,

ich habe zu später Stunde ein wirklich sehr merkwürdiges und grässliges Problem: Blitz scheint bei mir Parameter in falscher Reihenfolge zu übergeben.

Aber erst einmal Code:
Bei einem Funktionsaufruf lese ich 4 Strings aus einer Datei. Diese werden dann in vier Textboxen reingeschrieben. Aber immer steht der falsche Text in der falschen Textbox! An meinen Funktionen kann es eigentlich garnicht liegen, dazu gleich mehr.
Code: [AUSKLAPPEN]
SetupProperties(ReadString(File), ReadString(File), ReadString(File), ReadString(File))

Das ist im Grunde das Grundgerüst.

Erstens habe ich das Problem auch mit ReadByte und den anderen Read-Funktionen. Da werden Bytes, wenn sie so beim Aufruf einer Funktion gelesen werden, auch in irgendeiner mir nicht nachvollziehbaren Reihenfolge den Funktionen übergeben.

Zweitens: In der SetupProperties-Funktion werden die Argumente definitiv in der richtigen Reihenfolge verwertet:
Code: [AUSKLAPPEN]
Function SetupProperties(Author$, Name$, Music$, Powerwall$)
    WindowPropertiesTextAuthor\Value = Author
    WindowPropertiesTextName\Value = Name
    WindowPropertiesTextMusic\Value = Music
    WindowPropertiesTextPowerwall\Value = Powerwall
End Function
,
Drittens: Dieser Code funktioniert genau so wie er soll. Dabei ist die Logik dahinter doch absolut dieselbe, oder habe ich da was beim Lesen von binären Daten falsch verstanden?
Code: [AUSKLAPPEN]
Local AuthorName$ = ReadString(File)
Local LevelName$ = ReadString(File)
Local MusicFile$ = ReadString(File)
Local PowerwallTexture$ = ReadString(File)
DebugLog "AuthorName = " + AuthorName
DebugLog "LevelName = " + LevelName
DebugLog "MusicFile = " + MusicFile
DebugLog "PowerwallTexture = " + PowerwallTexture
SetupProperties(AuthorName, LevelName, MusicFile, PowerwallTexture)


Was ist hier los? Ich dreh' gleich durch... nein, bin ich schon Wink

Thunder

BeitragSo, Jan 30, 2011 23:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube das liegt einfach an der Eigenheit aller Compiler, dass sie Parameter rückwärts übergeben. Zuerst kommt der letzte, dann der vorletzte ...
Das führt dazu, dass das letzte ReadString zuerst verarbeitet wird, dann das vorletzte ...
Das wäre meine Vermutung.

mfg Thunder

Edit: Habe es gerade mit Holzchopf's Code getestet. Ist doch nicht ganz von hinten nach vorne.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit
  • Zuletzt bearbeitet von Thunder am Mo, Jan 31, 2011 0:08, insgesamt einmal bearbeitet

Vertex

BeitragSo, Jan 30, 2011 23:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
SomeFunction(FunctionA(), FunctionB(), FunctionC(), FunctionD(), FunctionE())
WaitKey()

Function SomeFunction(A%, B%, C%, D%, E%)
End Function

Function FunctionA%()
   Print("A")
End Function

Function FunctionB%()
   Print("B")
End Function

Function FunctionC%()
   Print("C")
End Function

Function FunctionD%()
   Print("D")
End Function

Function FunctionE%()
   Print("E")
End Function


->

Code: [AUSKLAPPEN]
D
E
C
B
A


Vermutung bei F(A1, A2, ..., An) wird An-1, An, An-2, An-3, ... A1 ausgewertet.

Ist das deterministisch?

Edit: In Java ist die Auswertung der Argumente übrigens von links nach rechts
vertex.dreamfall.at | GitHub
  • Zuletzt bearbeitet von Vertex am Mo, Jan 31, 2011 0:02, insgesamt einmal bearbeitet

Holzchopf

Meisterpacker

BeitragSo, Jan 30, 2011 23:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist nicht ganz rückwärts. Aber ja, die Reihenfolge ist definitiv nicht vorwärts...

BlitzBasic: [AUSKLAPPEN]
Global args$

Test1( Param(0), Param(1) )
Test2( Param(0), Param(1), Param(2) )
Test3( Param(0), Param(1), Param(2), Param(3) )
Test4( Param(0), Param(1), Param(2), Param(3), Param(4) )
Test5( Param(0), Param(1), Param(2), Param(3), Param(4), Param(5) )
Test6( Param(0), Param(1), Param(2), Param(3), Param(4), Param(5), Param(6) )

WaitKey()
End


Function Test1(a0,a1)
Print args
args = ""
End Function
Function Test2(a0,a1,a2)
Print args
args = ""
End Function
Function Test3(a0,a1,a2,a3)
Print args
args = ""
End Function
Function Test4(a0,a1,a2,a3,a4)
Print args
args = ""
End Function
Function Test5(a0,a1,a2,a3,a4,a5)
Print args
args = ""
End Function
Function Test6(a0,a1,a2,a3,a4,a5,a6)
Print args
args = ""
End Function

Function Param(pPar)
args = args +pPar
End Function


Sieht ganz so aus, als ob zuerst der vorletzte, dann der letzte Parameter und schlussendlich noch die anderen aber in umgekehrter Reihenfolge verarbeitet würden. Aber ich würde nichts darauf verwetten wollen, dass darauf Verlas ist Confused

mfG
Holzchopf

Edit
Gna... Da war der Vertex doch grad schneller =(
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

PacMani

BeitragMo, Jan 31, 2011 0:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist ja der blanke Horror! Na toll... also werde ich jetzt gezwungen, erst zwischenzuspeichern, ja? :S Ekelerregend. Aber naja.

BladeRunner

Moderator

BeitragMo, Jan 31, 2011 9:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Jop, in BB als auch in BMax ist die Reihenfolge der Auswertung NICHT strikt festgelegt. Daher sollte man sehr vorsichtig mit sich gegenseitig beeinflussenden Parametern beim Aufruf einer Funktion sein.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

PacMani

BeitragMo, Jan 31, 2011 18:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich schwöre: Ich mache es nie wieder. Zumindest beim Dateienlesen.

Grrr Razz

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group