![]() |
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:
so jetzt hätte ich die 2 Varriablen drin und kann damit A ausrechnen.
prozedure Flächeninhalt(a, b: integer);
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:
So jetzt kann meine Funktion den Flächeninhalt zurückgeben
Funktion Flächeninhalt: integer;
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:
sein
a := edit1.Text;
So ich hoffe ihr habt mein Problem verstanden Danke im Vorraus Axxus |
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;
|
Re: Funktion mit 2 Zahlen
coll ih wusst gar nicht, dass das geht
danke und sorry wg der noobfrage Axxus |
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: ![]() |
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:
achso, das Const für Konstantenparameter...
Procedure Flaeche1( Const a, b: Integer; Out Result: Integer );
{...} Procedure Flaeche2( Const a, b: Integer; Var Result: Integer ); {...} Ist in diesem Fall nicht notwendig, kann aber einen Performance Unterschied ausmachen, gerade wenn man z.B. mit Strings arbeitet... Bye Christian |
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 |
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. |
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:
//Edit:
function Rechteck_Flächeninhalt (a, b: extended) : extended;
begin Result := a*b; end; Bis auf die Tatsache, dass es wohl mit dem Funktionsnamen ein Problem geben dürfte ;) Umlaute sind meines Wissens nach nicht erlaubt ;) |
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. |
Re: Funktion mit 2 Zahlen
result oder funktionsnamen, ist egal auf was man sein ergebnis der funktion zuweist
|
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 |
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 |
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:
so würde es funktionieren, da nun da nun die variable ergebnis auch nachkommastellen aufnehmen kann.var a,b : integer; ergebnis : extended; begin ergebnis:=a/b; end; ansonsten könnte es zu fehlermeldungen geben, dass es sich nicht um einen gültigen integer handelt. |
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? |
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 |
Re: Funktion mit 2 Zahlen
OK das wollt ich wissen
perfekt leute dann kann ich jetzt anfangen ma sehn wie weit ich komme ;) |
Re: Funktion mit 2 Zahlen
Ups was ich vergessen hab was heißt Overload
|
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.
|
Re: Funktion mit 2 Zahlen
Man was ich alles heute lerne find ich klasse :thumb:
|
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 |
Re: Funktion mit 2 Zahlen
Zitat:
Wenn nichts angegeben wird:
Delphi-Quellcode:
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...
procedure Machwas( a, b: Integer )
{...} 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:
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...
procedure Machwas( Const a, b: Integer )
{...} 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:
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!
procedure Machwas( Var a, b: Integer )
{...} Als letztes bleibt noch Out...
Delphi-Quellcode:
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....
procedure Machwas( Out a, b: Integer )
{...} So ich hoffe ich hab das alles richtig erklärt =) Bye Christian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:23 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