Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Function/Procedure -Deklaration ?! (https://www.delphipraxis.net/20535-function-procedure-deklaration.html)

fauxx 19. Apr 2004 16:40


Function/Procedure -Deklaration ?!
 
Also diese Frage ist mir jetzt einwenig peinlich:
Ich programmiere zwar erst seit September 2003 mit Delphi, aber ich glaube das sollte ich dan doch wissen:

Wo ist bitte der unterschied zwischen:

Delphi-Quellcode:
procedure name(var: TType);
und
Delphi-Quellcode:
procedure name(const var: TType);
also mit dem schlüsselwort var kenn ich das, aber für was ist const (Konstante das weiß ich, aber bei Functions/Procedures)? Hab ich nämlich schon öfters gesehen...

Tryer 19. Apr 2004 16:46

Re: Function/Procedure -Deklaration ?!
 
Zitat:

Zitat von fauxx
Hab ich nämlich schon öfters gesehen...

Und nie auf die Idee gekommen in die Hilfe zu schauen :gruebel:

Const heist das was man vermuten könnte.. der Paramter wird als Konstante übergeben, man kann also innerhalb der Prozedur nicht schreibend darauf zugreifen sondern den Inhalt nur auslesen.
Die Delphi-Hilfe erklärt die verschiedenen Varianten der Parameterübergabe eigentlich recht gut.

MfG,
Tryer

Muetze1 19. Apr 2004 16:46

Re: Function/Procedure -Deklaration ?!
 
Moin!

Damit wird angegeben, das die Funktion/Procedure diese Variable nicht ändert. Dies wird mit dem Schlüsselwort const vom Compiler sogar sicher gestellt. Damit kannst du dir beim Aufruf einer solchen Funktion sicher sein, das deine übergebene Variable auch nach dem Funktionsaufruf noch den gleichen Inhalt hat.

MfG
Muetze1

maestro 19. Apr 2004 16:51

Re: Function/Procedure -Deklaration ?!
 
Zusätzlich gibt es übrigens auch noch "out" - also const, var und out. const sind in-Parameter, var sind in/out-Parameter und out eben nur out-Parameter :)

fauxx 19. Apr 2004 16:52

Re: Function/Procedure -Deklaration ?!
 
Das habe ich vermutet. Nur wo liegt jetzt der unterschied?? Beim oberen Bsp. ist der rückgabewert ja auch der selbe wie der übergabewert wenn nicht mit var eingeleitet....

oder?!

dummer_info_schüler 19. Apr 2004 17:02

Re: Function/Procedure -Deklaration ?!
 
Vielleicht in dem Beispiel, das du hast, aber es kann ja z-.B. sein
Delphi-Quellcode:
 procedure zaehlen (var c);
 begin
   c:=c+1;
 end;
Das hieße, das c ist als Ausgabewert anders, als der Eingabewert, also variabel.

Hättest du in deiner Prozedur nie an dem c (oder wie auch immer) was geändert, wäre es unerheblich gewesen, ob du var davor schreibst oder nicht.

Hättest du in dem obigen Beispiel statt var aber const geschrieben, hätte es eine Fehlermeldung gegeben!

fauxx 19. Apr 2004 17:06

Re: Function/Procedure -Deklaration ?!
 
Das ist mir schon klar. Aber wenn man jetzt nicht will dass die übergebene Variable geändert wird schreibt man doch einfach kein var davor. Wieso benötigt mann dann nocht const.

Bsp:

Delphi-Quellcode:
procedure Name(var a: Integer);
begin
  a := a + 1;
end;
Hier wird a verändert.

Delphi-Quellcode:
procedure Name(a: Integer);
begin
  a := a + 1;
end;
a bleibt wie es ist...

Delphi-Quellcode:
procedure Name(const a: Integer);
begin
  a := a + 1;
end;
hier bleibt auch a wie es ist.. (oder??)

Muetze1 19. Apr 2004 17:15

Re: Function/Procedure -Deklaration ?!
 
Moin!

Dein letztes Beispiel haut dir der Compiler um die Ohren, er erlaubt es gar nicht eine Zuweisung auf a zu machen. Vielleicht nochmal ein Beispiel:

Delphi-Quellcode:
ExtractFileName(Const AFileName : String): String;
Diese Funktion in der SysUtils holt dir aus dem übergebenen String den reinen Dateinamen heraus - auch wenn da nun noch ein Pfad oder Laufwerk davorsteht. Wenn du nun eine Variable s mit irgendeiner Datei + Pfadangabe hast in deinem Code und du brauchst nun nur den Dateinamen, z.B.

Delphi-Quellcode:
Procedure TForm1.Button1Click(Sender...)
Var
  s : String;
Begin
  If ( OpenDialog1.Execute ) Then
  Begin
    s := OpenDialog1.FileName;

    Label1.Caption := ExtractFileName(s);
 
    Memo1.Lines.LoadFromFile(s);
  End;
End;
Ein Beispiel: Du weisst s die voll qualifizierte Dateiangabe zu, damit du nicht immer den OpenDialog und die etwas langsameren Properties nutzen musst. Nun willst du auf einem Label1 den Dateinamen der aktuell geladenen Datei anzeigen, also ExtractFileName() aufrufen und das Ergebnis zu dem Label. Nun brauchst du aber für das Laden des Inhaltes der Datei in das Memo1 den voll-qualifizierten Dateinamen und daher kann man ja mal ins Grübeln kommen, ob nicht auch ExtractFileName() den übergebenen String maltretiert und nach dem Aufruf nur noch der Dateiname ohne Pfad in s drinne ist. Du kannst dir aber sicher sein, dass dem nicht so ist, weil der Parameter bei ExtractFileName() ist ein Const und daher wird der unter keinen Umständen verändert.

Vor allem ist Const auch eine Sache für den Compiler: Kann ich nun den Wert direkt auf den Stack pushen oder muss ich einen Zeiger auf die Variable nehmen. Z.T. ist es weniger Aufwand/Code den der Compiler bei einem Codeaufruf erzeugt und somit auch z.T. eine geringere Stackbelastung (aber in den seltensten Fällen, da ein Pointer mit 4 Bytes schon recht klein ist...).

MfG
Muetze1

Matze 19. Apr 2004 17:17

Re: Function/Procedure -Deklaration ?!
 
Delphi-Quellcode:
procedure Name(var a: Integer);
begin
  a := a + 1;
end;
Hier wird die Speicheradresse übergeben und a dauerhaft geändert, man kann in der kompletten Unit drauf zugreifen.


Delphi-Quellcode:
procedure Name(a: Integer);
begin
  a := a + 1;
end;
Hier wird eine Kopie von a übergeben und a wird nur innerhalb der Prozedur verändert.


Delphi-Quellcode:
procedure Name(const a: Integer);
begin
  a := a + 1; //Fehler
end;
a bleibt innerhalb der Prozedur konstant und kann nicht verändert werden.

fauxx 19. Apr 2004 17:18

Re: Function/Procedure -Deklaration ?!
 
OK, danke! Das hat meine Frage zu 100% beantwortet!


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:26 Uhr.
Seite 1 von 3  1 23      

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