You are not logged in.
Pages: 1
Всем ещё раз привет. Сразу к делу.
Скрипт: бонус (см. р. "модификации"), последняя версия. 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
Не проверял, но если это не gosub, т.е. просто использовать голый return вне процедуры, должен быть вылет...
Offline
Offline
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
но там максимальная вложенность всего лишь 2. Вызывается gosub, из него ещё раз gosub. Может вызваться третий или даже пятый уровень вложенности. Чёрт. Максимум 8 уровней. Наверное, действительно вложенность. Хотя ещё не факт.
Offline
но там максимальная вложенность всего лишь 2
Верно, из-за двух уровней ошибки не возникнет. Но код, который я привёл выше, может повторяться большое число раз - до превышения лимита и возникновения ошибки.
Вылетает из-за превышения лимита вложенности - иных причин тут нет.
Last edited by Den_spb (12-06-2010 21:40)
Offline
Переделал так, чтобы gosub не вызывал gosub, содержащий gosub, который может вызвать этот же gosub. Утром буду тестировать. Сделал так: задаём переменную равной нулю. Затем переходим к бонусам. Если один из них выполнился, то переменная становится равной единице и затем бонус снова перемещается. Если не выполнилось, значит переходим до того момента, пока что-нибудь да не выполнится.
Offline
С gosub там явный перебор. Зачем вообще выбирать сначала тип бонуса (хороший, нейтральный, плохой), а потом вид бонуса, если можно сразу выбрать конкретный бонус (random(0,15))? После выбора одного из бонусов, лучше делать переход, используя jump_table. Скрипт станет явно проще, а там, глядишь, и глюки пропадут.
Offline
Зачем вообще выбирать сначала тип бонуса (хороший, нейтральный, плохой), а потом вид бонуса, если можно сразу выбрать конкретный бонус (random(0,15))
Бонусов-то разное количество, а это сделано, чтобы шанс выпадения каждой категории был равнозначным. От глюков вроде избавился, 5 часов не выявили ни одного
Offline
Pages: 1