Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Funktionen (https://www.delphipraxis.net/4661-funktionen.html)

Pseudemys Nelsoni 8. Mai 2003 06:37


Funktionen
 
hi

sagen wir mal ich hab ne funktion

Delphi-Quellcode:
function mult(a: integer): integer;
begin
  Result := a * 2;
end;
und ich rufe sie auf mit:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var bla1, bla2: integer;
begin
  bla1 := 2;
  bla2 := mult(bla1);
  label1.Caption := IntToStr(bla2);
end;

der wert mult wird an die funktion gegeben...ok...aber wo speichert die funktion ihn denn? ich mein ich hab da ja keine variable die den wert da enthält oder?

hab (leider) noch nie mit funktionen gearbeitet, wenn mirs jemand erklären würd, wär nett, danke

gruss silent

Luckie 8. Mai 2003 06:56

Du übergibts nicht mult an die Funktion, das ist die Funktion, sondern bla1 übergibst du an die Funktion. Und den Parameter der Funktion a, kann nman eien lokale Variable innerhalb der Funktion sehen.

Pseudemys Nelsoni 8. Mai 2003 07:17

also wird "bla1" an die variable "a" der funktion übergeben? - was ist wenn ich da 2 variablen hab, z.b "a" und "b", wo wird es dann "hineingesteckt?"

wo0zy 8. Mai 2003 07:45

für alle variablen die du übergibst, brauchst du in der funktion/procedur ja auch immer variablen die diese werte übernehmen

Pseudemys Nelsoni 8. Mai 2003 08:03

und wie geb ich an was übergeben wird? ich meine wenn da 2 integervariablen in der funktion sind, in welche kommt denn ein wert bei aufruf?

das "a" kann den wert ja gar nicht enthalten weil ich in nie dem a zugewisen hab...aber irgendwo muss der wert doch sein

Luckie 8. Mai 2003 08:25

Delphi-Quellcode:
function add(a, b: Inetger): Integer;
begin
  result := a+b;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  a, b, c : Integer
begin
  a := 1;
  b := 2;
  c := add(a, b);
  ShowMessage(IntToStr(c));
end;
Wo ist da jetzt das Problem?

wo0zy 8. Mai 2003 08:26

also das is eigentlich gabz einfach :D

einer function/prozedur werden automatisch werte übergeben

die werte werden so definiert wie dein a also function test(a,b:Integer):Integer

und übergeben tust du die werte beim aufrufen:
erg:=test(3,2);

in diesem fall wird wäre dann a=3 und b=2

Pseudemys Nelsoni 8. Mai 2003 08:33

ein problem ist da (noch) nicht, aber würd ich sicher später bekommen wenn ich das prinzip nicht verstehe

wenn ich das ganze ändere in:

Delphi-Quellcode:
function add(a, b: Integer): Integer;
begin
  result := a+b;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  a1, b1, c : Integer;
begin
  a1 := 1;
  b1 := 2;
  c := add(a1, b1);
  ShowMessage(IntToStr(c));
end;
funktionierts ja immernoch ...obwohl die veriablen a1 und b1 heissen, kommen sie bei der funktion in a und b? woher weiss ich wo der wert a1 oder b1 ist(in der funktion)? "a1" kann ja auch in "b" der funktion sein oder nicht

sorry versteh das nicht so ganz :(

wo0zy 8. Mai 2003 08:43

welche werte a und b haben hängt davon ab in welcher reihenfolge du deine werte übergibst, dabei wird von links nach rechts gegangen, genau wie bei der definition im funktionskopf, was zuerst definiert wird, bekommt den ersten wert aus der übergabe.

Luckie 8. Mai 2003 08:43

nJa. Weil sie beim Funktiosaufruf in die Parametervariablen der Funktion kopiert werden, daher ist es unerheblich wie die Variablen der Funktionsparameter heißen, allein der Typ spielt eine Rolle.

Das Kopieren nennt man auch CallByValue. Dann gibt es noch CallByReference. Da wird ein Zeiger auf die Speicherstelle übergeben und von der Funktion wird diese Speicherstelle veränder.
Delphi-Quellcode:
procedure foo(var s : String);
begin
  s := 'Hello world';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  t : String;
begin
  t := 'foobar';
  foo(t);
  ShowMessage(t);
end;
Was gibt dir jetzt ShowMessage aus? "foobar" oder "Hello world"? Richtig wäre "Hello world", weil ein Zeiger auf die Variable T übergeben wurde und die Prozedur foo diese Speicherstelle direkt verändert hat.

Pseudemys Nelsoni 8. Mai 2003 08:59

Zitat:

welche werte a und b haben hängt davon ab in welcher reihenfolge du deine werte übergibst, dabei wird von links nach rechts gegangen,
dann wirds mir schon ein bisschen klarer ^^


@luckie: wenn das 1. ne function ist, dann jo, kommt hello world

danke für die hilfe ihr 2 :)

achja, 1 noch...wenn ichs so hab:

Delphi-Quellcode:
function add(a, b: Integer): string;
begin
  result := IntToStr(a+b);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  a1, b1, c : Integer;
begin
  a1 := 1;
  b1 := 2;
  c := add(a1, b1);
  ShowMessage(IntToStr(c));
end;
was ist daran falsch?kann ich die zahlen während der function nicht in strings umwandeln? die variablen sind ja integer, die funktion sollte ein strng zurückgeben oder?

Pseudemys Nelsoni 8. Mai 2003 09:03

achso, c müsste in der prozedur ein string sein oder

hmm bekomme bei :

Delphi-Quellcode:
function add(a, b: Integer): string;
begin
  result := IntToStr(a+b);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  a1, b1: Integer;
  c: string;
begin
  a1 := 1;
  b1 := 2;
  c := add(a1, b1);
  ShowMessage(c);
end;

3 raus obwohl 1+2 (als string) doch 12 ergeben müsste ...hmm :cry:

Luckie 8. Mai 2003 09:03

Tut sie auch, nur bei der Aussageb mit ShowMessage versuchst du einen String noch mal von einem Integer in einen String umzuwandeln.

Bei dem letzten Code, den ich gepostet habe handelt es sich um eine Prozedur keine Funktion!!! Deswegen habe ich den Parameter mit CallByReference (Schlüsselwort: var) übergeben, damit die Prozedur ihn verändern kann. Ansonsten unterscheide sich ja eine Prozedur von einer Funktion darin, dass sie nichts zurückgibt.

Luckie 8. Mai 2003 09:04

Zitat:

Zitat von silent
achso, c müsste in der prozedur ein string sein oder

Das zu dem.

Pseudemys Nelsoni 8. Mai 2003 09:10

bei mir im buch gibts

function malZwei(var a: integer): integer // Call by Reference

und

function malZwei(a: integer): integer // Call by Value



als prozdur gibts das also auch, gut zu wissen , thx =) man ich muss das ganze mal komplett lernen bin da schon über nem jahr dran....

