AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Variablenübergabe - erklärt mir das einer?
Thema durchsuchen
Ansicht
Themen-Optionen

Variablenübergabe - erklärt mir das einer?

Ein Thema von Amandus · begonnen am 24. Nov 2003 · letzter Beitrag vom 26. Nov 2003
Antwort Antwort
Seite 1 von 2  1 2      
Amandus

Registriert seit: 24. Nov 2003
4 Beiträge
 
#1

Variablenübergabe - erklärt mir das einer?

  Alt 24. Nov 2003, 20:33
Hallo

Wir programmieren seit Schulbeginn mit Borland Delphi 6. Ich komm eigentlich ganz gut damit klar, habe aber eine Frage bezüglich der Variablenübergabe. Ich schreibe das Beispielprogramm rein und hab dann spezifische Fragen:

Delphi-Quellcode:
program V_ADD2; // Vektoraddition mit Unterprogramme
{$APPTYPE CONSOLE}
uses
  SysUtils;

type vektor=array[1..3] of integer;
      //benutzerdef. Variablentyp

var a, b, c : vektor;
     
procedure eingabe (ch:char;var v:vektor);
var i:integer;
 begin
  writeln('Vektoreingabe ',ch,'.Vektor:');
  writeln;
   for i:=1 to 3 do
      begin
        write(i,'-te Koordinate = ');
        readln(v[i]);
      end;
 end;

procedure vektoraddition (v1,v2:vektor; var v3:vektor);
var i : integer;
 begin
  for i:=1 to 3 do v3[i]:=v1[i]+v2[i];
 end;

procedure ausgabe (v:vektor);
var i:integer;
 begin
  writeln('Der Summenvektor lautet:');
  writeln;
   for i:=1 to 3 do writeln(i,'-te Koordinate = ',v[i]);
 end;

begin
  writeln('VEKTORADDITION');
  writeln('==============');
  writeln;
  eingabe('1',a);
  eingabe('2',b);
  vektoraddition(a,b,c);
  ausgabe(c);
  writeln;
  writeln('RETURN zum Beenden!');
  readln;
