Prototype vs. Procedure – unterschiedl. Parameterdefinition

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Prototype vs. Procedure – unterschiedl. Parameterdefinition

Beitrag 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)
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
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Prototype vs. Procedure – unterschiedl. Parameterdefinit

Beitrag 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.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten