![]() |
freiwillige Parameter
Hallo zusammen
Ich möchte eine eigene Funktion schreiben, bei der man nicht alle Parameter angeben muss:
Delphi-Quellcode:
Es sollte bei dieser Funktion jetzt möglich sein, nur zwei Faktoren mitzugeben.
function Multiplizieren(Faktor1: Integer; Faktor2: Integer; Faktor3: Integer): Integer;
Damit ich die Funktion auch folgendermassen aufrufen kann:
Delphi-Quellcode:
Der Faktor drei sollte dann in der kurz Hilfe in eckigen Klammern erscheinen.
Resultat := Multiplizieren(4,5);
Danke schon mals im voraus |
Re: freiwillige Parameter
Hallo,
dazu musst Du einen Default-Wert definieren:
Delphi-Quellcode:
Wenn Du einen Parameter weglässt, dann wird der Default-Wert genommen.
function Multiplizieren(Faktor1: Integer; Faktor2: Integer; Faktor3: Integer = 0): Integer;
Das funktioniert aber natürlich nur am Ende der Parameterliste. Gruß xaromz |
Re: freiwillige Parameter
Delphi-Quellcode:
edit: Zu spät...
function Multiplizieren(Faktor1: Integer; Faktor2: Integer; Faktor3: Integer = 1): Integer;
Achja: Da du den Parameter als Konstant markieren musst, kannst du ihn in der Funktion auch nicht mehr verändern. edit2: Ich quatsche dämmliches Zeugs :wall: .... |
Re: freiwillige Parameter
Oder du übergibst ein Array. Oder wie die Funktion Format ein Array of const.
Denn bei der Variante mit den Defaultwerten würde es ja bedeuten das man diese Werte nicht übergeben kann. |
Re: freiwillige Parameter
OKe alles klar danke vielmals :thumb:
|
Re: freiwillige Parameter
Oder noch eine Möglichkeit: Du benutzt die Vorzüge der Aufrufkonvention CDECL.
Delphi-Quellcode:
program Project1; {$APPTYPE CONSOLE} function param4(a,b,c,d:integer):integer; cdecl; begin result:=a+b; end; var param2:function(a,b:integer):integer; cdecl; var param3:function(a,b,c:integer):integer; cdecl; begin param2:=@param4; param3:=@param4; writeln(param2(4,5) ,' ', param3(4,5,2) ,' ', param4(4,5,2,-12) ); readln; end. |
Re: freiwillige Parameter
Hallo,
Zitat:
Gruß xaromz |
Re: freiwillige Parameter
Wenn es nur um Möglichkeiten geht, dann sollte man auch noch
![]() |
Re: freiwillige Parameter
Zitat:
ABER: Da es sich in der Fragestellung um Faktoren handelt (laut Benennung), würde hier ein Default-Wert von 1 den erwünschten Erfolg bringen und keine Sonderbehandlung nötig machen. /EDIT: Sorry für den Doppelpost - nicht aufgepasst... |
Re: freiwillige Parameter
@Mütze: ok, das stimmt. daran hatte ich nicht gedacht.
|
Re: freiwillige Parameter
Zerbrecht euch nicht den Kopf wegen mir.
Meine Funktion funktioniert super. Danke |
Re: freiwillige Parameter
Zitat:
|
Re: freiwillige Parameter
Das bei cdecl es möglich ist verschieden viel auf den Stack zu packen war mir schon klar. Was mich dabei interessiert. Kann man irgendwie feststellen wieviel auf dem Stack liegt?
|
Re: freiwillige Parameter
Nur, wenn du den originalen Stack Pointer weisst - also ESP bevor der Aufrufer angefangen hat die Parameter auf den Stack zu legen...
|
Re: freiwillige Parameter
Nur über Umwege:
Man gibt als ersten Parameter mit, wieviele noch kommen. Oder der letzte Parameter ist ein definierter Wert. |
Re: freiwillige Parameter
Zitat:
|
Re: freiwillige Parameter
Ich meinte nicht auf dem Stack, sondern einfach in Pascal gedacht :zwinker:
(wenn z.B. Parameter "c" -1 ist, dann gibt es kein "d" mehr) |
Re: freiwillige Parameter
Aso, stimmt, so kann man das auch noch betrachten. Klaro, wäre auch eine Möglichkeit...
|
Re: freiwillige Parameter
Ueber diesen Umwege wuerde es gehen:
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE} uses windows; procedure foo(i1,i2,i3 : Integer); cdecl; var dwReturnAddress,dwParamCount : DWord; begin asm push dword ptr [ebp + 4] pop [dwReturnAddress] end; dwParamCount := pByte(dwReturnAddress + 2)^ div 4; writeln(dwParamCount); end; begin foo(1,2,3); readln; end. |
Re: freiwillige Parameter
Solange es weniger als 33 Parameter sind :mrgreen:
Edit: Muss mich korrigieren. Auf Grund von Big Endian klappt es auch, dass man auf einen integer mit pByte zugreifen kann --> also kleiner 65 Parameter |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz