Difference between revisions of "Jump/ru"
(Первопроходец) |
m (некоторые слова "ошибка" (word "bug") изменим на "косяк" и"глюк") |
||
(2 intermediate revisions by the same user not shown) | |||
Line 64: | Line 64: | ||
}} | }} | ||
{{#vardefine:notes| | {{#vardefine:notes|'''Заметки''' | ||
}}{{#vardefine:caveats|'''Предостережения''' | |||
Как правило, считается нецелесообразным использовать скачки (часто называемая '''GOTO''') там, где могут быть использованы другие управляющие структуры. | |||
* {{Wikipedia|Goto}} | |||
* [http://xkcd.com/292/ XKCD:Goto] | |||
}} | |||
{{#vardefine:lso|'''Детальные заметки''' | |||
<h5>Глюк многократного скачка</h5> | |||
Следующая функция <code>jumpy</code> демонстрирует косяк "несколько прыжков-источников к одной цели". Похоже, здесь функция должна привести к бесконечному циклу, что происходит при компиляции сценария для Mono VM. Однако при компиляции для LSO VM из-за даного глюка второй прыжок никогда не происходит и функция возвращается. LL сообщили, что не желают исправить косяк, чтобы сделать его критическим изменением. Косяк был исправлен в более новой Mono VM. | |||
<lsl>jumpy(){ | |||
jump next;//first jump | |||
@next; | |||
jump next;//второй прыжок - глюк (косяк), оператор никогда не запускается на выполнение | |||
return; | |||
}</lsl> | |||
}} | |||
{{#vardefine:caveats|'''Предостережения''' | |||
*'''Только в [[LSO]]-режиме скрипта:''' Если несколько источников скачка высказались за ту же метку цели в пределах видимости, то только первая (сверху вниз, слева направо) будет функционировать как и ожидалось, все остальные по-умолчанию откажут. | *'''Только в [[LSO]]-режиме скрипта:''' Если несколько источников скачка высказались за ту же метку цели в пределах видимости, то только первая (сверху вниз, слева направо) будет функционировать как и ожидалось, все остальные по-умолчанию откажут. | ||
*Метки находятся в области видимости при событийном и функциональном уровне, что значит невозможность объявить одинаковые метки в том же событии или функции, даже если метки заключены в другие условные-операторы, циклы и подобное. -- {{JIRA|SVC-6712}} | *Метки находятся в области видимости при событийном и функциональном уровне, что значит невозможность объявить одинаковые метки в том же событии или функции, даже если метки заключены в другие условные-операторы, циклы и подобное. -- {{JIRA|SVC-6712}} | ||
**Попытка такого использования приведет к бесполезной CIL-сигнла_сборки (assembly) об | **Попытка такого использования приведет к бесполезной CIL-сигнла_сборки (assembly) об косяке подключения. -- {{Jira|SCR-256}} | ||
*Если код существует после возвращения, не | *Если код существует после возвращения, не инкапсулированного в структуру управления потоком, компилятор выдаст сообщение ошибки о падении кода, даже если код доступен с прыжка. -- {{Jira|SVC-1929}} | ||
}}{{Issues/SVC-6712}}{{Issues/SCR-256}}{{Issues/SVC-1929}} | |||
}} | {{#vardefine:helpers| | ||
{{Issues/SVC-6712}} | }}{{#vardefine:also_header|''См.также'' | ||
{{Issues/SCR-256}} | |||
{{Issues/SVC-1929}} | |||
{{#vardefine:helpers|}} | |||
{{#vardefine:also_header|''См.также'' | |||
<h3>Ключевые слова</h3> | <h3>Ключевые слова</h3> | ||
{{{!}}{{LSL DefineRow||[[return/ru|return]]|}} | {{{!}}{{LSL DefineRow||[[return/ru|return]]|}} |
Latest revision as of 02:34, 10 November 2013
LSL Портал | | | Функции | | | События | | | Типы | | | Константы | | | Потоки | | | Библиотека Скриптов | | | Учебники |
Template:Issues/SVC-6712Template:Issues/SCR-256Template:Issues/SVC-1929
Template:Label target;
Template:Label target;• label | Template:Target | – | Название метки внутри функции или события области видимости. |
@target;
Метка, в которую можно прыгнуть, если скачок в той же области видимости или в младшей (производной) области видимости. Это не возможно для перехода между областями видимости (например, между функциями, событиями или состояниями).
• label | target |
Caveats
Предостережения
- Только в LSO-режиме скрипта: Если несколько источников скачка высказались за ту же метку цели в пределах видимости, то только первая (сверху вниз, слева направо) будет функционировать как и ожидалось, все остальные по-умолчанию откажут.
- Метки находятся в области видимости при событийном и функциональном уровне, что значит невозможность объявить одинаковые метки в том же событии или функции, даже если метки заключены в другие условные-операторы, циклы и подобное. -- SVC-6712
- Попытка такого использования приведет к бесполезной CIL-сигнла_сборки (assembly) об косяке подключения. -- SCR-256
- Если код существует после возвращения, не инкапсулированного в структуру управления потоком, компилятор выдаст сообщение ошибки о падении кода, даже если код доступен с прыжка. -- SVC-1929
Examples
Примеры <lsl>integer a = 5; jump over; @in; a = 6; @over; llOwnerSay((string)a); if(a < 6)
jump in;
//скрипт будет, скажем, 5, а затем 6</lsl> <lsl> integer getLinkWithName(string name) {
integer i = llGetLinkNumber() != 0; // Начинается с нуля (единственный прим) или 1 (два или более примов) integer x = llGetNumberOfPrims() + i; // [0, 1) or [1, llGetNumberOfPrims()] for (; i < x; ++i) { if (llGetLinkName(i) == name) jump break; // Нашел! Ранний выход из цикла с результатом } i = -1; // Нет примитива (prim) с таким именем, возврат return -1. @break; return i;
} </lsl> Чаще всего довольно уродливый "прыжок" можно избежать, особенно в пользовательские функции, как это демонстрирует версия вышеприведенного скрипта <lsl> integer getLinkWithName(string name) {
integer i = llGetLinkNumber() != 0; // Начинается с нуля (единственный прим) или 1 (два или более примов) integer x = llGetNumberOfPrims() + i; // [0, 1) or [1, llGetNumberOfPrims()] for (; i < x; ++i) { if (llGetLinkName(i) == name) return i; // Нашел его, вернуть его индекс } return -1; // Нет примитива (prim) с таким именем, возврат return -1.
} </lsl>
Notes
Deep Notes
LSO VM Notes
Детальные заметки
Глюк многократного скачка
Следующая функция jumpy
демонстрирует косяк "несколько прыжков-источников к одной цели". Похоже, здесь функция должна привести к бесконечному циклу, что происходит при компиляции сценария для Mono VM. Однако при компиляции для LSO VM из-за даного глюка второй прыжок никогда не происходит и функция возвращается. LL сообщили, что не желают исправить косяк, чтобы сделать его критическим изменением. Косяк был исправлен в более новой Mono VM.
<lsl>jumpy(){
jump next;//first jump @next; jump next;//второй прыжок - глюк (косяк), оператор никогда не запускается на выполнение return;
}</lsl>