Autor Beitrag
blacki
Hält's aus hier
Beiträge: 9

Win Xp
D6 Prof
BeitragVerfasst: Mi 29.10.03 11:43 
Hallo!

Ich habe ein Problem bei der Übergabe eines dynamischen Arrays an eine rekursiv verlaufende procedure. Und zwar wird das array jedes mal verändert, sollte aber (ohne var zusatz in der übergabe) bei rückkehr in die vorherige procedure den alten wert haben. Kurzes Beispielprog:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
type
  Ta = array of char;

procedure test(a: Ta);
var i:integer;
begin
  i:=random(2)+1;
  if i = 1 then a[0]:='p'
  else a[0]:='q';
  if i = 1 then test(a);
  showmessage(a[0]);
end;

procedure TForm1.Button1Click(Sender: TObject);
var a: Ta;
begin
  setlength(a,1);
  a[0]:='m';
  test(a);
end;
end.


da kein ranomize aktiviert ist, wird i erst mit 1, 1, 2 besetzt, womit die procedure sich 2 mal selbst aufruft. beim letzten mal wird a auf q gesetzt. kehrt das prog nun in die vorherige procedure zurück, sollte a seinen wert nicht verändert haben (noch auf p sitzen) - tut es aber nicht, es ändert sich auch dort und darüber auf q.

nehme ich statt einem array eine variable vom typ char, klappt es wunderbar, es muss also am dynamic array liegen. wie krig ich das hin?

Danke im vorraus, blacki
Phantom1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 390



BeitragVerfasst: Mi 29.10.03 13:09 
in der hilfe steht dazu folgendes:

Zitat:

Da in Delphi keine Wertesemantik für dynamische Arrays implementiert sind, stellen "Werte"-Parameter in Routinen keinen vollständige Kopie des dynamischen Arrays dar. Falls eine vollständige Kopie des dynamischen Arrays erforderlich ist, verwenden Sie die Standardprozedur Copy, um eine Wertekopie des dynamischen Arrays zu erstellen.


ich hab dein code mal etwas geändert, jetzt sollte alles gehen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
type 
  Ta = array of char; 

procedure test(a: Ta); 
var i:integer; a1: Ta;
begin 
  a1:=Copy(a);
  i:=random(2)+1
  if i = 1 then a1[0]:='p' 
  else a1[0]:='q'
  if i = 1 then test(a1); 
  showmessage(a1[0]); 
end

procedure TForm1.Button1Click(Sender: TObject); 
var a: Ta; 
begin 
  setlength(a,1); 
  a[0]:='m'
  test(a); 
end
end.
blacki Threadstarter
Hält's aus hier
Beiträge: 9

Win Xp
D6 Prof
BeitragVerfasst: Mi 29.10.03 13:29 
danke, es klappt tatsächlich wunderbar:)
leider ist meine deutschsprachige Delphi anleitung sehr kurz gehalten, wodurch ich gezwungen bin eine englische zu nutzen, bei der ich jedoch oft nicht alles verstehe. weiß vielleich jemand ob / wo im internet ich eine ausführliche deutsche hife herbekomme?