Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Funktion mit 2 Zahlen (https://www.delphipraxis.net/87428-funktion-mit-2-zahlen.html)

Axxus 28. Feb 2007 16:23


Funktion mit 2 Zahlen
 
HI Delphianer

Sorry das ma wieder so ne noobfrage kommt aber naja.

Ich versuche grade meine erste Bibiothek mit Delphi zu schreiben.

Es soll eine mathematische Formelsammlung werden (ich weiß gibts bestimmt schon aber ich will so was ma selbst versuchen)

Nun stoß ich schon gleich am Anfang auf mein erstes Problem:


ich will als erstes die Formel für den Flächeninhalt eines Rechtecks in die Bibiothek programieren also erst ma was gaaaaaanz leichtes. So die Formel für A ist ja A=a*b. So also den ich mir Nehm ich ne Prozedure und mach das ganze so

Delphi-Quellcode:
prozedure Flächeninhalt(a, b: integer);
so jetzt hätte ich die 2 Varriablen drin und kann damit A ausrechnen.

Jetzt denk ich weiter: wie bekomme ich nun den Flächeninhalt zurück in das Hauptprogramm?
So jetzt hab ich gelernt, dass eine prozedure keinen Wert zurück gibt, sondern eine Funktion.
Also nehm ich mir eine Funktion

Delphi-Quellcode:
Funktion Flächeninhalt: integer;
So jetzt kann meine Funktion den Flächeninhalt zurückgeben
Wie bekomme ich jetzt aber die Varriablen a und b darein damit der Flächeninhalt berechnet werden kann.

Es soll eine algemeine Unit werden die ich in jedes belibige Programm einbauen kann also sollte nichts Situationsgebundenes in der Funktion wie
Delphi-Quellcode:
a := edit1.Text;
sein

So ich hoffe ihr habt mein Problem verstanden

Danke im Vorraus

Axxus

leddl 28. Feb 2007 16:25

Re: Funktion mit 2 Zahlen
 
jetzt misch doch mal deine Deklarationen von Prozedur und Funktion et voilá, Problem gelöst :mrgreen:
Delphi-Quellcode:
function Flaecheninhalt(a, b: Integer) : Integer;

Axxus 28. Feb 2007 16:27

Re: Funktion mit 2 Zahlen
 
coll ih wusst gar nicht, dass das geht

danke

und sorry wg der noobfrage

Axxus

leddl 28. Feb 2007 16:28

Re: Funktion mit 2 Zahlen
 
Kein Problem, jeder fängt mal an ;)

Evtl. wären ja auch die Einsteiger-Tutorials von DSDT was für dich: http://www.dsdt.info/tutorials/?cat=1

Kedariodakon 28. Feb 2007 16:32

Re: Funktion mit 2 Zahlen
 
Oder du nimmst einen Parameter "call by reference" =)

Und da gibt es in Delphi 2 Möglichkeiten:

Einmal explezit nur als Ausgabeparameter mit dem Schlüsselwort Out oder mit dem Variablenparameter Var

Würde dann so aussehen:
Delphi-Quellcode:
Procedure Flaeche1( Const a, b: Integer; Out Result: Integer );
{...}
Procedure Flaeche2( Const a, b: Integer; Var Result: Integer );
{...}
achso, das Const für Konstantenparameter...
Ist in diesem Fall nicht notwendig, kann aber einen Performance Unterschied ausmachen, gerade wenn man z.B. mit Strings arbeitet...

Bye Christian

Axxus 28. Feb 2007 16:34

Re: Funktion mit 2 Zahlen
 
Naja ich programiere jetzt schon seit 3 Jahren mit Delphi also sollt ich das eigentlich wissen :oops: :oops: :oops:
Aber ich hab noch nie eine Libary geschrieben und habe selten functions benutzt deswegen auch die Bildungslücke

Trotzdem danke Leute

Axxus 28. Feb 2007 16:36

Re: Funktion mit 2 Zahlen
 
Wäre es so sauber programiert
Delphi-Quellcode:
interface

function Rechteck_Flächeninhalt (a, b: extended) : extended;

implementation

