Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi freiwillige Parameter (https://www.delphipraxis.net/101156-freiwillige-parameter.html)

jjep 9. Okt 2007 09:24


freiwillige Parameter
 
Hallo zusammen

Ich möchte eine eigene Funktion schreiben, bei der man nicht alle Parameter angeben muss:

Delphi-Quellcode:
function Multiplizieren(Faktor1: Integer; Faktor2: Integer; Faktor3: Integer): Integer;
Es sollte bei dieser Funktion jetzt möglich sein, nur zwei Faktoren mitzugeben.
Damit ich die Funktion auch folgendermassen aufrufen kann:
Delphi-Quellcode:
Resultat := Multiplizieren(4,5);
Der Faktor drei sollte dann in der kurz Hilfe in eckigen Klammern erscheinen.

Danke schon mals im voraus

xaromz 9. Okt 2007 09:27

Re: freiwillige Parameter
 
Hallo,

dazu musst Du einen Default-Wert definieren:
Delphi-Quellcode:
function Multiplizieren(Faktor1: Integer; Faktor2: Integer; Faktor3: Integer = 0): Integer;
Wenn Du einen Parameter weglässt, dann wird der Default-Wert genommen.

Das funktioniert aber natürlich nur am Ende der Parameterliste.

Gruß
xaromz

halinchen 9. Okt 2007 09:28

Re: freiwillige Parameter
 
Delphi-Quellcode:
function Multiplizieren(Faktor1: Integer; Faktor2: Integer; Faktor3: Integer = 1): Integer;
edit: Zu spät...

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: ....

SirThornberry 9. Okt 2007 09:29

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.

jjep 9. Okt 2007 09:34

Re: freiwillige Parameter
 
OKe alles klar danke vielmals :thumb:

sirius 9. Okt 2007 09:37

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.

xaromz 9. Okt 2007 09:39

Re: freiwillige Parameter
 
Hallo,
Zitat:

Zitat von SirThornberry
Denn bei der Variante mit den Defaultwerten würde es ja bedeuten das man diese Werte nicht übergeben kann.

Wie meinen? :gruebel:

Gruß
xaromz

Muetze1 9. Okt 2007 09:39

Re: freiwillige Parameter
 
Wenn es nur um Möglichkeiten geht, dann sollte man auch noch Delphi-Referenz durchsuchenoverload erwähnen.

Muetze1 9. Okt 2007 09:42

Re: freiwillige Parameter
 
Zitat:

Zitat von xaromz
Hallo,
Zitat:

Zitat von SirThornberry
Denn bei der Variante mit den Defaultwerten würde es ja bedeuten das man diese Werte nicht übergeben kann.

Wie meinen? :gruebel:

SirThomberry geht davon aus, das in der Routine eine Sonderbehandlung eingefügt wird, welche die Nutzung des optionalen Parameters ausklammert, wenn diese den angegebenen Defaultwert enthält. Damit wird die Nutzung von genau diesem Defaultwert in der letzten Option ausgeschlossen.

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...

SirThornberry 9. Okt 2007 09:47

Re: freiwillige Parameter
 
@Mütze: ok, das stimmt. daran hatte ich nicht gedacht.

jjep 9. Okt 2007 09:57

Re: freiwillige Parameter
 
Zerbrecht euch nicht den Kopf wegen mir.
Meine Funktion funktioniert super.
Danke

sirius 9. Okt 2007 11:01

Re: freiwillige Parameter
 
Zitat:

Zitat von jjep
Zerbrecht euch nicht den Kopf wegen mir.
Meine Funktion funktioniert super.
Danke

Es geht auch manchmal im Forum um prinzipielle Fragen von Lösungen (welche jetzt besser ist ect.) die durch simple Anfängerfragen ausgelöst werden und dann mehrere Seiten lang werden kann. :stupid:

SirThornberry 9. Okt 2007 11:08

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?

Muetze1 9. Okt 2007 11:24

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...

sirius 9. Okt 2007 13:26

Re: freiwillige Parameter
 
Nur über Umwege:
Man gibt als ersten Parameter mit, wieviele noch kommen. Oder der letzte Parameter ist ein definierter Wert.

Muetze1 9. Okt 2007 13:33

Re: freiwillige Parameter
 
Zitat:

Zitat von sirius
Oder der letzte Parameter ist ein definierter Wert.

Nicht eher der Erste? Der Letzte ist immer ESP-4...

sirius 9. Okt 2007 13:59

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)

Muetze1 9. Okt 2007 14:07

Re: freiwillige Parameter
 
Aso, stimmt, so kann man das auch noch betrachten. Klaro, wäre auch eine Möglichkeit...

Win32.API 9. Okt 2007 14:14

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.

sirius 9. Okt 2007 14:21

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 04:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz