Variablen vergleichen

02/07/2013 - 12:32 von spanker.leach | Report spam
Hallo zusammen,

ich habe 2 Arrays, angefüllt mit einem UDT.

Sieht (schematisch) so aus:

Type bufferA
A as double
B as double
… jede Menge mehr
End type

Dim New(1000) as bufferA
Dim Old(1000) as bufferA

New wird stànding veràndert und nach der Verwendung mit CopyMemoryV in Old umkopiert.

Ich muss an einer Stelle im Programm sehr schnell prüfen, ob Old und New identisch sind.

Jetzt kann ich natürlich jedes einzelne Element durchgehen:

Unterschiedlich = 0

For i = 0 to 1000

If old(i).A = new(i).A then
else
Unterschiedlich = Unterschiedlich + 1
End if

If old(i).B = new(i).B then
else
Unterschiedlich = Unterschiedlich + 1
End if

… jede Menge mehr

Next

If Unterschiedlich > 0 then
Debug.Print "Unterschiedlich"
Else
Debug.Print "Gleich"
End if

Das dauert natuerlich ewig.

Fàllt jemandem eine elegante und schnelle Lösung ein?


Viele Grüsse,
Karl
 

Lesen sie die antworten

#1 Schmidt
02/07/2013 - 15:14 | Warnen spam
Am 02.07.2013 12:32, schrieb :

ich habe 2 Arrays, angefüllt mit einem UDT.

Sieht (schematisch) so aus:

Type bufferA
A as double
B as double
… jede Menge mehr
End type

Dim New(1000) as bufferA
Dim Old(1000) as bufferA

New wird stànding veràndert und nach der Verwendung mit CopyMemoryV in Old umkopiert.



Das sollte man nur tun, wenn der UDT keine dynamischen Strings
und keine dynamischen Arrays enthàlt (also keine Pointer-Typen).

Bzw. man kann das tun - muss dan aber *vor* dem Kopieren im
Dst-Typ alle Pointertypen hàndisch "free-en" (also Strings
auf vbNullstring setzen, dynamische Arrays "Erasen") -
danach kann man dann CopyMemory (mittels VarPtr-Wrapping,
um String-ANSI-Konvertierung zu vermeiden) anwenden - muss
dann aber *nach* erfolgter Kopie die Pointer-Member des *Source*-
Typs "an VB vorbei" (mittels RTLZeroMemory) auf 0 setzen,
um "Double-Freeing" zu vermeiden.


Ich muss an einer Stelle im Programm sehr schnell prüfen, ob Old und New identisch sind.



Falls obig gesagtes auf Deinen Typ nicht zutrifft (dieser also keine
Pointer-Typen enthàlt), dann gàbe es mit RtlCompareMemory einen
entsprechend flotten API-Call (exportiert unter __stdcall-convention)
dafür.

Olaf

Ähnliche fragen