#1 12-06-2010 19:35

WinuX
Registered: 06-03-2009
Posts: 138

0051: return глючит? WTF?

Всем ещё раз привет. Сразу к делу.
Скрипт: бонус (см. р. "модификации"), последняя версия. http://upanel.biz/r/bonus.cs
Исходник: http://upanel.biz/r/bonus.txt
И запись из SCMLOG после вылета:

********************************************
 thread rbonus
 Local variables dump:
 1156936683 -994583857 1096167062 17826353 1103035424 1115773914 39977088 0 0 0 0 1157381014 1156939719 -994585265 1097215733 0
 17891889 6881864 7602762 0 0 -998637568 1095118486 0 1157385397 -994926855 1098425869 0 0 0 1 1
********************************************

00003037: 00D6
  get numeric params: 1
    param 1 = 0

00003041: 056E
  get numeric params: 1
    param 1 = 0

00003046: 004D (&IFresult = False)
  get numeric params: 1
    param 1 = -3118 (&label: 0860)

00003118: 0860
  get numeric params: 2
    param 1 = 1
    param 2 = 0

00003126: 00D6
  get numeric params: 1
    param 1 = 0

00003130: 00DF
  get numeric params: 1
    param 1 = 1

00003135: 004D (&IFresult = False)
  get numeric params: 1
    param 1 = -3158 (&label: 04BB)

00003158: 04BB
  get numeric params: 1
    param 1 = 0

00003163: 00A1
  get numeric params: 4
    param 1 = 1
    param 2 = 1963.99
    param 3 = -1470.67
    param 4 = 14.39

00003177: 057E
  get numeric params: 1
    param 1 = 0

00003181: 0581
  get numeric params: 1
    param 1 = 1

00003185: 00D6
  get numeric params: 1
    param 1 = 0

00003189: 8214
  get numeric params: 1
    param 1 = 17891889

00003194: 004D (&IFresult = True)
  get numeric params: 1
    param 1 = -3206 (&label: 00D6)

00003201: 0215
  get numeric params: 1
    param 1 = 17891889

00003206: 00D6
  get numeric params: 1
    param 1 = 0

00003210: 8214
  get numeric params: 1
    param 1 = 17891889

00003215: 004D (&IFresult = True)
  get numeric params: 1
    param 1 = -3227 (&label: 00D6)

00003222: 0215
  get numeric params: 1
    param 1 = 6881864

00003227: 00D6
  get numeric params: 1
    param 1 = 0

00003231: 8214
  get numeric params: 1
    param 1 = 17891889

00003236: 004D (&IFresult = True)
  get numeric params: 1
    param 1 = -3248 (&label: 016A)

00003243: 0215
  get numeric params: 1
    param 1 = 7602762

00003248: 016A
  get numeric params: 2
    param 1 = 500
    param 2 = 1

00003255: 0051

*********************************
> Total opcodes: 51604255
> Logging finished: 22:28:14
  Powered by SCMLog v1.05
*********************************

Бонус может быть любым. Глючит почему-то 0051: return, причём не сразу, а лишь после того, как подберёшь несколько бонусов. Я, конечно, понимаю, что такой здоровый код разбирать мало кто будет (хотя он написан с использованием высокоуровневых конструкций и большую часть кода там составляют метки :name ... return), но отчего вообще на return-е может быть вылет?

Last edited by WinuX (12-06-2010 19:35)

Offline

#2 12-06-2010 19:53

~AquaZ~
Registered: 01-03-2010
Posts: 726

Re: 0051: return глючит? WTF?

Не проверял, но если это не gosub, т.е. просто использовать голый return вне процедуры, должен быть вылет...

Offline

#3 12-06-2010 20:29

WinuX
Registered: 06-03-2009
Posts: 138

Re: 0051: return глючит? WTF?

нет, скрипт у меня как-раз таки построен на gosub-ах

Offline

#4 12-06-2010 20:50

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: 0051: return глючит? WTF?

может дело во вложенности gosub


I know everything and nothing...

Offline