function Rechteck_Flächeninhalt (a, b: extended) : extended;
begin
  Rechteck_Flächeninhalt := a*b;
end;

end.

leddl 28. Feb 2007 16:40

Re: Funktion mit 2 Zahlen
 
Jo, sieht doch gut aus. Um etwas Schreibarbeit zu sparen, kannst du für den Rückgabewert statt des Funktionsnamens auch einfach nur "Result" schreiben ;)
Delphi-Quellcode:
function Rechteck_Flächeninhalt (a, b: extended) : extended;
begin
  Result := a*b;
end;
//Edit:
Bis auf die Tatsache, dass es wohl mit dem Funktionsnamen ein Problem geben dürfte ;) Umlaute sind meines Wissens nach nicht erlaubt ;)

Kedariodakon 28. Feb 2007 16:44

Re: Funktion mit 2 Zahlen
 
Erstmal nein, da das Ergebiss von Funktionen in Result gelegt werden muss! ;)

Nunja, wenn du nur mit Ganzzahlen arbeiten willst, ist das Performance mässig weniger gut.

Zudem würde ich bei Fließkomma lieber mit dem Const arbeiten, da du so mit der Referenz des Wertes arbeitest und nicht mit einer Kopie... (Kopien und Rechenoperationen mit Fließkommazahlen können das Ergebniss ungenau machen, wenn man das so sagen kann...

Ich persönlich würde es so machen wenn ich Zeit hab =)

Delphi-Quellcode:
Unit {...};

Interface
                                                                   
Function Rechteck_Flaecheninhalt( Const a, b: Integer ): Extended; Overload;
Function Rechteck_Flaecheninhalt( Const a, b: Extended ): Extended; Overload;

Implementation

Function Rechteck_Flaecheninhalt( Const a, b: Extended ): Extended;
Begin
  Result := a * b;
End;

Function Rechteck_Flaecheninhalt( Const a, b: Integer ): Intger;
Begin
  Result := a * b;
End;

end.

jmd anders 28. Feb 2007 16:48

Re: Funktion mit 2 Zahlen
 
result oder funktionsnamen, ist egal auf was man sein ergebnis der funktion zuweist

Kedariodakon 28. Feb 2007 16:57

Re: Funktion mit 2 Zahlen
 
Ok, dass wuste ich noch nicht...
Man lernt ein Leben lang :lol:

Aber Übersichtshalber würd ich lieber immer Result nehmen, ist ja auch meist kürzer als der Funktionsname... Zudem wissen auch gleich fremde Leute auf den ersten Blick was gemeint ist...


Bye Christian

Axxus 28. Feb 2007 19:29

Re: Funktion mit 2 Zahlen
 
Frage dazu

1.Ich hab hier im Forum schon gelesen dass wenn man eine Rechnung nur mit intergertypen rechent kommt am ende immer ein integertyp raus also wenn dann würde ich entwerde alles als extendet vereinbarren oder alles als integer.

2. wenn ich a und b als KOnstante vereinbarre und in dem endprogramm die Funktion 2 mal benutze rechnet er dann mit den anderen Werten oder sind a und b bis zum Programmende constant

jmd anders 28. Feb 2007 19:43

Re: Funktion mit 2 Zahlen
 
wenn du mit zwei integer(ganzzahligen) typen rechnets kommt ja nicht immer eine ganze zahl am ende wieder als ergebnis heraus. da bei einer division zweier ganzer zahlen zum beispiel auch nicht eine ganze zahl herauskommt.

Delphi-Quellcode:

var     a,b : integer;
    ergebnis : extended;
begin
  ergebnis:=a/b;
end;
so würde es funktionieren, da nun da nun die variable ergebnis auch nachkommastellen aufnehmen kann.
ansonsten könnte es zu fehlermeldungen geben, dass es sich nicht um einen gültigen integer handelt.

Axxus 28. Feb 2007 19:57

Re: Funktion mit 2 Zahlen
 
Oh sorry da ist mir ein Fehler unterlaufgen ich mein natürlich wenn man 2 ganzzahlen miteinander Multipliziert kommt immer eine ganzzahl heraus

und wie ist das jetzt mt den KOnstanten?

