RU

Интересное поведение RESULT

Aleks Versus Moderator 11.07.2013 08:06 3 comments 6874 views

Не нашёл, поднимался ли такой момент, и так и не прояснил для себя, глюк это, или задумано так изначально.
Условная игра:

# START
*pl $func('f1')
--- START ---------------------------------

# f1
$result='результат первой функции'
gs 'f2'
--- f1 ---------------------------------

# f2
$result='результат второй функции'
--- f2 ---------------------------------

По-идее, если принять во внимание, что значения $args[] и $result используются только на одной локации (в ограниченной области кода), результат должен был быть таким: ‘результат первой функции’, однако $result из локации ‘f2’ перебил $result из локации ‘f1’, и результат получился таким ‘результат второй функции’. В принципе решается довольно просто:

# START
*pl $func('f1')
--- START ---------------------------------

# f1
$result['f1']='результат первой функции'
gs 'f2'
--- f1 ---------------------------------

# f2
$result['f2']='результат второй функции'
--- f2 ---------------------------------

И вот всё-таки интересно, такое поведение $result - ошибка плеера, или так задумано?

P.S.: Чтобы избежать рассуждений о том, зачем обращаться к функции через GOSUB, сразу поясню: некоторые локации у меня выполняют роль функций и роль подпрограмм по необходимости.

Насколько я понимаю RESULT это обычная переменная которую вы же и задаете. Ваша первая подпрограмма задала ей значение ‘результат первой функции’ а потом вы эту переменную сами же переопределили во второй подпрограмме. Т.к. вторая подпрограмма вызывается после присваивания RESULTу первого значения, то и переменная перезаписывается. Это не баг плеера, это просто организация вашего кодаи по логике он как раз должен был работать так как он работает. Хотя я и не знаток устройства QSP и возможно неправильно понял суть вопроса. В таком случае - прошу прощения.

Да, это старый известный баг. Срабатывает вроде только при GOSUB. У себя я выхожу из положения следующим образом: в теле процедур/функций присваиваю результат промежуточной переменной, например $ARGS[’Результат’]. А в конце, если результат должен возвращаться, пишу следующее:

killvar 'Result'
$Result=$ARGS['Результат']

Необходимость удаления Result обусловлена тем, что числовой результат Result, может быть “перебит” присвоением где-нибудь выше по коду (в какой-нибудь процедуре) строкового значения $Result. А так всё срабатывает так, как мне нужно.

Bumbr:

Насколько я понимаю RESULT это обычная переменная которую вы же и задаете. Ваша первая подпрограмма задала ей значение ‘результат первой функции’ а потом вы эту переменную сами же переопределили во второй подпрограмме. Т.к. вторая подпрограмма вызывается после присваивания RESULTу первого значения, то и переменная перезаписывается. Это не баг плеера, это просто организация вашего кодаи по логике он как раз должен был работать так как он работает. Хотя я и не знаток устройства QSP и возможно неправильно понял суть вопроса. В таком случае - прошу прощения.

Result позиционируется как локальная переменная, так же как и массив ARGS. Описанному поведению вызова GOSUB есть объяснение от Байта (что GOSUB вызывается не как подпрограмма, а как часть общего кода), но это не вполне корректно и в следующих версиях QSP будет исправлено. Так что есть все причины считать это настолько неудачной фичей, что она тянет на полноценный баг.

Log in or Register to post comments.