AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi procedure...(var i,j: integer) - Erklärung für das "var"?
Thema durchsuchen
Ansicht
Themen-Optionen

procedure...(var i,j: integer) - Erklärung für das "var"?

Ein Thema von Matze · begonnen am 9. Nov 2003 · letzter Beitrag vom 9. Nov 2003
Antwort Antwort
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#1

procedure...(var i,j: integer) - Erklärung für das "var

  Alt 9. Nov 2003, 11:13
Hi!

Ich schreibe am Dienstag eine Informatik-Klausur.
Wir hatten da unter anderem eine procedure, die 2 Integer-Zahlen vertauscht:
Delphi-Quellcode:
procedure TForm1.Swap(var Zahl1,Zahl2: integer);
var h: integer; //Hilfsvariable
begin
  h:=Zahl1;
  Zahl1:=Zahl2;
  Zahl2:=h;
end;
Ich verstehe aber trotzdem nicht so genau, für was man das "var" braucht, denn ich weise doch mit

Delphi-Quellcode:
h:=Zahl1;
Zahl1:=Zahl2;
Zahl2:=h;
eindeutig die Werte den entsprechenden Variablen zu.

Lasse ich jedoch das "var" weg:

Delphi-Quellcode:
procedure TForm1.Swap(Zahl1,Zahl2: integer);
var h: integer; //Hilfsvariable
begin
  h:=Zahl1;
  Zahl1:=Zahl2;
  Zahl2:=h;
end;
Dann geht es nicht, also die Zahlen werden nicht vertauscht.

Mit dem "var" wird ja die Speicheradresse übergeben (Referenzparameter).
Ohne das "var" nur die Kopie der Variablen (Werteparameter)
==> soviel hab ich noch verstanden )

Aber durch die Zuweisung müsste es doch auch ohne "var" gehen.
Oder gilt die Vertauschung so nur innerhalb der Procedure?

Ich hoffe, mir kann das jemand verständlich erklären.
  Mit Zitat antworten Zitat
Benutzerbild von r_kerber
r_kerber

Registriert seit: 11. Feb 2003
Ort: Trittau
3.538 Beiträge
 
Delphi XE Professional
 
#2

Re: procedure...(var i,j: integer) - Erklärung für das "

  Alt 9. Nov 2003, 11:18
Hallo Matze,

dann schau Dier mal, was in der OH unter Prozedurdeklarationen steht.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: procedure...(var i,j: integer) - Erklärung für das "

  Alt 9. Nov 2003, 11:20
Wie du schon sagst, deklarierst du einen Parameter als var-Parameter, wird der Routine nicht die Kopie der Variablen übergeben, sondern eine Referenz auf die Adresse im Speicher. Ändert die Prozedur jetzt den Wert an dieser Adresse, hat das natürlich auch Gültigkeit für alle anderen Prozeduren. Übergibst du eine Kopie der Variablen, ohne var, dann ist es eben eine Kopie. Mit der kann die Routine anstellen, was sie will, auf das original hat das keine Auswirkung.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: procedure...(var i,j: integer) - Erklärung für das "

  Alt 9. Nov 2003, 11:33
Danke, ich verstehe es jetzt schon etwas bessser?

Komisch, dass Daniel_B seinen Beitrag wieder gelöscht hat
  Mit Zitat antworten Zitat
Daniel B
(Gast)

n/a Beiträge
 
#5

Re: procedure...(var i,j: integer) - Erklärung für das "

  Alt 9. Nov 2003, 11:34
Zitat von Matze:
Komisch, dass Daniel_B seinen Beitrag wieder gelöscht hat
Nachdem Luckie der Meinung war das es der grösste schmarrn ist/war, habe ich es gelöscht, ja.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: procedure...(var i,j: integer) - Erklärung für das "

  Alt 9. Nov 2003, 11:35
Er hat ihn gelöscht, nachdem ich ihn daraufhingewiesen habe, dass er sachlich falsch war.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7

Re: procedure...(var i,j: integer) - Erklärung für das "

  Alt 9. Nov 2003, 12:38
