Прозрачные указатели

Здесь можно найти готовые «кирпичики» — части кода, пригодные для построения более крупных проектов, а также решения различных типовых и не очень задач на VB.

Модератор: Brickgroup

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Прозрачные указатели

Сообщение tyomitch » 18.07.2006 (Вт) 18:49

Эта процедура создаёт магическую переменную, работающую как указатель.
Передаваемые параметры должны быть параметрами типа 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
Изображение

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 18.07.2006 (Вт) 19:04

Читая название темы я был уверен, что в ней проект для работы с прозрачными (с альфа каналом) указателями (т.е. иконками курсора мыши) в программе... :)

А тут...
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 18.07.2006 (Вт) 22:06

BV
Аналогично


Вернуться в Кирпичный завод

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13

    TopList