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 Глава |
ODY>