end.
1. procedure eingabe: Also die Variable ch bekommt vom Unterprogramm den Wert 1 zugewiesen. Aber: Warum rechnet man in "eingabe" nicht gleich mit der Variable "a", wieso verwendet man "v"? Ich habe gelesen, dass im Unterprogramm die Variablen, die übergeben werden, neu bezeichnet werden sollen, aber warum? Was passiert da? (in einfachen Worten, wenn's geht)
Wieso kann das Unterprogramm überhaupt mit v rechnen? v ist doch nirgends deklariert?

2. procedure vektoraddition: Was passiert da mit den Variablen? Wie werden die hin- und hergeschaufelt? Ich habe schon gegoogelt, aber das wesentliche nie verstanden, wenns um Variablenübergabe ging...

3.procedure ausgabe: "... Koordinate = ',v[ i ]]; ..." - Wie kann hier mit v gerechnet werden, wo v doch gar nicht deklariert wird?

Ich bin für euren Rat schon im Voraus dankbar,
Amandus

[edit=Admin]Delphi-Code bitte in die Tags [ delphi] und [ /delphi] stecken. Danke. Mfg, Daniel[/edit]
[edit=Admin] Mfg, Daniel[/edit]
  Mit Zitat antworten Zitat
Benutzerbild von Christian S.
Christian S.

Registriert seit: 19. Apr 2003
Ort: Düsseldorf
835 Beiträge
 
#2

Re: Variablenübergabe - erklärt mir das einer?

  Alt 24. Nov 2003, 20:46
Hallo!

Ich gehe jetzt einfach mal die Fragen durch.

(1) Weshalb mit im Unterprogramm nicht gleich mit "a" rechnet wird schon in Deinem eigenen Programm klar. Dann müsstest Du für "b", welches Du ja auch noch einmal mit dem gleichen Unterprogramm einliest, das ganze noch einmal schreiben. Und so, wie es jetzt ist, kannst Du jeden beliebigen Vektor einelesen!
Deklarieren musst Du den Vektor v nicht, denn dadurch, dass Du ihn als Parameter angegeben hast, ist er im Unterprogramm schon deklariert.

(2) An die Prozedur "Vektoraddition" werden drei Parameter übergeben. Die ersten beiden sind die Vektoren, die addiert werden sollen und der dritte ist der Ergebnisvektor. Dabei ist zu beachten, dass vor dem Ergebnisvektor das Wörtchen "VAR" steht. Das bedeutet, dass wenn Du - wie es in Deinem Beispiel geschieht - eine Variable c (die im Hauptprogramm deklariert ist) an diese Prozedur als Ergebnisvektor übergibst, jede Änderung, die im Unterprogramm an dieser Variable gemacht wird, auch im Hauptprogramm erscheint. Man sagt, die Variable wird "als Referenz" übergeben. Die beiden ersten Variablen werden "als Wert" übergeben. (Fachbegriffe "call by reference" und "call by value").
Um es deutlicher zu machen: da Du c "als Referenz" übergeben hast, werden die Zuweisungen, die im Unterprogramm "Vektoraddition" gemacht werden, für c auch im Hauptprogramm gelten.
Effektiv wird in der Vektoraddition also nur jeden Komponente von a mit der entsprechenden Komponente in b addiert wird und das Ergebnis in der entsprechenden Komponente in c gespeichert wird ... und dies auch im Hauptprogramm in c zu sehen ist.

(3) siehe (1)

So, ich hoffe ein wenig Klarheit geschafft zu haben. Wenn nicht, denk dran: es ist schon spät!

mfG
Peter

//edit: Ach ja: Willkommen im Forum!
Christian S.
Admin in der Entwickler-Ecke
  Mit Zitat antworten Zitat
Amandus

Registriert seit: 24. Nov 2003
4 Beiträge
 
#3

Re: Variablenübergabe - erklärt mir das einer?

  Alt 24. Nov 2003, 21:16
Danke für die Antwort, jetzt ist's mir ein bisserl klarer.

Ein anderes Beispiel: Ich gebe die Variablen a,b ans Unterprogramm. Dort rechne ich a,b auf ein Zwischenergebnis o und aus dem dann c. "o" wird nur im Unterprogramm verwendet, ist also eine lokale Variable von der procedure. "c" ist aber später im Hauptprogramm interessant.

Welche Parameter muss ich dann in den Parameterkopf schreiben?

stimmt das:

Code:
procedure unterprogramm(m,n:real;var p)
var o:real;
begin
  o:=a+b;
  p:=o*pi
end;

.
.
.

begin
  .
  .
  .
  unterprogramm(a,b,c)
  .
  .
  .
end.
Also a entspricht m, b entspricht n und c - das Ergebnis - entspricht p. Wenn ich später p erneut in einem Unterprogramm verwende, muss ich es wieder mit unterprogramm2(c) übergeben, oder? Da c ja der Wert von p "überwiesen" wurde.

Amandus
  Mit Zitat antworten Zitat
Benutzerbild von Christian S.
Christian S.

Registriert seit: 19. Apr 2003
Ort: Düsseldorf
835 Beiträge
 
#4

Re: Variablenübergabe - erklärt mir das einer?

  Alt 24. Nov 2003, 21:25
Dein Unterprogramm ist noch nicht ganz richtig. Denn im Unterprogramm willst Du ja nicht mit den Variablen a und b arbeiten (die im Hauptprogramm deklariert wurden), sondern mit den Parametern m und n. Auch hast Du vergessen p einen Typen zuzuweisen. Es muss also heißen:
Delphi-Quellcode:
procedure unterprogramm(m,n:real;var p : real)
var o:real;
begin
  o:=m+n;
  p:=o*p;
end;
Zu Deiner letzten Frage muss ich dann doch nochmal was weiter ausholen und meine vorigen Erklärungen ergänzen. Also noch einmal zu "call by reference": Wenn Du schreibst, der Wert von p an c überwiesen wird, ist das nicht ganz korrekt. (Kannste ja auch nicht wissen.) Denn im Grunde genommen ist p nur ein Zweitname für c.
Eine Variable ist ja eigentlich nur ein Speicherbereich. Und mit "c" sagst Du dem Compiler nur, auf welchen Bereich im Speicher er zugreifen soll. Wenn Du nun eine Variable durch "call by reference" übergibst (z.B. als p), dann greifst Du mit "p" auf denselben Speicherbereich zu wie mit "c". Der Wert von p wird also nicht an c "überwiesen", sondern der Wert p ist der Wert von c.

Ich hoffe, das alles nicht zu viel auf einmal!

MfG
Peter
Christian S.
Admin in der Entwickler-Ecke
  Mit Zitat antworten Zitat
Amandus

Registriert seit: 24. Nov 2003
4 Beiträge
 
#5

Re: Variablenübergabe - erklärt mir das einer?

  Alt 24. Nov 2003, 21:47
Das hast du aber schön erklärt. Danke. Natürlich sollte das im Unterprogramm m und n heißen, statt a und b.
  Mit Zitat antworten Zitat
Amandus

Registriert seit: 24. Nov 2003
4 Beiträge
 
#6

Re: Variablenübergabe - erklärt mir das einer?

  Alt 25. Nov 2003, 16:56
Hallo again

Ich habe noch eine Frage:

Code:
procedure unterprogramm(var u_zahl:integer);
  begin
    u_zahl:=u_zahl*7;
  end;

begin
  .
  .
  .
  zahl:=5;
  unterprogramm(zahl);
  .
  .
  .
end.
Im Hauptprogramm wird "zahl" der Wert 5 zugewiesen. Dann wird Das Unterprogramm aufgerufen, in dem zahl mit 7 multipliziert wird. Dann gibt das Unterprogramm die Variable wieder an das Hauptprogramm zurück, in dem zahl dann 7x größer ist, als vor dem Unterprogramm.

Wieso aber weiß das Unterprogramm von "zahl"? zahl wird doch nur per "var u_zahl:integer" an das Hauptprogramm zurückgegeben aber nicht hineingegeben?! Wird eine Variable per var herausgegeben UND hineingegeben?

Fragen: Warum heißt es nicht:

Code:
procedure unterprogramm(zahl:integer;var u_zahl:integer);
  begin
    u_zahl:=u_zahl*7;
  end;

begin
  .
  .
  .
  zahl:=5;
  unterprogramm(zahl,zahl);
  .
  .
  .
end.
Ich weiß, dass das erste Beispiel funktioniert, finde es aber seltsam, da man "zahl" doch auch hineingeben sollte. Sorry für die etwas laienhafte Wortwahl, aber ich hab noch keinen Programmierer-Slang.

Amandus
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#7

Re: Variablenübergabe - erklärt mir das einer?

  Alt 25. Nov 2003, 17:02
Hi!

Also ich glaub grundsätzlich mal, neue Frage nuer Thread, aber ich guck trotzdem mal

Also im Kopf der Prozedur werden keine Rückgaben angegeben (also bei dem 2. Beispiel machst du 2 Übergaben, und nicht 1 und 1). Für Rückgaben braucht man function

Wie allerdings beim 1. Beispiel der neue Wert wieder in Zahl kommen soll ist mir nicht begreiflich!
Nachdem was da steht ist Zahl nachher immer noch 5 und u_zahl 35

Sollte es vielleicht heißen

zahl:=u_zahl*7 (dann müsste aber Zahl ne globale Variable sein, was ich für unwahrscheinlich halte)

Ciao fkerber
Frederic Kerber
  Mit Zitat antworten Zitat
Benutzerbild von Christian S.
Christian S.

Registriert seit: 19. Apr 2003
Ort: Düsseldorf
835 Beiträge
 
#8

Re: Variablenübergabe - erklärt mir das einer?

  Alt 25. Nov 2003, 18:14
Hallo!

@fkerber: call by reference ist Dir schon bekannt, oder? Und der Gebrauch von "VAR"?

So, zur Erklärung. Dazu erst einmal noch mal aus meinem letzten Posting:
Zitat von Peter Lustig:
Zu Deiner letzten Frage muss ich dann doch nochmal was weiter ausholen und meine vorigen Erklärungen ergänzen. Also noch einmal zu "call by reference": Wenn Du schreibst, der Wert von p an c überwiesen wird, ist das nicht ganz korrekt. (Kannste ja auch nicht wissen.) Denn im Grunde genommen ist p nur ein Zweitname für c.
Eine Variable ist ja eigentlich nur ein Speicherbereich. Und mit "c" sagst Du dem Compiler nur, auf welchen Bereich im Speicher er zugreifen soll. Wenn Du nun eine Variable durch "call by reference" übergibst (z.B. als p), dann greifst Du mit "p" auf denselben Speicherbereich zu wie mit "c". Der Wert von p wird also nicht an c "überwiesen", sondern der Wert p ist der Wert von c.
So. Hier geht es geanuso. Sagen wir, "zahl" zeigt im Hauptprogramm auf den Speicherbereich Nr. 42. Dann bewirkt das "VAR" in der Parameter-Übergabe, dass "u_zahl" im Unterpogramm ebenfalls auf Speicherbereich Nr. 42 zeigt. Damit wird jede Aktion, die an "u_zahl" vorgenommen wird, auf dem Speicherbereich 42 vorgenommen.
Da jedoch im Hauptprogramm "zahl" ja immer noch auf Speicherbereich 42 zugreift, ändere ich mit dem Unterprogramm den Inhalt von "zahl". Wie gesagt: "u_zahl" ist nur ein Zweitname für den Speicherbereich von "zahl".

Wenn Du das "VAR" nicht im Parameter hättest, würde das nicht funtionieren. Dann würde für "u_zahl" im Unterprogramm ein eigener Speicherbereich (z.B. Nr. 43) eingerichtet und der Wert von "zahl" in diesen Speicherbereich kopiert. Da jedoch "u_zahl" jetzt mit Speicherbereich 43 arbeitet, "zahl" aber mit 42, würden die Änderungen auf "zahl" keine Auswirkung haben. Wie gesagt: nur wenn das "VAR" nicht dort steht. Das wäre dann "call by value", weil der Wert kopiert wird.

MfG
Peter

MfG
Peter
Christian S.
Admin in der Entwickler-Ecke
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#9

Re: Variablenübergabe - erklärt mir das einer?

  Alt 25. Nov 2003, 20:18




ich hab das var überlesen *schäm*
tja uups
schieben wir es mal auf meine Signatur oder reden uns damit raus, dass kein Syntaxhighlighting eingesetzt war!!!

Aber im Endeffekt muss ich wohl lesen lernen

Sorry für die falschen Ausführungen.
Frederic Kerber
  Mit Zitat antworten Zitat
Benutzerbild von Christian S.
Christian S.

Registriert seit: 19. Apr 2003
Ort: Düsseldorf
835 Beiträge
 
#10

Re: Variablenübergabe - erklärt mir das einer?

  Alt 25. Nov 2003, 20:35
Macht ja nichts! Hat mich halt nur irgendwie gewundert. Das überlesene Wörtchen erklärt es natürlich.
Christian S.
Admin in der Entwickler-Ecke
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 14:14 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