Передаваемые параметры должны быть параметрами типа Variant (не переменными).
- На входе:
- Pointer -- значение типа Long, задающее начальное значение указателя
- PointedTo -- любое значение того типа, на который будет ссылаться указатель
- На выходе:
- Pointer -- магическая переменная типа Long, связанная со значением указателя
- PointedTo -- магическая переменная указанного типа, связанная со значением по указателю
- Код: Выделить всё
Private Declare Sub PutMem1 Lib "msvbvm60" (ByVal pDst As Long, ByVal Src As Byte)
Public Sub CreateMagic(Pointer, PointedTo)
Dim lPtr As Long: lPtr = Pointer
Pointer = VarPtr(PointedTo) + 8
PutMem1 VarPtr(Pointer) + 1, &H40
PutMem1 VarPtr(PointedTo) + 1, &H40
Pointer = lPtr
End Sub
Пример использования: цикл по строке без Mid и без копирования во временный байтовый массив
- Код: Выделить всё
Option Explicit
Sub Rot13(str As String, Optional pc, Optional c)
Dim i As Long
pc = StrPtr(str): c = 0
CreateMagic pc, c
For i = 1 To Len(str)
Select Case c
Case 65 To 90: 'A..Z
c = c + 13
If c > 90 Then c = c - 26
Case 97 To 122: 'a..z
c = c + 13
If c > 122 Then c = c - 26
End Select
pc = pc + 2
Next
End Sub
Sub Main()
Dim str As String: str = "Gur dhvpx oebja bk whzcf bire n ynml qbt."
Rot13 str: Debug.Print str
Rot13 str: Debug.Print str
End Sub