XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
Anufis

offline
Опыт: 6,290
Активность:
Функция прерывает свое выполнение из-за циклов
Данная функция обрывает свое выполнение в середине(из-за вложенного цикла, т.к. много действий внутри цикла). Как этого избежать?

Код:
function Coding takes string s,string name returns string
    local integer a=0
    local integer LoopA = 1
    local string pass=s
    local integer lens=StringLength(pass)
    local string char
    local integer LoopB
    loop
        exitwhen LoopA>StringLength(name)
        set a=a+NameCharToInt(SubStringBJ(name,LoopA,LoopA))
        set LoopA=LoopA+1
    endloop
    set a=a-(1225*(a/1225))
    set pass=pass+IntToCode(a,2)
    set a=StringLength(name)
    set pass=pass+IntToCode(a,1)
    set a=0
    set LoopA = 1
    loop
        exitwhen LoopA>StringLength(pass)
        set a=a+CharToInt(SubStringBJ(pass,LoopA,LoopA))
        set LoopA=LoopA+1
    endloop
    set a=a-(1225*(a/1225))
    set pass=pass+IntToCode(a,2)
    //Вторая часть
    set LoopA=1
    loop
        exitwhen LoopA>StringLength(pass)
        set a=LoopA+CharToInt(SubStringBJ(pass,LoopA,LoopA))
        set a=a-(35*(a/35))
        set char=IntToChar(a)
        set pass=SubStringBJ(pass,1,LoopA-1)+char+SubStringBJ(pass,LoopA+1,StringLength(pass))
        set LoopA=LoopA+1
    endloop
    //Третья часть
    set LoopA = 1
    loop
        exitwhen LoopA>StringLength(pass)-1
        set LoopB=LoopA+1
        loop
            exitwhen LoopB>StringLength(pass)
            set a=CharToInt(SubStringBJ(pass,LoopA,LoopA))+CharToInt(SubStringBJ(pass,LoopB,Loop  B))
            set a=a-(35*(a/35))
            set char=IntToChar(a)
            set pass=SubStringBJ(pass,1,LoopB-1)+char+SubStringBJ(pass,LoopB+1,StringLength(pass))
            set LoopB=LoopB+1
        endloop
        set LoopA=LoopA+1
    endloop
    //Четвертая часть
    set LoopA=1
    loop
        exitwhen LoopA>StringLength(pass)
        set a=LoopA+CharToInt(SubStringBJ(pass,LoopA,LoopA))
        set a=a-(35*(a/35))
        set char=IntToChar(a)
        set pass=SubStringBJ(pass,1,LoopA-1)+char+SubStringBJ(pass,LoopA+1,StringLength(pass))
        set LoopA=LoopA+1
    endloop
    //Пятая часть
    set a=0
    set LoopA=1
    loop
        exitwhen LoopA>StringLength(pass)
        set a=a+CharToInt(SubStringBJ(pass,LoopA,LoopA))
        set LoopA =LoopA+1
    endloop
    set a=a-(1225*(a/1225))
    set pass=IntToCode(a,2)+pass
    //Шестая часть
    set LoopA=1
    loop
        exitwhen LoopA>2
        set LoopB=udg_LoopA+1
        loop
            exitwhen LoopB>StringLength(pass)
            set a=CharToInt(SubStringBJ(pass,LoopA,LoopA))+CharToInt(SubStringBJ(pass,LoopB,Loop  B))
            set a =a-(35*(a/35))
            set char=IntToChar(a)
            set pass=SubStringBJ(pass,1,LoopB-1)+char+SubStringBJ(pass,LoopB+1,StringLength(pass))
            set LoopB=LoopB+1
        endloop
        set LoopA=LoopA+1
    endloop
    //Седьмая часть
    set pass=SubStringBJ(pass,20,StringLength(pass))+SubStringBJ(pass,1,19)
    set LoopA=1
    loop
        exitwhen LoopA>2
        set LoopB=LoopA+1
        loop
            exitwhen LoopB>StringLength(pass)
            set a=CharToInt(SubStringBJ(pass,LoopA,LoopA))+CharToInt(SubStringBJ(pass,LoopB,Loop  B))
            set a=a-(35*(a/35))
            set char=IntToChar(a)
            set pass=SubStringBJ(pass,1,LoopB-1)+char+SubStringBJ(pass,LoopB+1,StringLength(pass))
            set LoopB=LoopB+1
        endloop
        set LoopA=LoopA+1
    endloop
    set LoopA=1
    set a=1
    set LoopB=StringLength(pass)/6
    loop
       exitwhen a>LoopB
       set pass=SubStringBJ(pass,1,7*a-1)+"-"+SubStringBJ(pass,7*a,StringLength(pass))
       set a=a+1
    endloop
    set char = ""
