| Rapid-Q Documentation by William Yu (c)1999 | Глава 11 |
DECLARE SUB Test (I AS INTEGER)
DIM FPtr AS INTEGER
BIND FPtr TO Test
CALLFUNC(FPtr, 120)Это вызовет подпрограмму TEST с одним параметром. Очевидно, это не очень полезный пример, рассмотрим, где это может быть полезным.
DECLARE SUB Test1 (I AS INTEGER)
DECLARE SUB Test2 (I AS INTEGER)
DIM FPtr(1 TO 2) AS INTEGER
BIND FPtr(1) TO Test1
BIND FPtr(2) TO Test2
Когда вы связываете массивы, отметьте, что первая функция котрая связана будет являться шаблоном для всех
последующих элементов. Например, имеем массив FPtr, и через Bind привязываем FPtr(1)к SUB Test1. FPtr теперь привязан.
Это значит, что если вы привязываете любой другой FPtr(i), функция должна иметь соответствующее число параметров.
Может быть пример поможет лучше понять это.
DECLARE SUB Test1 (I AS INTEGER)
DECLARE SUB Test2 (I AS INTEGER, J AS STRING)
DIM FPtr(1 TO 2) AS INTEGER
BIND FPtr(1) TO Test1
BIND FPtr(2) TO Test2
Второй BIND неверен, так как число
параметров Test2 не соответствует с Test1.
Вы получите сообщение об ошибке, когда попытаетесь так сделать. Отметьте, что
речь идет о несоответствии числа параметров, а не типа параметров. Соответствие
типов необязательно, но результат может быть неопределенный.
Это может
быть например, меню с несколькими опциями, или возможно
синтаксический анализатор (да Rapid-Q использует указатели функции, чтобы
анализировать ваш код). Как Вы можете
видеть, имеется здесь требуется
произвести много операций сравнения, особенно,
если вы пишете синтаксический анализатор, где имеются много ключевых слов
(более 50). Эти операции мы можем легко
выполнить, используя указатели на функции,
что ускорит нашу
программу.
(См.
FUNCPTR.BAS с примером.)
BIND FPtr(1) AS Process1
BIND FPtr(2) AS Process2
BIND FPtr(3) AS Process3
BIND FPtr(4) AS Process4
BIND FPtr(5) AS Process5
BIND FPtr(6) AS Process6
BIND FPtr(7) AS Process7
x = VAL(INPUT$(1))
CALLFUNC(FPtr(x), 33)
None of the code you see above is executable as is, but I think you get the
general idea. We don't need any case statements as you can see (this is assuming
you've partitioned your function pointers properly).
11.4 Что не поддерживается в Rapid-Q
. (What is not supported in Rapid-Q
)
DECLARE FUNCTION MyFuncTemp (X AS LONG) AS LONG
DECLARE FUNCTION Func1 (X AS LONG) AS LONG
DECLARE FUNCTION Func2 (X AS LONG) AS LONG
DIM Template AS INTEGER
DIM I(100) AS INTEGER
BIND Template TO MyFuncTemp
BIND I(1) TO Func1
BIND I(2) TO Func2
SUB Test (FPtr AS INTEGER)
Template = FPtr
PRINT CALLFUNC(Template, 10)
END SUB
Test I(1)
Это пожалуй единственный спрособпреодолеть это ограничение.| Prev Глава | Up | Содержание | Next Глава |