#5 12-06-2010 21:24

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: 0051: return глючит? WTF?

Gosub в скрипте применён неправильно. Посмотрел исходник, первым бросился в глаза этот участок:

:bad
    0209: 10@ = random_int_in_ranges 0 6
    //10@ = 5
    if or
        10@ == 0
        10@ == 3
    then
        gosub @bomb
    end
    if 10@ == 1
    then
        gosub @wanted
    end
    if 10@ == 2
    then
        gosub @loosemoney
    end
    if 10@ == 4
    then
        gosub @looseweapon
    end
    if 10@ == 5
    then
        gosub @withoutradar
    end
return
....
:withoutradar
    if
        $ONMISSION == 1
    then
        gosub @bad
    else
        0ACA: "Radar nedostupen 1 minutu"
        057E: set_radar_grey 1 
        wait 250
        057E: set_radar_grey 0 
        wait 250
        057E: set_radar_grey 1 
        wait 250
        057E: set_radar_grey 0 
        wait 250
        057E: set_radar_grey 1 
        33@ = 0
        while 33@ < 58000
            wait 1000
            057E: set_radar_grey 1  
        end
        057E: set_radar_grey 0 
        wait 250
        057E: set_radar_grey 1 
        wait 250
        057E: set_radar_grey 0 
        wait 250
        057E: set_radar_grey 1 
        wait 250
        057E: set_radar_grey 0
    end
return

Здесь цикл gosub @bad - gosub @withoutradar - gosub @bad может повториться большое число раз. При этом ни разу не будет выполнен return, что приведёт к превышению лимита вложенности и ошибке.

Last edited by Den_spb (12-06-2010 21:43)

Offline

#6 12-06-2010 21:31

WinuX
Registered: 06-03-2009
Posts: 138

Re: 0051: return глючит? WTF?

но там максимальная вложенность всего лишь 2. Вызывается gosub, из него ещё раз gosub. Может вызваться третий или даже пятый уровень вложенности. Чёрт. Максимум 8 уровней. Наверное, действительно вложенность. Хотя ещё не факт.

Offline

#7 12-06-2010 21:39

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: 0051: return глючит? WTF?

но там максимальная вложенность всего лишь 2

Верно, из-за двух уровней ошибки не возникнет. Но код, который я привёл выше, может повторяться большое число раз - до превышения лимита и возникновения ошибки.
Вылетает из-за превышения лимита вложенности - иных причин тут нет.

Last edited by Den_spb (12-06-2010 21:40)

Offline

#8 12-06-2010 21:54

WinuX
Registered: 06-03-2009
Posts: 138

Re: 0051: return глючит? WTF?

Переделал так, чтобы gosub не вызывал gosub, содержащий gosub, который может вызвать этот же gosub. Утром буду тестировать. Сделал так: задаём переменную равной нулю. Затем переходим к бонусам. Если один из них выполнился, то переменная становится равной единице и затем бонус снова перемещается. Если не выполнилось, значит переходим до того момента, пока что-нибудь да не выполнится.

Offline

#9 13-06-2010 03:05

Seemann
Registered: 07-08-2006
Posts: 2,156

Re: 0051: return глючит? WTF?

С gosub там явный перебор. Зачем вообще выбирать сначала тип бонуса (хороший, нейтральный, плохой), а потом вид бонуса, если можно сразу выбрать конкретный бонус (random(0,15))? После выбора одного из бонусов, лучше делать переход, используя jump_table. Скрипт станет явно проще, а там, глядишь, и глюки пропадут. wink

Offline

#10 13-06-2010 18:20

WinuX
Registered: 06-03-2009
Posts: 138

Re: 0051: return глючит? WTF?

Зачем вообще выбирать сначала тип бонуса (хороший, нейтральный, плохой), а потом вид бонуса, если можно сразу выбрать конкретный бонус (random(0,15))

Бонусов-то разное количество, а это сделано, чтобы шанс выпадения каждой категории был равнозначным. От глюков вроде избавился, 5 часов не выявили ни одного smile

Offline

Board footer

Powered by FluxBB