kannst du mir noch sagen wieso bei meinem letzten postb 3 statt 12 rauskam?

gruss silent

Luckie 8. Mai 2003 09:15

Du addierst doch Integers und wandelst dann das Ergebnis in einen String um.

Pseudemys Nelsoni 8. Mai 2003 09:18

wie könnt ichs denn vorher in strings umwandeln und dann addieren?
genauso wie in ner prozedur, also

function....
var var1, var2: string;
begin
var1 := IntToStr(a);
var2 := IntToStr(b);
result := a+b;
end;

so?

Luckie 8. Mai 2003 09:20

Zitat:

Zitat von silent
wie könnt ichs denn vorher in strings umwandeln und dann addieren?

Was willst du jetzt machen?

Pseudemys Nelsoni 8. Mai 2003 09:23

also 2 integers in der function zu einem string umwandeln

weil mir das komisch vorkommt das überall dann variablen vorkommen würden
also:

function irgendwas(a: integer): string
var v1, v2: string;
begin
v1 := IntToStr(a);
v2 := IntToStr(b);
result := a+b;
end;


ist das richtig? *G

Luckie 8. Mai 2003 09:26

Delphi-Quellcode:
function(a, b: Integer): String;
begin
  result := IntToStr(a)+IntToStr(b);
end;

Pseudemys Nelsoni 8. Mai 2003 09:29

ah danke :)

Pseudemys Nelsoni 13. Jan 2005 10:22

Re: Funktionen
 
was man nicht so alles entdeckt wenn man die suche benutzt.... und ich dachte ich wäre seit jahren auf immer dem selben level...aber wenn man das hier so liest :mrgreen:... da war ich ja richtig schlecht

Hat zwar nichts mit dem thema zu tun, aber erweitert wirds sowieso kaum noch..


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