Форум работает в тестовом режиме. Все данные были перенесены со старого сайта 2018 года. Некоторая информация может быть недоступна, например вложения или хайды. Просьба сообщать о данных случаях через функционал "Жалоба", прямо под постом, где отсуствуют данные из хайда или проблемы с вложением.
Могут быть проблемы в "выкидыванием" с форума (слетевшей авторизацией). Нужно собрать статистику таких случаев.
Есть Тема, куда можете сообщить о проблемах с сайтом либо просто передать привет.

item.count внутри цикла

Рег
19 Апр 2016
Сообщения
25
Реакции
0
Пишу простенький скрипт на использование одного айтема из инвентаря до тех пор, пока его не останется 1 штучка.
Возникла проблема, почему то в цикле каунт этого айтема корректно отображается только через 1.

Пример систем лога бота:

Script: Start: 87
Script: Каунт в цикле: 3145776
Script: Каунт в цикле: 85
Script: Каунт в цикле: 3145776
Script: Каунт в цикле: 83
Script: Каунт в цикле: 3145776

И так далее. Цикл останавливается только если стартовое число было нечетным.

Сам код:

uses
SysUtils;

var item: tl2item;

begin

inventory.user.byid(5592, item) ;

print('Start: '+IntToStr(item.count));

while (item.count > 1) do
begin
Engine.Useitem(5592);
delay(1000);
print('Каунт в цикле: '+IntToStr(item.count));
end;

print ('Finished');
print('Item count: '+IntToStr(item.count));

end.

Понимаю, что можно обойти путем i:= item.count и в цикле убавлять i, или вообще пустить через for i, но хочется разобраться в этом
 
@SARCAZM, только что попробовал, с ним все корректно, как и с вариантами под спойлером в первом сообщении
Сейчас мне просто интересна сама мат часть, почему он себя так ведет в первом варианте :hz:

И еще, чтобы темы не плодить, помню в школе у нас паскаль преподавали и там была возможность отследить программу по строкам. Тыкали что-то в районе F7-F8 для пошагового отображения хода программы. Какую то фигню написал, надеюсь хоть частично понятно. Дак вот, в адреналине есть что-то подобное? Я только начал, и порой мне весьма пригодилось бы посмотреть скрипт пошагово.
 
Врядли Это в среде разработки есть такая штука как дебагер и компилятор , то в адрике есть компилятор а вот про дебагер я ничегошеньки не слышал. Второе можешь в какжойстроке сделать принт(номер строки) Это называется логирование или же более заумно тестирование.
 
AdrenalineLife написал(а):
inventory.user.byid(5592, item) ;
Проблема вот тут ты получешь один раз предмет и потом в цикле без дилея пользуешься переменной, а нужно КАЖДЫЙ РАЗ получать предмет - перед использованием!
 
@Ivanius, с чего бы это? После использования item указывает на другой элемент списка?
У него ведь не изменяется инвентарь, с чего бы списку меняться?

а delay(1000) это разве "без дилея"?
 
@Krickt, С того что в Item Может быть все что угодно: нормальный предмет или мусор вообще, потому он и пишет так - нужно получать каждый раз обьект перед использованием, как это сделано в CheckItemCount на пример.
 
@Ivanius, с чего это Item станет мусором без изменений инвентаря?
CheckItemCount по-другому работать и не может, ему в любом случае нужно каждый раз по ID находить, ведь в него нельзя передать объект.
 
Я представляю себе так.

Вот есть список Inventory.User
Когда мы ищем ByID мы находим какой-то элемент этого списка и записываем указатель на него в Item.
Так вот, с чего вдруг после использования предмета объект, на который ссылается Item, поменяется или вообще станет мусором?
Я понимаю, что такое возможно, если у нас поменялся инвентарь, но если список не менялся...
 
@Krickt, Почти так, но не всегда можно получать правильный обьект инвентарь даже если и обновится - будет ок, проблема как раз таки в этих обьектах, которыми описано все в боте, если ты не замечал очень многие вещи нельзя использовать т.к. можно вообще убить бота, если не верно использовать или даже просто записать.
 
@Ivanius, т.е. в боте кривые объекты или что?

Да много казусов движка пкодера видал, бывали такие мистические, что в осадок выпадал.
Вообще боюсь писать что-то серьезное на скрипт движке этом, больной опыт.

Недавно вот столкнулся с тем, что адрик крашился из-за процедуры с exit'ом, которая используется в несколько потоков. Все проверил, exit вроде не мог приводить к проблемам. В 1 поток все ок. Запускаю в 2, вылезают AV и тазом накрывается все. :D
Или может я чего-то не знаю? :D
 
@Krickt, Да все потому что Exit реализован - вызовом как раз таки AV т.е. чтобы выйти - вызывает исключительную ситуацию (ошибку). И много еще других подобных вещей с подводными камнями и якорями не в той степи.
 
@Ivanius, мне кажется ты что-то путаешь, есть куда более безопасные способы вызвать исключительную ситуацию, но никак не AV.
Тогда уж лучше делать какой-нибудь goto в конец процедуры.
 
@Krickt, Ну я имел ввиду не конкретно АВ, а ошибку, прочитай полностью сообщение мое, вот тебе цитата кодера (специально зашел аську и порыл историю):
эксит в паксе очень по дебильному сделан
через программное исключение завершает код
тобишь критом)
 
Krickt написал(а):
Недавно вот столкнулся с тем, что адрик крашился из-за процедуры с exit'ом, которая используется в несколько потоков. Все проверил, exit вроде не мог приводить к проблемам. В 1 поток все ок. Запускаю в 2, вылезают AV и тазом накрывается все. :D Или может я чего-то не знаю? :D
Второй пошёл :lol: :lol:
В свое время нех*ёво обжегся на таком, не одну бессонную ночь потратил, что бы понять в чем проблема. У меня правда симптомы были немного другие, накрывалось только минут через 20.

А ведь exit, номинально, и есть goto в конец процедуры.
break аналогично, только в конец цикла. но с ним тоже ломалось.
 
@AdrenalineLife, После Принт ставь задержку 1 сек. будет норм.
 
Назад
Сверху