Seite 1 von 1

Prototype vs. Procedure – unterschiedl. Parameterdefinition

Verfasst: 07.06.2020 11:46
von STARGÅTE
Hallo Leute,

was passiert eigentlich, wenn ich einer Prototyp-Variable eine nicht passende Prozedur übergebe?
Mit nicht passend meine ich hierbei die Anzahl der Parameter.
Nach der x64-Aufrufskonvention, welche ja auch in PB genutzt wird, sollte dies im Bereich von 0 bis 4 Parametern eigentlich keine rolle spielen,
da zuviel übergebene Parameter (also die Register) einfach nicht abgefragt werden und
zuwenig übergebene Parameter einfach den aktuellen Wert der Register nutzen.
Damit sollte es also nie zu Problemen mit dem Stack kommen, oder?

Code: Alles auswählen

Prototype.i Test(Alpha.i, Beta.i=-102)

Procedure Test1(Alpha, Beta.i=-2) ; Anderer Default-Wert für zweiten Parameter
	Protected Gamma.i = -3, Delta = -4
	Debug "Alpha = "+Alpha
	Debug "Beta = "+Beta
	Debug "Gamma = "+Gamma
	Debug "Delta = "+Delta
EndProcedure

Procedure Test2(Alpha, Beta.i) ; Zweiter Parameter ist nicht optional
	Protected Gamma.i = -3, Delta = -4
	Debug "Alpha = "+Alpha
	Debug "Beta = "+Beta
	Debug "Gamma = "+Gamma
	Debug "Delta = "+Delta
EndProcedure

Procedure Test3(Alpha) ; Zweiter Parameter fehlt
	Protected Gamma.i = -3, Delta = -4
	Debug "Alpha = "+Alpha
	Debug "Beta = "+Beta
	Debug "Gamma = "+Gamma
	Debug "Delta = "+Delta
EndProcedure

Procedure Test4(Alpha, Beta.i, Gamma.i=-103) ; Dritter Parameter optional
	Protected Blub.i = -3, Delta = -4
	Debug "Alpha = "+Alpha
	Debug "Beta = "+Beta
	Debug "Gamma = "+Gamma+" (undefiniert)"
	Debug "Delta = "+Delta
EndProcedure

Procedure Test5(Alpha, Beta.i, Gamma.i) ; Dritter Parameter nötig
	Protected Blub.i = -3, Delta = -4
	Debug "Alpha = "+Alpha
	Debug "Beta = "+Beta
	Debug "Gamma = "+Gamma+" (undefiniert)"
	Debug "Delta = "+Delta
EndProcedure



Define Call1.Test = @Test1()
Define Call2.Test = @Test2()
Define Call3.Test = @Test3()
Define Call4.Test = @Test4()
Define Call5.Test = @Test5()

Debug "Anderer Default-Wert für 2. Parameter"
Call1(123, 456)
Call1(123)
Debug "Zweiter Parameter ist nicht optional"
Call2(123, 456)
Call2(123)
Debug "Zweiter Parameter fehlt"
Call3(123, 456)
Call3(123)
Debug "Dritter Parameter optional"
Call4(123, 456)
Call4(123)
Debug "Dritter Parameter nötig"
Call5(123, 456)
Call5(123)

Re: Prototype vs. Procedure – unterschiedl. Parameterdefinit

Verfasst: 07.06.2020 12:34
von mk-soft
Habe mir die ASM Ausgabe angeschaut.
Sollte so kein Problem machen da bei X64 die aufgerufene Procedure mit einen gültigen Stack-Pointer zurückkehren muss.
Es ist nur das Problem das die fehlenden Parameter einen undefinierten Wert hat und irgendwas drin stehen kann.

Somit finde ich es immer besser mit optionalen Parameter zu arbeiten, wo der Wert auch festgelegt ist.