VB 5/6-Tipp 0403: Schnelle Array-Operationen, kopieren, vertauschen, löschen
von ActiveVB
Beschreibung
Hier werden vier direkte und sehr schnelle Speicherzugriffs-Funktionen erläutert. Angewendet auf ein Array lassen sich die sonst oft rechenzeit-intensiven Umschichtaktionen von Array auf ein Bruchteil optimieren. Unter Win9x klappt das sogar Prozessübergreifend, was ja im Sinne der mehr weniger strengen Windows-Definition eigentlich nicht möglich sein sollte.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: RtlMoveMemory (CopyMemory), RtlFillMemory (FillMemory), RtlMoveMemory (MoveMemory), RtlZeroMemory (ZeroMemory) | Download: |
'Dieser Quellcode stammt von http://www.activevb.de 'und kann frei verwendet werden. Für eventuelle Schäden 'wird nicht gehaftet. 'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. 'Ansonsten viel Spaß und Erfolg mit diesem Source! '------------- Anfang Projektdatei Project1.vbp ------------- '--------- Anfang Formular "Form1" alias Form1.frm --------- ' Steuerelement: Schaltfläche "Command5" ' Steuerelement: Schaltfläche "Command4" ' Steuerelement: Schaltfläche "Command3" ' Steuerelement: Textfeld "Text1" ' Steuerelement: Schaltfläche "Command2" ' Steuerelement: Schaltfläche "Command1" ' Steuerelement: Listen-Steuerelement "List2" ' Steuerelement: Listen-Steuerelement "List1" ' Steuerelement: Beschriftungsfeld "Label2" ' Steuerelement: Beschriftungsfeld "Label1" Option Explicit Private Declare Sub CopyMemory Lib "kernel32" Alias _ "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal _ ByteLen As Long) Private Declare Sub ZeroMemory Lib "kernel32.dll" Alias _ "RtlZeroMemory" (Destination As Any, ByVal Length _ As Long) Private Declare Sub FillMemory Lib "kernel32.dll" Alias _ "RtlFillMemory" (Destination As Any, ByVal Length _ As Long, ByVal Fill As Byte) Private Declare Sub MoveMemory Lib "kernel32.dll" Alias _ "RtlMoveMemory" (Destination As Any, Source As _ Any, ByVal Length As Long) Dim A1(0 To 19) As Byte Dim A2(0 To 19) As Byte 'Array komplett auf Null setzen Private Sub Command1_Click() 'Array auf = setzen Call ZeroMemory(A2(0), UBound(A2) + 1) 'Ergebnis anzeigen Call DisplayA2 End Sub 'Array komplett auf einen Wert setzen Private Sub Command2_Click() Dim V As Byte 'Füllwert ermitteln V = CByte(Val(Text1.Text)) 'Array füllen Call FillMemory(A2(0), UBound(A2) + 1, V) 'Ergebnis anzeigen Call DisplayA2 End Sub 'Original Array in Arbeitsarray kopieren Private Sub Command3_Click() 'Kopieren Call CopyMemory(A2(0), A1(0), UBound(A1) + 1) 'Ergebnis anzeigen Call DisplayA2 End Sub 'Zweite Hälfte in die erste kopieren Private Sub Command4_Click() Dim P As Long 'Mitte des Arrays ermitteln P = UBound(A2) \ 2 + 1 'Verschieben Call MoveMemory(A2(0), A2(P), P) 'Ergebnis anzeigen Call DisplayA2 End Sub 'Hälften vertauschen Private Sub Command5_Click() Dim Temp() As Byte Dim P As Long 'Mitte des Arrays ermitteln P = UBound(A2) \ 2 + 1 'Puffer dimensionieren ReDim Temp(0 To P - 1) 'Erste Hälfte in den Puffer kopieren Call CopyMemory(Temp(0), A2(0), P) 'Zweite Hälfte in die erste kopieren Call MoveMemory(A2(0), A2(P), P) 'Puffer zurück in die zweite Hälfte kopieren Call CopyMemory(A2(P), Temp(0), P) 'Ergebnis anzeigen Call DisplayA2 End Sub Private Sub Form_Load() Dim x As Long For x = 0 To UBound(A1) A1(x) = x A2(x) = x Next x 'Arrays anzeigen Call DisplayA1 Call DisplayA2 End Sub Private Sub DisplayA1() Dim x As Long List1.Clear For x = 0 To UBound(A1) List1.AddItem A1(x) Next x End Sub Private Sub DisplayA2() Dim x As Long List2.Clear For x = 0 To UBound(A2) List2.AddItem A2(x) Next x End Sub '---------- Ende Formular "Form1" alias Form1.frm ---------- '-------------- Ende Projektdatei Project1.vbp --------------
Tipp-Kompatibilität:
Windows/VB-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.
Archivierte Nutzerkommentare
Klicken Sie diesen Text an, wenn Sie die 2 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.
Kommentar von FrankAdelik am 12.02.2006 um 22:40
Bei mir funktioniert der unter VB5/XP einwandfrei.
Nur der Retainedschlüssel muss wie überall per Notepad
aus der Project1.vbp entfernt werden.
Kommentar von Asty am 24.11.2001 um 17:56
Wie sieht das aus wenn ich zweidimenssionale Arrays kopieren will oder nullsetzen, geht das so auch viel schneller?
z.B bhk1(6,13)=vhk1(6,13)
Gruß Asty