Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

Защита от деления на 0

Only working scripts
Post Reply
Nearga
Novice
Novice
Posts: 58
Joined: 04.03.2012 22:03
Location: DRW
Contact:

Защита от деления на 0

Post by Nearga »

Периодически совершенно случайно крешит
divide by Zero at 0.1180
Script archery.sc stopped successfuly
Есть мнение, что из-за этой строки

Code: Select all

      if GetHP(enemy)*100/GetMaxHP(enemy) < 60  THEN
      Begin  
Пока заменил на if GetHP(enemy) < 15, ибо не хочется, чтоб где-то ночью вылетел.. вопрос в том, что можно с этим сделать? есть ли тут рабочие try/catch или assert?
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Защита от деления на 0

Post by Vizit0r »

неужели сложно поставить перед этой строкой
if GetMaxHP(enemy) > 0 then
есть ли тут рабочие try/catch или assert?
почитай про паскаль. никаких catch тут нет вообще.

Code: Select all

 try
 finally
 end;
и

Code: Select all

 try
 except
 end;
вполне себе работает.

В программировании обычно ставят такие конструкции, где может возникнуть неожиданное исключение. В твоем случае оно вполне себе ожидаемое, и надо не перекрывать его, а поставить проверку.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Nearga
Novice
Novice
Posts: 58
Joined: 04.03.2012 22:03
Location: DRW
Contact:

Re: Защита от деления на 0

Post by Nearga »

Ну, я хз на сколько оно ожидаемое, если скрипт часа 3 работает нормально, а потом выдает деление на ноль :)

Вопрос был больше не о той проверке, а о работе GetMaxHP() в целом. Проверка - это костыль.. имхо, нужно искать и решать реальную проблему.
Может, он не успевает раз в пятилетку принять значение с сервера - тогда должно хватить что-то типа

Code: Select all

enemysHp := GetHP(enemy);
wait(100);
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Защита от деления на 0

Post by Vizit0r »

(N)PC пришел в стелс. у него среди прочего уже есть хп\максхп. В процессе игры могут приходить новые хп\максхп. Умер, реснулся, еще что-то.
Просто в какой-то момент максхп = 0, например у трупа, вот и все.
Самый вообще простой способ, если максхп=стр - это делить на стр (n)pc, тот никогда нулем не будет. при нормальной, неглючной работе сервера.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Nearga
Novice
Novice
Posts: 58
Joined: 04.03.2012 22:03
Location: DRW
Contact:

Re: Защита от деления на 0

Post by Nearga »

Штука в том, что в момент получения divide by Zero at 0.1180, враг еще определенно живой.
лог выдает что-то типа:
хиты куклы: 15
хиты куклы: 14
хиты куклы: 13
divide by Zero at ххх
Это в процентном отношении, 13 - это чуть меньше половины. Так вот, во время divide by Zero скрипт крешит и вылетает, хотя должно начаться лечение цели. Получается, клиент остается в онлайне, продолжает атаковать, а скрипт выключился. И через пару минут мы таки имеем куклу-госта :)

Потому я try и спросил, дабы скрипт не вылетал, а пробовал снова... возможно, if GetMaxHP(enemy) > 0 then и хватит, но хотелось бы знать причину. Если это таки трабл с задержкой передачи пакета - тогда логично будет сделать присваивание GetMaxHP(enemy) в переменную + ожидание. Но наверняка я не знаю, это только предположение :)
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Защита от деления на 0

Post by Vizit0r »

тогда в безопасный блок, и проверку тоже.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Post Reply