return pass
endfunction
Старый 10.06.2009, 00:48
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
Цитата:
set char = ""
обнулять не нужно помойму.
Старый 10.06.2009, 05:06
kildren
квантор ∀
offline
Опыт: 1,583
Активность:
Цитата:
Данная функция обрывает свое выполнение в середине

конкретно кусок кода (не понял, где середина)
Старый 10.06.2009, 07:50
Anufis

offline
Опыт: 6,290
Активность:
В третьей частм
Старый 10.06.2009, 08:46
Артте
Open up your eyes
offline
Опыт: 23,423
Активность:
Конкретно искать причину не буду, но, если скорость не важна-можно вейт ставить, мне _иногда_ помогало

Артте добавил:
И вообще это все можно в 1-3 цикла сделать
Старый 10.06.2009, 11:04
SRes
1110101000
offline
Опыт: 9,997
Активность:
Попробуй это разбить на несколько действий, т.е. мне кажется что вар 7 циклов подряд просто "глушит", врядли это можно обойти, кроме как несколькими действиями в разных функциях.
Это сэйв-лоад ? Не верю что человек написавший сэйв лоад не разберется тут сам
Старый 10.06.2009, 12:38
kildren
квантор ∀
offline
Опыт: 1,583
Активность:
set a=CharToInt(SubStringBJ(pass,LoopA,LoopA))+CharToInt(SubStringBJ(pass,LoopB,Loop B))
так и должно быть?) причем и в 6ой 7ой
Старый 10.06.2009, 12:59
Anufis

offline
Опыт: 6,290
Активность:
То скопировалось как-то криво. В оригинале такого нет. А по сути, в третьей части поставил внутри внешнего цикла wait и теперь пашет, правда результат функция выдает с задержкой 8 секунд.
Старый 11.06.2009, 01:46
Артте
Open up your eyes
offline
Опыт: 23,423
Активность:
0.1 пробуй
Старый 11.06.2009, 11:51
Anufis

offline
Опыт: 6,290
Активность:
У меня стоит wait 0.00
Старый 11.06.2009, 17:46
PlayerDark
Coraline
offline
Опыт: 10,569
Активность:
Если не менять код, то можно разбить функцию на несколько потоков. Например функцией ExecuteFunc(<имя функции>). Заносишь все пар-ры в глобалки и вызываешь. Это медленнее, зато не вылетает.
Старый 11.06.2009, 18:26
DKbru

offline
Опыт: 1,407
Активность:
глюк 100% в построении циклов. Приведи все зацикленные действия к виду
loop (Начало цикла)
set x=x+1(Счётчик цикла)
exitwhen x>10 (условие выхода из цикла)
ТВОИ ДЕЙСТВИЯ
endloop (конец цикла)
Старый 11.06.2009, 19:10
Anufis

offline
Опыт: 6,290
Активность:
Та уже нету глюка. Уже все работает. Поставил один вэйт внутрь лупа, и все пашет.
Старый 11.06.2009, 20:52
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 19:01.