Передаваемые параметры должны быть параметрами типа 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






 
 

