schlumsch - Sa 19.12.09 13:52
Titel: Problem call by value/reference
Hallo,
ich habe ein Problem mit call by value/ cb reference.
Soweit ich weiss übergebe ich mit proceduername(parameter) den parameter
als CBV, sprich der Wert des Parameters im ausführenden Kontext wird auch
bei Manipulation des Parameters innerhalb der procedure nicht verändert.
CBR würde ich mit procedurename(var parameter) machen ... richtig?
Nun, ich habe folgenden Code (su). Ich gebe Vor und Nach Aufruff der Procedur
die Inhalte meines Stringlisten-Parameters aus und diese sind unterschiedlich...
Die Modifikation der Inhalte erfolgt dabei durch
Delphi-Quelltext
1:
| pL.Strings[x] := modifyLongDirectoryname(pL.Strings[x],25); |
Der Aufruf aus meinem Hauptprogramm ist updateMemoDirsAndFiles(DirsAndFiles).
Eine Ausgabe von Dirsandfiles.strings[1] enthält vor dem Proceduraufruf den ganzen Dateinamen,
danach den modifizierten kurzen Dateinamen ... genau das soll halt nicht sein.
kann mir das jemand erklären? Übersehe ich da etwas oder werden Listen / Arrays... evtl unter
Delphi gesondert behandelt??
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| Procedure updateMemoDirsAndFiles(pL: TStringList); var x : integer; begin if pL= NIL then exit; if pL.Count < 1 then exit; x:= 0; for x:=0 to pL.Count-1 do begin pL.Strings[x] := modifyLongDirectoryname(pL.Strings[x],25); end; for x:=0 to nList.Count-1 do begin FormDirectorySelect.MemoDirsAndFiles.Lines.Add(pL.Strings[x]); end; end; |
Kha - Sa 19.12.09 16:12
Luckie hat folgendes geschrieben : |
| Objekte werden unter Delphi immer als Zeiger |
Jupp...
Luckie hat folgendes geschrieben : |
| also by reference übergeben. |
Nein, das ist nicht gleichbedeutend!
Kein riesiger Unterschied, aber nur so lässt sich erklären, was passiert, wenn man noch ein
var voranstellen würde.
jaenicke - Sa 19.12.09 20:21
schlumsch hat folgendes geschrieben : |
| Oder kann ich innerhalb einer Prozedur sagen: "hier, mach dir eine Kopie der Liste die du als Aufrufparameter bekommen hast, arbeite mit dieser und lass die Finger von der Aufruföliste?" |
Natürlich geht das. Indem du eine lokale Variable mit einer neuen Liste nimmst und da alle reinschreibst.
Das macht in deinem Fall aber keinen Sinn. Denn du arbeitest damit ja nicht weiter...
Warum nicht direkt so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure updateMemoDirsAndFiles(pL: TStrings); var x: integer; begin if not Assigned(pL) or (pL.Count < 1) then Exit; for x := 0 to Pred(pL.Count) do FormDirectorySelect.MemoDirsAndFiles.Lines.Add( modifyLongDirectoryname(pL[x], 25)); end; |