Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Procedure (https://www.delphipraxis.net/91938-procedure.html)

Dr4ke 12. Mai 2007 01:13


Procedure
 
Ich habe ein kleines Problem mit Proceduren ... Ich bekomme immer einnen Fehler:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TFAnwendung = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    edtZahl1: TEdit;
    edtZahl2: TEdit;
    edtAdd: TEdit;
    edtMal: TEdit;
    btnRechnen: TButton;
    procedure btnRechnenClick(Sender: TObject);
  private
  procedure Addieren (Zahl1, Zahl2, Ergebnis : integer);
  public
    { Public-Deklarationen }
  end;

var
  FAnwendung: TFAnwendung;

implementation

{$R *.dfm}


procedure TFAnwendung.btnRechnenClick(Sender: TObject);
var
Zahl1 : integer;
Zahl2 : integer;
Ergebnis : integer;
begin
Zahl1 := StrToInt(edtZahl1.Text);
Zahl2 := StrToInt(edtZahl2.Text);
Addieren(Zahl1, Zahl2, Ergebnis);
edtAdd.Text := IntToStr(Ergebnis);
end;

procedure TFAnwendung.Addieren (Zahl1, Zahl2, Ergebnis : integer);
begin
Ergebnis := Zahl1 + Zahl2;
end;

end.


Fehler:

Delphi-Quellcode:
[Warnung] Unit1.pas(43): W1036 Variable 'Ergebnis' ist möglicherweise nicht initialisiert worden
[Hinweis] Unit1.pas(49): H2077 Auf 'Ergebnis' zugewiesener Wert wird niemals benutzt

ghost007 12. Mai 2007 01:24

Re: Procedure
 
Zitat:

Zitat von Dr4ke
Fehler:

Delphi-Quellcode:
[Warnung] Unit1.pas(43): W1036 Variable 'Ergebnis' ist möglicherweise nicht initialisiert worden
[Hinweis] Unit1.pas(49): H2077 Auf 'Ergebnis' zugewiesener Wert wird niemals benutzt

Und wo genau liegt das problem? Das programm sollte trotzdem laufen, oder? die warnung bekommst du damit weg, das du das ergebnis mal ausgeben lässt, z.b. in ner label oder ähnliches.
Den hinweis, indem du im onCreate event der form ergebnis:=0; machst ;)

MfG - Ghost007

Dr4ke 12. Mai 2007 01:32

Re: Procedure
 
Oh, sry is schon spät. ^^

Die Rechnung stimmt nihct .. Es ist immer 0.

himitsu 12. Mai 2007 01:39

Re: Procedure
 
Zitat:

Zitat von ghost007
Und wo genau liegt das problem? Das programm sollte trotzdem laufen, oder? die warnung bekommst du damit weg, das du das ergebnis mal ausgeben lässt, z.b. in ner label oder ähnliches.
Den hinweis, indem du im onCreate event der form ergebnis:=0; machst ;)

komplett falsch ... damit bekommst du höchstens die Meldungen weg, aber nicht die tatsächliche Ursache.

Denn Ergebnis wird nur übergeben, bekommt aber den ückgabewert nicht zurück :warn:


Statt OUT nönnteman hier zwar auch VAR nehmen, aber ersten ist braucht diese Variable kein Wert an die Prozedur übergeben zu werden (jedenfalls wird er intern nicht benötig)
Code:
procedure TFAnwendung.btnRechnenClick(Sender: TObject);
  ...
  Addieren(Zahl1, Zahl2, Ergebnis);
  edtAdd.Text := IntToStr(Ergebnis);
end;

procedure TFAnwendung.Addieren (Zahl1, Zahl2 : integer; [b]Out[/b] Ergebnis : integer);
begin
  Ergebnis := Zahl1 + Zahl2;
end;
Alternativ könntes du auch der Funktion entsprechend eine Funktion aus der Prozedur machen ... schließlich ist Ergebnis das Rechenergebnis von Addieren.
Code:
procedure TFAnwendung.btnRechnenClick(Sender: TObject);
  ...
  [b]Ergebnis := Addieren(Zahl1, Zahl2); [/b]
  edtAdd.Text := IntToStr(Ergebnis);
end;

[b]function TFAnwendung.Addieren (Zahl1, Zahl2 : integer) : integer; [/b]
begin
  [b]Result := [/b]Zahl1 + Zahl2;
end;

Und die Meldungen sind doch eindeutig?
Zitat:

[Warnung] Unit1.pas(43): W1036 Variable 'Ergebnis' ist möglicherweise nicht initialisiert worden
Code:
AddieAddieren(Zahl1, Zahl2, [b]Ergebnis[/b]);
edtAdd.Text := IntToStr(Ergebnis);
Ergebnis wird von den verwendeten Funktionen nur als Eingabeparameter verwendet ... es wird also nirgendwo etwas zugewiesen.

