Обойти дисциплину типов.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Обойти дисциплину типов.

Сообщение Mikle » 15.12.2005 (Чт) 14:25

Хочу найти способ сделать так, чтобы две переменные разных типов указывали на одну область памяти. Это удается в DLL, так как при Declare дисциплину типов можно не соблюдать, но сам вызов DLL - вещь довольно ресурсоемкая. Мне удалось сделать это с помощью ООП. Сделал DLL с такой функцией:
Код: Выделить всё
Public Sub Associate(Dest As Object, Src As Object)
  Set Dest = Src
End Sub

Далее в своем проекте создаю два класса, например cLong, состоящий из единственной строки:
Код: Выделить всё
Public Val As Long

и cSingle:
Код: Выделить всё
Public Val As Single

В форме такой код:
Код: Выделить всё
Option Explicit
Dim cs As New cSingle
Dim cd As New cLong
Private Declare Sub Associate Lib "dll" (Dest As cLong, Src As cSingle)

Private Sub Form_Load()
  Associate cd, cs
End Sub

Все, можно присвоивать значение переменной cd.Val, а читать из cs.Val. К DLL при этом обращений нет, но обращение к объекту - тоже накладно, я тестировал, на простых функциях, типа FtoDW, быстродействие падает в десятки раз! С учетом того, что приходится обращаться к объекту дважды, потери превышают потери при вызове DLL.

Хочу Sub Associate, который бы ассоциировал друг с другом две НЕ ОБЪЕКТНЫХ переменных!!!
Дело не в ф-ции FtoDW, ее я использовал в качестве теста. Такой метод мне нужен часто, например удобно, работая с цветом, иметь его представление и в виде Long, и в виде типа из четырех байт.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 15.12.2005 (Чт) 15:25

Хм... А посмотри-ка ты примеры с Implicit.
Помоему ты изобретаешь велосипед.
Lasciate ogni speranza, voi ch'entrate.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 15.12.2005 (Чт) 16:01

Почитай статьи GSerg'а, что-то связанное с работой с указателями, или с массивами, но там, кажется, такое было.
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.12.2005 (Чт) 16:22

Ага...

Делаецца это так...
Читаем мою статью про SAFEARRAY, потом делаем SAFEARRAY из четырёх байт на основе памяти, уже отведённой под лонг...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 15.12.2005 (Чт) 17:21

Статью про SAFEARRAY уже качаю!

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 18.12.2005 (Вс) 18:53

Все работает нормально!
Вопрос такой, можно ли получить указатель на указатель не для массива, а для отдельной переменной? А для функции?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 19.12.2005 (Пн) 5:56

FleX_2004
vartpr - это указатель, а не указатель на указатель...

Mikle
А зачем тебе указатель на указатель на переменную?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 19.12.2005 (Пн) 10:32

GSerg
Переменные работают быстрее, чем элементы массива.
Да и академический интерес :lol:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 19.12.2005 (Пн) 13:16

Быстрее, медленнее... Включи оптимизации массивов при компиляции :)

Другим способом не получится - ты не сможешь поменять адрес переменной, это начальная точка.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 06.08.2006 (Вс) 10:26

Еще вопрос. Можно ли (как?) получить указатель на переменную, в которой функция возвращает значение, не находясь в самой функции?
Поясняю - есть функция в обычном модуле:
Код: Выделить всё
Public Function FtoDWArr(ByVal ins As Single) As Long
  s(0) = ins
  FtoDWArr = L
End Function

Предватительно я записал адрес глобальной переменной L в указатель массива S(). Но если бы туда был записан сразу адрес ПЕРЕМЕННОЙ FtoDWArr, то от строки:
Код: Выделить всё
  FtoDWArr = L

Можно было бы избавиться.
Я понимаю, что в динамический ф-циях этот адрес непостоянен, так как мы можем вызывать их рекурсивно, но если объявить ф-цию, как Static?
PS. Не то, чтобы мне была так необходима эта оптимизация, просто это уже для эстетики. 8)

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

Сообщение tyomitch » 06.08.2006 (Вс) 10:33

Во-первых, нельзя, потому что этот адрес всегда на стеке (=непостоянен), а в простых функциях (типа твоей) его может и вовсе не быть.
Во-вторых, а не потестишь ли ты для этой цели мои прозрачные указатели?
Изображение

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 06.08.2006 (Вс) 14:50

На стеке... облом :x
Прозрачные указатели посмотрю.


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: AhrefsBot и гости: 76

    TopList