Seite 1 von 1

CopyArray() - Array schnell kopieren

Verfasst: 01.05.2009 19:26
von cxAlex
Hier ein kleines Snippet um schnell ein Array in ein Anderes zu kopieren egal welchen Typs (PB - Standard, Struktur...) und egal mit wie vielen Dimensionen. Finde ich persönlich ganz praktisch, vlt. kanns jemand brauchen.

Code: Alles auswählen

; Kopiert schnell ein Array in ein Anderes
Macro CopyArray(Array1, Array2, Type)
  CopyMemory(@Array1, @Array2, PeekI(@Array1-SizeOf(Quad))*SizeOf(Type))
EndMacro

; Test 1

Dim Array1(99)
Dim Array2(99)

; Array 1 füllen
For i = 0 To 99
  Array1(i) = i*2
Next

; Kopiern
CopyArray(Array1(), Array2(), Integer)

; Array 2 Ausgeben
For i = o To 99
  Debug Array2(i)
Next


; Test 2

Dim Array3(9,9)
Dim Array4(9,9)

; Array3 füllen
For i = 0 To 9
  For ii = 0 To 9
    x+1
    Array3(i, ii) = x
  Next
Next

; Kopiern
CopyArray(Array3(), Array4(), Integer)

; Array4 ausgeben
For i = 0 To 9
  For ii = 0 To 9
    Debug Array4(i, ii)
  Next
Next
Viel Spaß damit, Gruß, Alex :D

Verfasst: 01.05.2009 19:36
von ts-soft
Das Ergebnis Deines Beispiels erreiche ich aber mit Swap in einer vielfachen Geschwindigkeit :mrgreen:

Verfasst: 01.05.2009 19:38
von cxAlex
ts-soft hat geschrieben:Das Ergebnis Deines Beispiels erreiche ich aber mit Swap in einer vielfachen Geschwindigkeit :mrgreen:
Mit dem Unterschied das Swap den Inhalt tauscht :mrgreen:

Verfasst: 01.05.2009 19:38
von STARGÅTE
jo die sache hatten wie ja des öffteren.

Und da nur die Pointer von Strings kopiert werden, und nicht die Strings selber, würde sich eine änderung des String auf das Original und die Kopie beziehen, was nicht sein sollte, wenn es wirklich eine KOPIE ist!

Wäre also gut noch mal bei den andere Tips zu gucken, um auch Strings zu kopieren, nicht das Leute sich später wundern...

Verfasst: 01.05.2009 19:43
von cxAlex
Stimmt, also das geht mit allen Datentypen außer mit Strings gut. (Außer man verwendet fixed Strings)

@ts: ich denke denn Speedunterschied kann man vernachlässigen, ich bekomm bei 10 Mio. Durchläufen erst ne andere Dauer als 0 bei beiden Varianten:

Code: Alles auswählen

; Kopiert schnell ein Array in ein Anderes
Macro CopyArray(Array1, Array2, Type)
  CopyMemory(Array1, Array2, PeekI(Array1-SizeOf(Quad))*SizeOf(Type))
EndMacro

; Test 1

Dim Array1(100000)
Dim Array2(100000)

t = ElapsedMilliseconds()
For i = 1 To 10000000
  Swap Array1(), Array2()
Next
t1= ElapsedMilliseconds()-t

t = ElapsedMilliseconds()
For i = 1 To 10000000
  CopyMemory(Array1(), Array2(), Integer)
Next
t2= ElapsedMilliseconds()-t

MessageRequester("",Str(t1)+Chr(13)+Str(t2))

Verfasst: 03.05.2009 17:57
von Andesdaf
könnte ich durchaus mal brauchen...