Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - dynamisches array an array zuweisen
delphijanka - Do 15.04.10 18:21
Titel: dynamisches array an array zuweisen
ich habe:
Delphi-Quelltext
1: 2: 3: 4:
| Func(const OldArray: array of String); var NewArray: array of String; begin ... |
was ich möchte:
dies geht aber nicht. Brauche Hilfe, wie ich dies schaffen kann.
Moderiert von
Narses: Delphi-Tags hinzugefügt
Jakob_Ullmann - Do 15.04.10 18:37
Am einfachsten wäre glaube ich sowas:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| var i: Integer; begin for i := 0 to Length(OldArray) - 1 do NewArray[i] := OldArray[i] end; |
Narses - Do 15.04.10 19:15
Moin!
delphijanka hat folgendes geschrieben : |
was ich möchte:
|
Was man so nicht sehen kann: möchtest du denn eine Kopie der Werte anlegen oder die Referenz duplizieren? :nixweiss:
cu
Narses
Martok - Do 15.04.10 19:34
Soll doch die Compiler-Magic entscheiden :D
Es geht, wenn du dir einen Typ TStringArray oder so definierst, und beide Variablen von diesem Typ sind.
Sonst denkt der Compiler, die wären unterschiedlich und meckert.
thepaine91 - Fr 16.04.10 07:32
Da es ja ein Dyn Array ist muss er da nicht erst mal
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| setlength(NewArray, length(Oldarray)); Newarray := oldarray; for i := 0 to high(oldarray) do begin Newarray[i] := oldarray[i]; end; |
Edit: Quelltext angepasst.
delphijanka - Fr 16.04.10 09:07
@Narses
wie geht es mit Referenz?
Gammatester - Fr 16.04.10 09:13
delphijanka hat folgendes geschrieben : |
Delphi-Quelltext 1:
| Func(const OldArray: array of String); | |
OldArray ist
kein dynamisches Array sondern ein "Open Array Parameter". Um es dynamisch zu machen, must Du wie Martok schon angdeutet hat, einen separaten Typ
type TStringArray = array of String; definieren und OldArray und NewArray damit deklarieren.
delphijanka - Fr 16.04.10 09:18
@Gammatester
ich habe bereits mehrere andere Funktionen deklariert, wo die Übergabearrays "array of String" sind.
hier möchte ich den globalen <NewArray> an diese Funktionen übergeben.
sollte sich der Typ auf TStringArray geändert haben, muss ich dies in allen Funktionen anpassen, und das ist für mich ein grosser Aufwand.
thepaine91 - Fr 16.04.10 09:23
Wie Jakob_Ullman schon im 2. Post ähnlich schrieb wäre es hiermit getan:
Delphi-Quelltext
1: 2: 3: 4: 5:
| setlength(Newarray, length(Oldarray)); for i := 0 to high(oldarray) do begin Newarray[i] := oldarray[i]; end; |
Dann musst du auch in keiner anderen Funktion/Prozedur etwas ändern.
delphijanka - Fr 16.04.10 11:23
@thepaine91
Ich möchte bei dieser Lösung ein anderes Problem schildern. Ich brauche dieses "Kopieren" von Arrays an ziemlich mehreren Stellen.
Ich habe mir dann gleich gedacht, dafür eine Prozedur zu schreiben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure KopiereArray(const VonArray: array of String; var ToArray: array of String); var Index: Word; begin SetLength(ToArray, Length(VonArray));
from Index := 0 to ... |
Das Problem bei dieser Lösung ist jedoch, dass ich den SetLength auf ToArray nicht anwenden kann.
Moderiert von
Narses: Code- durch Delphi-Tags ersetzt
Gammatester - Fr 16.04.10 12:02
Ich kann nur wiederholen, daß das keine dynamischen Arrays sind, sondern Open Array Parameter. Das sind fixe Arrays! Der Unterschied liegt darin, daß Arrays unterschiedlicher Länge übergehen werden können, und die High()-Funktion liefert die aktuelle Länge. Das es nix Dynmisches gibt, kann selbstverständlich die Länge nicht geändert werden.
delphijanka - Fr 16.04.10 12:17
@Gammatester:
wenn ich ein Array übergebe, übergebe ich damit die Anfangsadresse.
wie kann ich diese Adresse an "ToArray" zuweisen? (Referenz)
Gammatester - Fr 16.04.10 12:39
delphijanka hat folgendes geschrieben : |
@Gammatester:
wenn ich ein Array übergebe, übergebe ich damit die Anfangsadresse.
wie kann ich diese Adresse an "ToArray" zuweisen? (Referenz) |
Wahrscheinlich gar nicht. Eine mögliche (relativ unschöne) Lösung für Dein Problem wäre ein Copy-Funktion, etwa so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| type TArrayOfString = array of string;
function ArrayCopy(const OldArray: array of string): TArrayOfString; var i: integer; begin setlength(Result, length(Oldarray)); for i:=0 to high(OldArray) do Result[i] := oldarray[i]; end;
procedure TForm1.Button1Click(Sender: TObject); var x,y: array of string; begin setlength(x,2); x[0] := '0000000000'; x[1] := '11111111111111'; TArrayOfString(y) := ArrayCopy(x); Button1.Caption := y[1]; end; |
Den Typecast TArrayOfString() wirst Du nicht los, da Delphi zwei verschiedene "Array of string"-Deklarationen als zwei verschiedene Typen behandelt.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!