Procedure mit 2 Rückgabewerten

Hallo Wissende,

ich mal wieder!

Ich habe eine kleine procedure mit 4 Übergabe- und zwei Rückgabewerten geschrieben.


procedure schnittpunkt(s1, c1, s0, c0: Double; VAR x_schittpunkt, y_schittpunkt: Double);

begin
x_schittpunkt := (s1-s0)/(c0-c1);
y_schittpunkt := (c1*s0-c0*s1)/(c1-c0)
end;

Nur leider ist hier in meinem Buch kein Beispiel für die Übergabe/Rückgabe. Eigentlich sollte es doch so funktionieren? Oder?


label7.caption := FloatToStr(schnittpunkt(s_links, c_links, s_rechts, c_rechts, x_schnittpunkt);
label7.caption := FloatToStr(schnittpunkt(s_links, c_links, s_rechts, c_rechts, y_schnittpunkt);

Danke für eure Hilfe schonmal im Voraus!
Gruß DieMaus

Hallo Maus

Vorschlag: verwende doch function statt procedure

Gruß Michael

Prozeduren liefern kein Ergebnis zurück. du kannst aber OUT-Parameter verwenden:

procedure Schnittpunkt(s1, c1, s0, c0: Double; var x_Schnittpunkt: Double; var y_Schnittpunktdouble);
und so aufrufen:

var
X,
Y: Double;

Schnittpunkt(1, 2, 3, 4, x, y);

Label1.Caption := FloatToStr(x); etc.
hier mit den vars weiterarbeiten.

Könntest auch einen Record-Typ übergeben.

Roger

Hallo Wissende,

ich mal wieder!

Kein Problem, dafür sind wir halt schießlich da (ich hoffe, ich spreche im Namen aller Beteiligten).

Eigentlich sollte es doch so funktionieren?
Oder?

label7.caption := FloatToStr(schnittpunkt(s\_links, c\_links,s\_rechts, c\_rechts, x\_schnittpunkt);
label7.caption := FloatToStr(schnittpunkt(s\_links, c\_links,s\_rechts, c\_rechts, y\_schnittpunkt);

Ich muss leider sagen „Noe“, denn unter Delphi würde sofort ein Fehler auftretten: „Not enough Parameters“ (oder so).
In deiner deklarierten Prozedur hast du ja 6 Parameter, bei deinem Aufruf allerdings nur fünnef. Aber um dir weiter zuhelfen hab ich auch gleich einen lösungsvorschlag. (wie schon bereits gesagt wurde mit Funktionen).

Lösung 1:

function schnittpunkt(x1,y1,x2,y2: double; art of byte):double;
begin
case art of
 0: Result := (x1-y2)/(y2-y1);
 1: Result := (y1\*y2-x2\*y1)/(x1-x0);
 else Result:= 0;
end;
end;
{}
label7.caption:= format('%8.2f',[schnittpunkt(a,b,c,d,0)]);
label8.caption:= FloatToStr(schnittpunkt(a,b,c,d,1));

Lösung 2:

function x\_schnitt(x1,y1,x2,y2):double;
begin
x\_schnitt:=(x1-y2)/(y2-y1);
end;
{}
function y\_schnitt(x1,y1,x2,y2):double;
begin
y\_schnitt:=(y1\*y2-x2\*y1)/(x1-x0);
end;
{}
label7.caption:= FloatToStr(x\_schnitt(a,b,c,d));
label8.caption:= FloatToStr(y\_schnitt(a,b,c,d));

Ich hoffe ich hab dir damit geholfen.

Gruß Thomas

P.S: Guck nochmal die mathematischen Formeln nach, meine Mathekenntnisse leiden Höllenqualen unter dem Zivildienst.