Zitat:

[Hinweis] Unit1.pas(49): H2077 Auf 'Ergebnis' zugewiesener Wert wird niemals benutzt
Code:
procedure TFAnwendung.Addieren (Zahl1, Zahl2, Ergebnis : integer);
begin
[b]Ergebnis := [/b]Zahl1 + Zahl2;
end;
Ergebnis wird zwar was zugewiesen, aber nicht verwendet ... schließlich ist Ergebnis nicht als Ausgabeparameter definiert.

Dr4ke 12. Mai 2007 01:49

Re: Procedure
 
Das mit dem Out klappt nicht richtig ..

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TFAnwendung = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    edtZahl1: TEdit;
    edtZahl2: TEdit;
    edtAdd: TEdit;
    edtMal: TEdit;
    btnRechnen: TButton;
    procedure btnRechnenClick(Sender: TObject);
  private
  procedure Addieren (Zahl1, Zahl2,Out Ergebnis : integer);
  public
    { Public-Deklarationen }
  end;

var
  FAnwendung: TFAnwendung;

implementation

{$R *.dfm}


procedure TFAnwendung.btnRechnenClick(Sender: TObject);
var
Zahl1 : integer;
Zahl2 : integer;
Ergebnis : integer;
begin
Zahl1 := StrToInt(edtZahl1.Text);
Zahl2 := StrToInt(edtZahl2.Text);
Addieren(Zahl1, Zahl2, Ergebnis);
edtAdd.Text := IntToStr(Ergebnis);
end;

procedure TFAnwendung.Addieren (Zahl1, Zahl2,Out Ergebnis : integer);
begin
Ergebnis := Zahl1 + Zahl2;
end;

end.


Delphi-Quellcode:
[Fehler] Unit1.pas(22): E2067  Fehlender Parametertyp
[Fehler] Unit1.pas(43): E2035 Nicht genügend wirkliche Parameter
[Fehler] Unit1.pas(47): E2067  Fehlender Parametertyp
[Fataler Fehler] Project1.dpr(5): F2063 Verwendete Unit 'Unit1.pas' kann nicht compiliert werden


Nebenbei: Ich bin noch Anfänger, das sind meine Ersten Schritte.

ghost007 12. Mai 2007 01:54

Re: Procedure
 
ok, ich hab das immer so gemacht, und meine proggis funktionieren auch, awa dann hab ich wohl was dazu gelernt ...

MfG - Ghost007

[EDIT]
sorry .... :oops:
[/EDIT]

Luckie 12. Mai 2007 01:58

Re: Procedure
 
Was sollte dieser nutzlose Beitrag?

himitsu 12. Mai 2007 02:09

Re: Procedure
 
ups, mein Fehler :wall:

so sollte es gehn.
Delphi-Quellcode:
procedure TFAnwendung.Addieren (Zahl1, Zahl2 : integer; Out Ergebnis : integer);

Mir kam der Nick bekannt vor. :gruebel:
Also dann ... herzlich Willkommen.


Also wenn Anfänger, dann empfehle ich dir in diesem Fall die Variante mit der Funktion,
Delphi-Quellcode:
function TFAnwendung.Addieren (Zahl1, Zahl2 : integer) : integer;
denn so ist auch beim Aufruf der Funktion zu erkennen welches der Rückgabewert ist.
Delphi-Quellcode:
Ergebnis := Addieren(Zahl1, Zahl2);
Hast ja selber bestimmt auch bemerkt, daß der Rückgabewert im Edit (edtAdd) nicht stimmt.

Schließlich wurde bei dir das Rechenergebnis nicht in der Variable Ergebnis gespeichert, da dieses in der Funktion Addieren nur als Eingabeparameter definiert war.

Und selbst wenn man dies als Ausgabeparameter definiert, kann man beim Aufruf nicht erkennen das sich da was geändert hat. (Eingabe- <> Ausgabe-Parameter)

Dr4ke 12. Mai 2007 02:26

Re: Procedure
 
ICh hab nur noch nie mit functionen gearbeitet, deswegen weiß ich nicht was ich da verändern muss etc.

//EDIT: Das mit dem neuen Out klappt .. Aber was hat es mit "Out" auf sich?

Luckie 12. Mai 2007 02:29

Re: Procedure
 
Eventuell solltest du dir erstmal die Grundlagn angucken. Eine gute Seite dafür sind die Tutorials auf http://www.dsdt.info


[edit=Matze]Link korrigiert. Mfg, Matze[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:42 Uhr.
Seite 1 von 2  1 2      

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