Модератор: Brickgroup
Public Function LOWORD(ByVal DblWord As Long) As Integer
LOWORD = DblWord And &HFFFF&
End Function
Умножает на два в степени n.А ещё интересно, что делает функция Shift?
Public Function LOWORD(ByVal DblWord As Long) As Integer
LOWORD = DblWord And &H7FFF&
If DblWord And &h8000& then LOWORD = LOWORD or &h8000%
End Function
А ещё интересно, что делает функция Shift?
Где это можно применить?
То есть, без перемещения памяти, чисто логически - не получится?
Да и с loword в примере тоже не всё в порядке - если там поставить целочисленное деление, то функция ошибается на один в некоторых случаях, а если обычное - то ошибается на один в других некоторых случаях.
И всё-таки, первый вопрос интересней. Как код LOWORD поправить? На сколько я понял, в hex-то она даёт правильный ответ.
Можно ли исправить, не пребегая к копимемери?
Чё? Какое ещё деление? Куда подставить?
Public Function HIWORD(ByVal DblWord As Long) As Integer
HIWORD = DblWord / &H10000
End Function
?hex(HIWORD(&hfff08001))
FFF1
?hex(HIWORD(&hffff8001))
0
Именно из-за этой интеллектуальной особенности приведения типов...
Public Function HIWORD(ByVal DblWord As Long) As Integer
HIWORD = ((DblWord And &HFFFF0000) \ &H10000)
End Function
Public Function HIWORD(ByVal DblWord As Long) As Integer
HIWORD = DblWord \ &H10000
If DblWord < 0 Then
If DblWord And &HFFFF& Then HIWORD = HIWORD - 1
End If
End Function
Теперь бы автору просигналить, чтобы поправил кирпич...
Public Sub testLo()
Dim l As Long, tc As Long, k As Long
tc = GetTickCount
For l = 0 To 10000000
loWord k
Next
Debug.Print "без апи"; GetTickCount - tc
tc = GetTickCount
For l = 0 To 10000000
loWord_ k
Next
Debug.Print "copyMem"; GetTickCount - tc
End Sub
Public Function loWord(ByVal DblWord As Long) As Integer
loWord = DblWord And &HFFFF&
If DblWord And &H8000& Then loWord = loWord Or &H8000
End Function
Public Function loWord_(ByVal DblWord As Long) As Integer
CopyMemory loWord_, DblWord, 2
End Function
Public Sub HLWord(dw As Long, hW As Integer, lW As Integer)
CopyMemory lW, dw, 4
' Debug.Print Hex(dw)
' Debug.Print Hex(hW); " "; Hex(lW)
End Sub
Public Sub testLo()
Dim l As Long, tc As Long, k As Long
tc = GetTickCount
For l = 0 To 10000000
loWord k
Next
Debug.Print "без апи"; GetTickCount - tc
tc = GetTickCount
For l = 0 To 10000000
loWord_ k
Next
Debug.Print "copyMem"; GetTickCount - tc
End Sub
Public Function loWord(ByVal DblWord As Long) As Integer
loWord = DblWord And &HFFFF&
If DblWord And &H8000& Then loWord = loWord Or &H8000
End Function
Public Function loWord_(ByVal DblWord As Long) As Integer
CopyMemory loWord_, DblWord, 2
End Function
Появился ещё такой вопрос: параметры приходят в процедуру рядышком? можно ли вот так сделать:
Но если нужно будет заниматься поддержкой кода...
Это я не понял. В смысле, в деклорации апи? Если byval, то передавать надо не переменную, а указатель? или как? Или в смысле первого аргумента моей процедуры( byval dw As Long )? А почему? внутри же она всё равно не изменяется?Да. Но лучше для первого аргументы использовать ByVal
1. Способ - какой придумался. Обе функции из win32.tlb А как измерять лучше?
2. Это в том смысле, что лучше getmem2? я просто не очень с ней знаком
А вот разница с проектом, где функции из win32.tlb и где Declare почти не заметна
arthur2 писал(а):В том смысле, что потом не пойму, чё это такое? а какая реализация лучше?
А что это? Поиском не ищетсянужно использовать VB Watch2.
Спасибо, понял! А есть у .tlb подводные камни? Скажем, если на машине нет нужной библиотеки, то при Declare вызов такой функции легко ловится обработчиком ошибок. А с .tlb - будит ли так же?Но стоит тебе вынести вызов loWord k и вызов loWord_ k в отдельные функции Fun и Fun_, и вставить в циклы вызовы функций Fun и Fun_ -- как ты заметишь значительную разницу.
Ага! И, как выяснилось - ещё и быстрее! (Но сам способ интересный - может где в другом месте использую. Да и в чужом коде увижу - теперь соображу)Будет не так изящно, но зато ты (или кто другой) никогда не застрянут на этом месте, пытаясь понять, что делает код.
Спасибо, понял! А есть у .tlb подводные камни? Скажем, если на машине нет нужной библиотеки, то при Declare вызов такой функции легко ловится обработчиком ошибок. А с .tlb - будит ли так же?
Option Explicit
Private Declare Function lalala Lib "figlimigli.dll" () As Long
Private Declare Function trampampam Lib "kernel32" () As Long
Private Sub Form_Load()
On Error Resume Next
lalala
trampampam
End Sub
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23