You are not logged in.
Pages: 1
Всем ещё раз привет. Сразу к делу.
Скрипт: бонус (см. р. "модификации"), последняя версия. http://upanel.biz/r/bonus.cs
Исходник: http://upanel.biz/r/bonus.txt
И запись из SCMLOG после вылета:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | ******************************************** 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: 00D 6 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: 00D 6 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: 00A 1 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: 00D 6 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: 00D 6 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: 00D 6 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 v 1.05 ********************************* |
Бонус может быть любым. Глючит почему-то 0051: return, причём не сразу, а лишь после того, как подберёшь несколько бонусов. Я, конечно, понимаю, что такой здоровый код разбирать мало кто будет (хотя он написан с использованием высокоуровневых конструкций и большую часть кода там составляют метки :name ... return), но отчего вообще на return-е может быть вылет?
Last edited by WinuX (12-06-2010 19:35)
Offline
Не проверял, но если это не gosub, т.е. просто использовать голый return вне процедуры, должен быть вылет...
Offline
Offline
Gosub в скрипте применён неправильно. Посмотрел исходник, первым бросился в глаза этот участок:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | :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