Ich würde mir da keine großen Gedanken machen, was im Speicher passiert, sondern wie die Logik in Delphi für so was aussieht und was mit den Gültigkeitsbereichen ist.

Prozedur mit Wert-Parametern (ohne VAR)

wie Luckie gesagt hat werden die Variablen an die Prozedur übergeben und innerhalb dieser weiterverarbeitet. Außerhalb der Prozedur hat das keinerlei Auswirkungen. Deshalb siehst Du auch nichts von dem Vertauschen.

Prozedur mit VAR-Parametern

genau wie vorher. ABER !!! Die innerhalb der Prozedur geänderten Parameter werden wieder an das aufrufende Programm zurück geliefert. In dem konkreten Beispiel würde dies z.B. bedeuten, daß beim ersten Aufruf der Prozedur die Zahlen vertauscht würden. Beim nächsten Aufruf werden sie wieder vertauscht, es wäre also alles wie zu Anfang.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: procedure...(var i,j: integer) - Erklärung für das "

  Alt 9. Nov 2003, 12:53
Zitat von Hansa:
Ich würde mir da keine großen Gedanken machen, was im Speicher passiert, sondern wie die Logik in Delphi für so was aussieht und was mit den Gültigkeitsbereichen ist.
Ich schon. Man soll es ja auch verstehen. Und was ist so schlimm daran es gleich richtig und verständlich erklären zu wollen? Das Alter, in dem man ihm noch mit den Bienchen und den Blümchen Sacher erklären muss, hat er hoffentlich hinter sich.
Zitat:
Prozedur mit Wert-Parametern (ohne VAR)

wie Luckie gesagt hat werden die Variablen an die Prozedur übergeben und innerhalb dieser weiterverarbeitet. Außerhalb der Prozedur hat das keinerlei Auswirkungen. Deshalb siehst Du auch nichts von dem Vertauschen.
Sie werden eben kopiert, warum nennst du das Kind nicht beim Namen?
Zitat:
Prozedur mit VAR-Parametern

genau wie vorher. ABER !!! Die innerhalb der Prozedur geänderten Parameter werden wieder an das aufrufende Programm zurück geliefert.
Und das ist eben nicht richtig. Es wird nichts zurückgeliefert. Es mag zwar so aussehen, aber es ist schlicht und ergreifend falsch. Eine Funktion liefert ein Ergebnis zurück, das wäre richtig. Was hier passiert könnte man am ehesten noch so umschreiben: Es wird an einer Stelle etwas geändert, auf das die Subroutine und die aufrufende Routine gleichermaßen Zugriff haben - eben die Adresse im Speicher.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#9

Re: procedure...(var i,j: integer) - Erklärung für das "

  Alt 9. Nov 2003, 13:09
Zitat:
Man soll es ja auch verstehen. Und was ist so schlimm daran es gleich richtig und verständlich erklären zu wollen? Das Alter, in dem man ihm noch mit den Bienchen und den Blümchen Sacher erklären muss, hat er hoffentlich hinter sich.
und
Zitat:
Und das ist eben nicht richtig. Es wird nichts zurückgeliefert. Es mag zwar so aussehen, aber es ist schlicht und ergreifend falsch.
Ich stimme hier vollkommen mit Luckie überein. Spätestens, wenn man beginnt, CallByReference zusammen mit OOP oder Nebenläufigkeit einzusetzen, wird man mit einem falschen Verständnis Probleme bekommen, die sich dann wg des vereinfachten Bildes nicht durch Debugging oder "scharfes Hinsehen" lösen lassen!

Die beiden Paradigmen CallByValue und CallByReference sind Sprachübergreifen, Du solltest genug Infos im Netz hierzu bekommen.
gruß, choose
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: procedure...(var i,j: integer) - Erklärung für das "

  Alt 9. Nov 2003, 13:45
Hey danke!

Streitet euch nicht.

Ihr seid alle echt großartig!!

Ich kappier's! (ich nehm jetzt mal Luckies Aussage).

Das ist nix gegen die anderen!!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:54 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