dominikkv 28. Feb 2007 20:04

Re: Funktion mit 2 Zahlen
 
das schlüsselwort const bedeutet nur das du a und b nicht mehr verändern kannst (in deiner function), also zB a := 4 wäre dann nicht mehr möglich...du übergibst den wert constant.
und bei jedem functionsaufruf wird a und b neu angelegt und hat nix mit dem "alten" a und b zu tun

Axxus 28. Feb 2007 20:14

Re: Funktion mit 2 Zahlen
 
OK das wollt ich wissen
perfekt leute dann kann ich jetzt anfangen ma sehn wie weit ich komme ;)

Axxus 28. Feb 2007 20:15

Re: Funktion mit 2 Zahlen
 
Ups was ich vergessen hab was heißt Overload

inherited 28. Feb 2007 20:17

Re: Funktion mit 2 Zahlen
 
Das heisst, du kannst zwei Funktionen mit demselben Namen haben. Je nachdem wie du sie dann aufrufst wird die eine oder die andere genommen.

Axxus 28. Feb 2007 20:37

Re: Funktion mit 2 Zahlen
 
Man was ich alles heute lerne find ich klasse :thumb:

dominikkv 28. Feb 2007 20:43

Re: Funktion mit 2 Zahlen
 
die functionen müssen sich in ihren parametern unterscheiden
beispiel:
Delphi-Quellcode:
function Beispielfunction(a: Integer):Integer; overload;
function Beispielfunction(a: String): Integer;

//...

Beispielfunction(123)  // <<-- die erste function wird ausgeführt
Beispielfunction('abc') // <<-- die zweite function wird ausgeführt

Kedariodakon 28. Feb 2007 20:46

Re: Funktion mit 2 Zahlen
 
Zitat:

Zitat von dominikkv
das schlüsselwort const bedeutet nur das du a und b nicht mehr verändern kannst (in deiner function), also zB a := 4 wäre dann nicht mehr möglich...du übergibst den wert constant.
und bei jedem functionsaufruf wird a und b neu angelegt und hat nix mit dem "alten" a und b zu tun

ok...

Wenn nichts angegeben wird:
Delphi-Quellcode:
procedure Machwas( a, b: Integer )
{...}
Ist es Call by Value, sprich beim aufruf der Funktion wird für a und b neuer Speicher angelegt und die übergebenen Werte werden dahin kopiert...
Inerhalb der Methode kann man sogar a und b verändern, ohne das dies außerhalb Auswirkungen hat...
Sprich es wär in der Methode z.B. möglich: a := 56;...

Wenn man z.b. nun einen String übergibt, wird der String auch komplett nochmal erstellt und kopiert!




Wenn nun aber Const angegeben wird:
Delphi-Quellcode:
procedure Machwas( Const a, b: Integer )
{...}
Ist es Call by Referenz, sprich es wird nur die Stelle im Speicher übergeben, man greift in der Methode also direkt auf den übergebenen Wert zu, welchen man übergeben hat! Aber! das Schlüsselwort Const verbietet eine Veränderung, sprich a := 56; ist nicht möglich...
Vorteil hat das aber wenn man mit z.B. mit Strings arbeitet! Da werden z.B. die Strings nicht neu angelegt! Was an vielen Stellen viel Performance ausmachen kann...




Wenn nun dagegen Var angegeben wird:
Delphi-Quellcode:
procedure Machwas( Var a, b: Integer )
{...}
Ist es auch Call by Referenz, sprich es wird nur die Stelle im Speicher übergeben, man greift in der Methode also direkt auf den übergebenen Wert zu, welchen man übergeben hat! Aber, wenn man nun den Wert in der Methode verändert: a := 56; ist der Wert nach der Methode außerhalb auch verändert!




Als letztes bleibt noch Out...
Delphi-Quellcode:
procedure Machwas( Out a, b: Integer )
{...}
Hier trifft eigendlich das selbe zu wie beim Schlüsselwort Var, aber man kann auf a und b nicht in der Methode lesend zugreifen, also sowas wie a * b wäre nicht möglich....


So ich hoffe ich hab das alles richtig erklärt =)

Bye Christian


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:15 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