Но такой вот интересный момент.
Допустим, мы передаём в функцию некий параметр ByRef:
- Код: Выделить всё
function func(a as long) as long
debug.print varptr(a)
end function
sub CallFunction()
dim v as long
debug.print varptr(v)
func v
end sub
Запустив CallFunction, мы увидим, что в дебаге появятся два одинаковых числа. Так и должно быть.
Теперь немного изменим функцию:
- Код: Выделить всё
function func(byval a as long) as long
debug.print varptr(a)
end function
Теперь при запуске CallFunction в дебаге появятся два разных числа - и снова ничего удивительного.
Ещё раз изменим функцию:
- Код: Выделить всё
function func(byval p1 as long, byval p2 as long, byval p3 as long, byval p4 as long) as long
debug.print varptr(p1)
debug.print varptr(p2)
debug.print varptr(p3)
debug.print varptr(p4)
end function
sub CallFunction()
dim a as long, b as long, c as long, d as long
func a,b,c,d
end sub
В дебаге появились четыре разных числа. Обращаем внимание: они идут в возрастающем порядке с интервалом 4.
Если мы теперь заменим параметры, к примеру, с Long на Integer или на Byte (все или часть - неважно) - то ничего не изменится, в дебаге будут числа, последовательно отстоящие на 4 байта. Single? То же самое. А Double? И Double подчиняется этому правилу, только следующий за Double параметр отстоит от неё не на 4, а на 8 байт.
Исключением здесь являются String. Мне не удалось установить правило образования их VarPtr, не исключено, что его нет Однако если за параметром String следует, к примеру, Long, то этот самый Long будет иметь VarPtr, на 8 байт отстоящий от параметра, который идёт непосредственно перед стринговым.
Variant не тестировал, ну его
Какой же вывод мы можем из этого почерпнуть?
Если у нас есть byval-параметры, среди которых нет string, то можно определить varptr первого параметра, а все остальные получать через
- Код: Выделить всё
GetMem4 VarPtr([первый параметр]) + 4 * [желаемый номер параметра - 1], [куда копировать]
И таким вот незамысловатым образом можно обращаться к параметрам функции из цикла, не задумываясь о том, как эти параметры зовут! Именно эта cutting edge technology и была использована мною, чтобы отказаться от Variant ParamArray() при вызове asm-функций
ЗЫ: Всё это только для ByVal, ещё раз напомню! Ну и Double на 8 байт, тоже не забываем