BRANCH |
Главная Предыдущая Следующая |
Команда предназначена для реализации условных переходов или ветвления. Данная команда может иметь переменное число параметров, но не менее одного. Эта команда последовательно читает значения четных параметров 2, 4, 6, 8 и т.д., сравнивает их со значением переменной, номер которой указан в качестве первого параметра, и если N-й (четный) параметр равен переменной, то выполняет переход на метку, которая указана в качестве N+1-го (следующего нечетного) параметра. Возможна ситуация, когда общее число параметров - четное. Тогда последний параметр считается адресом, по которому нужно выполнить переход, если значение переменной не было найдено среди предыдущих четных параметров. Переменная, в которой находится сравниваемое значение, должна иметь целочисленный тип.
На практике команда может использоваться для быстрой проверки совпадения значения переменной со значением другой переменной, если обе переменные содержат значения типа DWORD.
Внимание! Последним параметром данной команды всегда должен быть признак завершения списка параметров команды. Этот параметр никак не интерпретируется и необходим лишь для того, чтобы ядро могло обнаружить, где кончаются параметры команды.
Внимание! Значение по умолчанию у первого четного параметра - ноль, и у каждого последующего четного параметра значение по умолчанию увеличивается на единицу. Если какое-либо из четных значений явно определено, следующее значение по умолчанию будет на единицу больше этого явно определенного значения (см. примеры). Это сделано прежде всего для повышения удобства и эффективности записи типовых конструкций "если переменная=0, то переход к ...; если переменная=1, то переход к ...", а также уменьшения размеров скриптов.
Внимание! Поскольку контроль типов в командах с переменным числом параметров невозможен, необходимо контролировать типы параметров вручную, в противном случае возможно возникновение ошибки при исполнении команды. Переменная, индекс которой указан в качестве первого параметра, должна содержать целочисленное значение, иначе возникнет ошибка CMD_PARAM_TYPE_MISMATCH.
Особые случаи:
Параметры считываются по мере необходимости, и при нахождении параметра, равного значению, хранящемуся в первой переменной, исполнение команды прекращается и выполняется переход. Таким образом, если команда содержит параметры неподходящего типа, но переход выполнится раньше, ошибка не будет обнаружена. Аналогичным образом если будет задано два одинаковых значения, определяющих разные точки перехода, выполнится только первый из них.
Примеры:
BRANCH 1 0 ^Zero ^NotZero . ; Если содержимое глобальной переменной с индексом 1 равно 0, перейти к метке ^Zero, иначе - перейти к метке ^NotZero BRANCH 1 0 $ ^NotZero . ; Если содержимое глобальной переменной с индексом 1 равно 0, выполняется следующая команда, во всех остальных случаях происходит переход к метке ^NotZero BRANCH _0 10 ^is10 100 ^is100 ; Если содержимое локальной переменной с индексом 0 текущего фрейма равно 10 - перейти к метке ^is10, если 100 - к метке ^is100, во всех остальных случаях - продолжить исполнение со следующей команды BRANCH 1 -1 ^LT $ ^Eq $ ^GT ; Если содержимое глобальной переменной с индексом 1 равно -1 - перейти к метке ^LT, если равно 0 - к метке ^Eq, если равно 1 - к метке ^GT, во всех остальных случаях - продолжить исполнение со следующей команды (конструкция может применяться при сравнении строк) BRANCH 1 3 ^Abort $ ^Retry $ ^Ignore 1 ^Ok $ ^Cancel ^unknown . ; Ветвление по значению глобальной переменной с индексом 1: если значение равно 3, то переход осуществляется к метке ^Abort, если 4 - ^Retry, если 5 - ^Ignore, если 1 - ^Ok, если 2 - ^Cancel, во всех остальных случаях - ^unknown (конструкция взята из скрипта, определяющего, какую кнопку нажал пользователь в MessageBox'е)
|