Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - dynamic array übegeben
blacki - Mi 29.10.03 11:43
Titel: dynamic array übegeben
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:
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 - 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:
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 - 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?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!