Delphi-PRAXiS

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

Demi-God 9. Aug 2005 17:52


Probleme mit Funktionen
 
Ich möchte einen ganz normalen Taschenrechner programmieren, der die Standartfunktionen wie Addition usw kann, allerdings auch Wurzel, Logarithmus usw.

Nun habe ich versucht Potenzieren in einer Funktion zu schreiben, allerdings bekomme ich immer wieder die selben Fehler :(

Delphi-Quellcode:
    [...]
    procedure BPotenzClick(Sender: TObject);
  private
    { Private-Deklarationen }
    function Pot(a, b: Integer): Integer;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function Pot(a, b: Integer): Integer;
var
  i: Integer;
begin
  For i := 1 to b do
  begin
    Result := a*a;
  end;
end;

procedure TForm1.BPotenzClick(Sender: TObject);
var
  a, b, c: Integer;
begin
  a := StrToInt(EA.Text);
  b := StrToInt(EB.Text);
  c := Pot(a, b);
  EC.Text := IntToStr(c);
end;
Wenn auf den Button BPotenz geklickt wird, sollen die beiden Zahlen a und b aus den Edit-Feldern EA und EB in der Funktion Pot benutzt werden und danach in c gespeichert werden. Dies soll dann im Edit-Feld EC erscheinen, allerdings funktioniert es nicht, denn es kommen folgende Meldungen (Delphi-Hilfe nützt nichts und per Suche finde ich nur Funktionen, die klappen^^):

[Warnung] UTaschenrechner.pas(76): Rückgabewert der Funktion 'Pot' könnte undefiniert sein
[Fehler] UTaschenrechner.pas(55): Ungenügende Forward- oder External-Deklaration: 'TForm1.Pot'
[Fataler Fehler] Taschenrechner.dpr(5): Verwendete Unit 'UTaschenrechner.pas' kann nicht compiliert werden


Bitte Hilfe, warum funzt das net? :wall:

arbu man 9. Aug 2005 17:53

Re: Probleme mit Funktionen
 
Delphi-Quellcode:
function TForm1.Pot(a, b: Integer): Integer;
var
  i: Integer;
begin
  For i := 1 to b do
  begin
    Result := a*a;
  end;
end;
Edit:Alternativ kannst du auch die funktion power nehmen

Demi-God 9. Aug 2005 17:56

Re: Probleme mit Funktionen
 
aber ich wollte das ja selber schreiben und auch lernen, wie Funktionen funktionieren, aber es geht ja nicht xD warum nicht?

Matze 9. Aug 2005 18:01

Re: Probleme mit Funktionen
 
Zitat:

Zitat von Demi-God
aber ich wollte das ja selber schreiben und auch lernen, wie Funktionen funktionieren, aber es geht ja nicht xD warum nicht?

Guck Arbu Mans Beitrag an, du hast lediglich TForm1. vergessen. Oder du lässt im private-Abschnit die zeile weg, dann geht es auch.

Nicolai1234 9. Aug 2005 18:03

Re: Probleme mit Funktionen
 
Nebenbei gesagt ist in der Funktion ein Fehler.
Wenn man
Delphi-Quellcode:
pot(2,3);
aufruft, wäre das doch nach dieser Funktion:
2*2*2*2
Das wäre aber 2^4.

Oder sehe ich da was falsch?

//Edit:
Auch falsch. Es käme bei der Lösung immer a^2 raus, da in der Schleife immer result := steht:
Auf jeden Fall ein Fehler!

arbu man 9. Aug 2005 18:05

Re: Probleme mit Funktionen
 
Du hast die Funktion in der form1 deklariert und rufst sie ein der unit auf, das geht nicht entweder so:
Delphi-Quellcode:
   procedure BPotenzClick(Sender: TObject);
  private
    { Private-Deklarationen }
   
  public
    { Public-Deklarationen }
  end;

function Pot(a, b: Integer): Integer;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function Pot(a, b: Integer): Integer;
var
  i: Integer;
begin
  For i := 1 to b do
  begin
    Result := a*a;
  end;
end;

procedure TForm1.BPotenzClick(Sender: TObject);
var
  a, b, c: Integer;
begin
  a := StrToInt(EA.Text);
  b := StrToInt(EB.Text);
  c := Pot(a, b);
  EC.Text := IntToStr(c);
end;
oder so
Delphi-Quellcode:
   procedure BPotenzClick(Sender: TObject);
  private
    { Private-Deklarationen }
    function Pot(a, b: Integer): Integer;
  public
    { Public-Deklarationen }
  end;



var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.Pot(a, b: Integer): Integer;
var
  i: Integer;
begin
  For i := 1 to b do
  begin
    Result := a*a;
  end;
end;

procedure TForm1.BPotenzClick(Sender: TObject);
var
  a, b, c: Integer;
begin
  a := StrToInt(EA.Text);
  b := StrToInt(EB.Text);
  c := Pot(a, b);
  EC.Text := IntToStr(c);
end;

Demi-God 9. Aug 2005 18:07

Re: Probleme mit Funktionen
 
arghs nur wegen dem vergessenen TForm1. thx =)

vielen Dank für die schnellen Antworten und für den Hinweis auf den Fehler, der allerdings nicht der einzige ist, denn Result := a*a; ist natürlich auch quatsch

DGL-luke 9. Aug 2005 18:10

Re: Probleme mit Funktionen
 
ja, in dieser form liefert pot(a,b) nämlich nichts anderes als a²....

Komisch dass das noch niemand gemerkt hat...

Demi-God 9. Aug 2005 18:15

Re: Probleme mit Funktionen
 
habe das ganze nun so gelöst:

Delphi-Quellcode:
function TForm1.Pot(a: Real; b: Integer): Real;
var
  i: Integer;
begin
  Result := 1;
  If b > 0 then
  begin
    For i := 1 to b do
    begin
      Result := Result*a;
    end;
  end
  else
  begin
    For i := -1 downto b do
    begin
      Result := Result*a;
    end;
    Result := 1 / Result;
  end;
end;
und es funktioniert^^

vielen Dank nochmal für die schnellen Antworten und Tipps =)

dizzy 9. Aug 2005 19:36

Re: Probleme mit Funktionen
 
Und wenn du wissen möchtest wie es deutlich schneller geht:
Delphi-Quellcode:
function TForm1.Pot(a: Real; b: Integer): Real;
begin
  result := exp(b*ln(a));
end;
Voraussetzung: a > 0
b darf hierbei sogar Real sein ;).

Gruss,
Fabian


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