Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0403: Schnelle Array-Operationen, kopieren, vertauschen, löschen

 von 

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:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

RtlMoveMemory (CopyMemory), RtlFillMemory (FillMemory), RtlMoveMemory (MoveMemory), RtlZeroMemory (ZeroMemory)

Download:

Download des Beispielprojektes [2,64 KB]

'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-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

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