![]() |
Rückgabe
Ich will eine funktion bzw. procedure (?) machen die mir etwas zurückgibt.
Beispiel:
Delphi-Quellcode:
Label1.Caption := FloatToStr(Doppelt(1));
Delphi-Quellcode:
ich möchte möglichst vermeiden eine eigene variable für die rückgabe deklarieren zu müssen
procedure Doppelt(x: Real);
begin gib zurück: x*2; //Was muss ich machen damit ich x*2 als rückgabe bekomme? end; kann mir da jemand helfen? hab gesucht aber nix gefunden |
Re: Rückgabe
Ein Prozedur die etwas zurüch gibt heißt Function.
Delphi-Quellcode:
Grüße
function testFunc:byte
begin result := 123; end Klaus |
Re: Rückgabe
achso ok vielen dank :)
hab noch nie was mit rückgaben gemacht deshalb^^ kann mann denn auch mehrere sachen zurückgeben lassen? |
Re: Rückgabe
Eine Funktion kann nur einen Wert zurückgeben. Du könntest Dir aber z.B. einen Recordtyp definieren und diesen dann zurückgeben.
|
Re: Rückgabe
Es gibt auch Prozeduren, die dir etwas zurückgeben: (HIERBEI SIND MEHRERE OUT-/VAR-PARAMETER MÖGLICH)
Delphi-Quellcode:
Nach dem Aufrufen von blah(a, b) nimmt b den neuen Wert (y + x; also b + a) an.
procedure blah(x: integer; out y: integer);
begin y := y + x; end; procedure blah2; var a, b: inetger; begin a := 1 b := 2; balh(a, b); //b = 3! end; möglich ist auch:
Delphi-Quellcode:
//Edit: Schreibfehler :stupid:procedure blah(out a, b, c: integer; out x: extended {...}); |
Re: Rückgabe
Hi,
Jain. Man kann z.B. auch Klassen/records zurückgeben und somit indirekt mehrere Daten zurückgeben:
Delphi-Quellcode:
Gruß
type
TDaten = record Zahl: Integer; Text: String; end; function GibDaten: TDaten; begin Result.Zahl := 5; Result.Text := 'Fünf'; end; Neutral General |
Re: Rückgabe
Delphi-Quellcode:
funtioniert auch!
function testFunc:byte
begin testFunc := 123; end |
Re: Rückgabe
@Neutral: das hab ich doch eben schon gesagt ;)
|
Re: Rückgabe
Zitat:
Zitat:
|
Re: Rückgabe
ok also ich hab das jetzt soweit bleibt nur noch eine frage.
also ich habe hier diese prozedur die den schnittpunkt von zwei linien zurückgeben soll. Das ganze sieht jetzt so aus:
Delphi-Quellcode:
wie man siehst hab ich zwei ausgaben: SX (schnittpunkt X) und SY (Schnittpunkt Y).
procedure GetColPoint(D: string; X1,Y1,X2,Y2,X3,Y3,X4,Y4,Side: Integer; out SX,SY: Real);
var A1,B1,C1, A2,B2,C2: Real; begin if X1 = X2 then X1 := 0; if Y1 = Y2 then Y1 := 0; A1 := -(1/(X2-X1)); B1 := (1/(Y2-Y1)); C1 := (X1/(X2-X1)) - (Y1/(Y2-Y1)); A2 := -(1/(X4-X3)); B2 := (1/(Y4-Y3)); C2 := (X3/(X4-X3)) - (Y3/(Y4-Y3)); SX := (B1*C2-C1*B2) / (A1*B2-A2*B1); SY := (C1*A2-C2*A1) / (A1*B2-A2*B1); end; so. das problem ist ich kann ja jetz zB nicht einfach auf ein panel schrieben da ich ja zwei rückgaben habe wie nehme ich mir also erst nur die eine dann die andere rückgabe raus? |
Re: Rückgabe
Ja ich hab den roten Kasten gesehn und geguckt was da steht und da hab ich nur das mit den var/out Parametern in Proceduren gelesen und weil ich nicht gedacht hätte das inzwischen schon wieder 2 (!) neue Antworten aufgetaucht sind hab ich den Kasten ignoriert -.-^^
|
Re: Rückgabe
Zitat:
Da kannst Du dann x und y auf einmal übergeben. Grüße Klaus |
Re: Rückgabe
in diesem Fall würde ich eine Funktion nehmen, die einen TPoint zurückgibt. Und dann halt:
Delphi-Quellcode:
Evtl. auch anderer Seperator anstatt ";" :zwinker:
//P1: TPoint;
Panel1.Caption := IntToStr(P1.X) + ';' + IntToStr(P1.Y); //Edit: roter Kasten kam nicht?! :wall: |
Re: Rückgabe
Zitat:
Damit wird deine Parameterschlacht deutlich reduziert:
Delphi-Quellcode:
Hinweis: um einen x- und y-Wert in einen TPoint zu verwandeln, gibt es die Funktion Point().
function GetColPoint(D: string; P1,P2, P3,P4 : TPoint; Side: Integer):TPoint;
begin ... // dein Job Result.x := ... Result.y := ... end; // Aufruf var ausgabepos : TPoint; begin ausgabepos := GetColPoint(.....); Labelx.Caption := inttostr(ausgabepos.x); Labely.Caption := inttostr(ausgabepos.y); |
Re: Rückgabe
Das mit dem Point ist eigendlich eine gute idee aber ich will die prozedur in ein 3D spiel einbauen deswegen muss ich danach sowieso noch eine weitere prozedur machen die drei rückgaben macht (X,Y,Z)
|
Re: Rückgabe
mach einen eigenen Record:
Delphi-Quellcode:
type
T3dPoint = record X, Y, Z: integer; end; |
Re: Rückgabe
wohin kommt der teil mit type..?
|
Re: Rückgabe
vor / nach der Deklaration von TForm1
|
Re: Rückgabe
Delphi-Quellcode:
[Fehler] Physik.pas(116): Objekt oder Klassentyp erforderlich
type
Collision = record X,Y,Z: Real; end; Collision.Y := GetColPoint(...); [Fehler] Physik.pas(118): Nicht genügend wirkliche Parameter <- Es sind aber genauso viele [Fataler Fehler] Unit1.pas(56): Verwendete Unit 'Physik.pas' kann nicht compiliert werden ... :gruebel: |
Re: Rückgabe
Hi,
du schreibst auch nicht
Delphi-Quellcode:
oder?
Integer := 5;
:arrow:
Delphi-Quellcode:
Gruß
var Abc: Collision:
begin Abc.x := 1; Neutral General |
Re: Rückgabe
ja ok das war schonmal doof lol
aber aus inerfindlichen gründen bekomme ich immernoch die felhermeldung [Fehler] Physik.pas(120): Nicht genügend wirkliche Parameter obwohl ich auf alle parameter was gesetzt hab |
Re: Rückgabe
wenn du schreibst
Delphi-Quellcode:
dann musst du auch später so weitermachen:
type
Collision = record X,Y,Z: Real; end; //... function GetColPoint{...}: TCollision;
Delphi-Quellcode:
var
Collision: TCollision; begin Collision := GetColPoint(...); |
Re: Rückgabe
:wiejetzt: ..
iwie wird mir das zu kompliziert... ich musses glaub ich doch mit extra variablen machen :shock: |
Re: Rückgabe
Wenn du halt TCollision als type deklarierst, dann musst du eine Variableninstanz davon erstellen. Mit der kannst du dann arbeiten.
|
Re: Rückgabe
Delphi-Quellcode:
[Fehler] Physik.pas(120): Nicht genügend wirkliche Parameter
procedure GetColPoint3DY(D: String; Side: Integer);
var Col: Collision; begin Col.Y := GetColPoint(...); end; |
Re: Rückgabe
Zitat:
1. Wie seht GetColPoint aus.. Zeig ma den ganzen Quelltext 2. Das was da steht steht aber nicht so Zeichn für Zeichen in deinem Quelltext oder?... Gruß Neutral General |
Re: Rückgabe
der Fehler leigt wo anderst. Womöglich hast du die Fuktion GetColPoint (oder natürlich die Funktion GetColPoint3DY) im Interface-Abschnitt anderst angegeben als sie eigentlich lautet?
|
Re: Rückgabe
gerade hab ichs rausgefunden...
ich wusste nicht das ich bei dem out variablen angeben muss auf die der wert dann gesetzt wird |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 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-2025 by Thomas Breitkreuz