Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - dyn. array kopieren


mk2 - Di 22.10.02 14:28
Titel: dyn. array kopieren
hallo,

ich arbeite sehr viel mit dynamischen arrays in letzter zeit. Das einzige was mich stört, ist das kopieren - ich mach das zur zeit so (a1 nach a2 kopieren):


Quelltext
1:
2:
3:
4:
5:
6:
var i:integer;
     a1,a2:array of integer;
begin
 setlength(a2,length(a1));
 for i:=0 to high(a1) do a2[i]:=a1[i]; 
end;


da mir das immer ein bißchen viel ist wollt ich mir ne funktion zum array kopieren schreiben die den code oben ausführt. Also im prinzip so :


Quelltext
1:
function copyarray(a1:array of integer):array of integer;                    

funktioniert aber leider nicht. eine funktion kann anscheinend kein dyn. array zurückgeben.

hat jemand vielleicht eine idee, wie man das mit dem kopieren trotzdem bißchen einfacher machen kann ? Gibts schon eine mitgelieferte funktion, die das erledigt ?

mfg mk2


O'rallY - Di 22.10.02 14:36

Das Problem hatte ich kürzlich auch (drei Posts weiter unten) und die Lösung ist ziemlich simpel.

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
type
   TAoInteger: array of integer; //eigener Datentyp

...
var
   a1, a2: TAoInteger;
...
begin
   a2 := a1; {stinknormale Zuweisung, wobei SetLength natürlich nicht benötigt wird}
...


Tante - Di 22.10.02 14:39

Hallo, wie wäre es, wenn Du beide Arrays als var-Parameter angibst?
Also folgende Prozedur:

Quelltext
1:
2:
3:
4:
5:
6:
procedure copyarray(var a1,a2:array of integer);
var i:integer; 
  begin 
  setlength(a2,length(a1)); 
  for i:=0 to high(a1) do a2[i]:=a1[i]; 
  end;

Ist nur eine Idee, nicht getestet. :D


AndyB - Di 22.10.02 14:50

Und um es noch einfacher zu machen. Wie wäre es, wenn man die Copy-Funktion von Delphi nutzt?


Quelltext
1:
2:
3:
4:
5:
6:
var MyArray1, MyArray2: array of integer;
begin
  SetLength(MyArray1, 10);
  MyArray[0] := ...;
  MyArray2 := Copy(MyArray1);
end;

Zitat:
Aus der Delphi-Hilfe:
Note: When S is a dynamic array, you can omit the Index and Count parameters and Copy copies the entire array.


mk2 - Di 22.10.02 15:00

danke euch für die schnelle hilfe.

das mit der copy funktion ist natürlich das allereinfachste. genau sowas hab ich gesucht. hätt ich ja auch mal selber drauf kommen können unter copy nachzugucken. :oops:

mfg mk2


aogwaba - Di 22.10.02 19:07

@O'rallY

wenn du das so machst:

Quelltext
1:
 a1:=a2;                    

hast du zwei Referenzen auf das selbe Array!

Kopiert wird da nix.

cu
waba


O'rallY - Mi 23.10.02 13:26

Hmm, klingt vernünftig. Auf jedenfall hat mein Lösungsweg mir helfen könne, vielleicht auch in einem anderen Kontext :mrgeen:.


TheLaw - Do 24.10.02 21:27

Hallo,

Also die dynamischen Arrays bei Delphi Arbeiten mit CopyOnWrite- Semantik.

Beispiel:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  A, B: array of Byte;
begin
  SetLength(A, 10);
  B := A; // Referenzzähler von A wird erhöht 
              // B und A zeigen auf das gleiche Array
  B[0] := 2 // Für Array B wird Speicher reserviert 
                // und Array A wird in B Kopiert und der
                // erste Index auf [b]2[/b] gesetzt
end;


Ich hoffe es ist jetzt "klärer"

mfg Th3Law