DeLiberate |
Отправлено: 17 Февраля, 2016 - 22:54:29
|
Участник
Покинул форум
Сообщений всего: 63
Дата рег-ции: Янв. 2015
Репутация: 0
|
Сам краш (Отобразить)Сигнатура проблемы:
Имя события проблемы: APPCRASH
Имя приложения: Kibor.exe
Версия приложения: 4.0.2.0
Отметка времени приложения: 56c48f22
Имя модуля с ошибкой: Kibor.exe
Версия модуля с ошибкой: 4.0.2.0
Отметка времени модуля с ошибкой: 56c48f22
Код исключения: c0000005
Смещение исключения: 000d32ab
Версия ОС: 6.3.9600.2.0.0.256.48
Код языка: 1049
Дополнительные сведения 1: e751
Дополнительные сведения 2: e751e9e3a37048d4dcdd0b7d7c981a68
Дополнительные сведения 3: ce99
Дополнительные сведения 4: ce997c910551c2354babf1f0dd364d83
Событие (Отобразить)Имя сбойного приложения: Kibor.exe, версия: 4.0.2.0, метка времени: 0x56c48f22
Имя сбойного модуля: Kibor.exe, версия: 4.0.2.0, метка времени: 0x56c48f22
Код исключения: 0xc0000005
Смещение ошибки: 0x000d32ab
Идентификатор сбойного процесса: 0x12b0
Время запуска сбойного приложения: 0x01d169c0fc1fdd9d
Путь сбойного приложения: C:\Program Files (x86)\Kibor\Kibor.exe
Путь сбойного модуля: C:\Program Files (x86)\Kibor\Kibor.exe
Идентификатор отчета: e9bb693f-d5b6-11e5-83ee-94de80b61a38
кусок скрипта (Отобразить)CODE://xtrnl battle cycle
//fread
//fwrite
//readmemory
//1E18DB6C
//writememory
//address, writeaddress, addressi???
win wind=window ("Король Башен: TD - Mozilla Firefox", "MozillaWindowClass", -1);
int okno=formatwi(wind);
int twrcoef=2;//Коэфицент кол-ва вышек деф=1
int count=0;
int exit=0;
int total_exp;
int total_money;
int total_heroexp;
string buffer;
int coordsx[40];
int coordsy[40];
int coordn=0;
int tower_spot[11][10];
int next_wave[16][13];
int PosX_0[512];//for next wave
int PosY_0[512];//for next wave
int spot_n=0;
int builded=0;
int c=0;
int lc=0;
loadimage (#tower_spot[0][0], "C:\Users\Kolya\Documents\King of Tower\tower_spot.bmp");
loadimage (#next_wave[0][0], "C:\Users\Kolya\Documents\King of Tower\next_wave.bmp");
strt:
fopen ("C:\TD_log.txt", "w");
char b=' ';
int mso, msn;
int Year, Month, DayOfWeek, Day, Hour, Minute, Second, Milliseconds;
int Minv=0;
double Min=0;
double Sec=0;
int Secv=0;
int tim=0;
int test=255;
mso=gettime();
CREATE_TIMER(0, 450)//Номер таймера, выполнение таймера через мсек.
{
{
msn=gettime();
tim=(msn-mso);
Sec=(tim/1000);//vsego secund
if (Sec>=60);
{
mso=gettime();
Minv++;
Min++;
Sec=0;
}
Secv=Sec;
textout(2, 520, 114, ""+format(Minv)+" : "+format(Secv)+"", 0);
readclipboard (buffer);
textout(3, 1428, 10, buffer, 0);
//force end
if (getkeystate(20)==1)
{
beep(500,500);
goto endbattle;
}
if (getkeystate(27)==1)
{
beep(1200,10);
beep(1200,10);
beep(1200,10);
exit=1;
goto endbattle;
}
}
}
enabletimer(0);
beep(300, 300);
enabletimer(0);
{
pause (1000);
mouse(LEFT, 1470, 182);
pause(200);
mousedown(LEFT,1470, 182);
pause (200);
mousemove(606, 183);
pause(200);
mouseup(LEFT,606, 183);
mouse(LEFT, 1190, 747); //вышли на карту
pause(2200);
mouse(LEFT, 1143, 607);// открываем бой
pause(1200);
mouse(LEFT, 1119, 785);//начинаем бой
//loadcheck
lch:
lc=loadcheck();
if (lc!=1);
{
textout(1, 1542, 79, "Загрузка...", 0);
goto lch;
}
//ищем споты товеров
spots_find();
textout(1, 1542, 79, "Загружено", 0);//загрузка закончена
mousemove(1305, 511);
move_hero_to_curs();//archer move
mousemove(1049, 597);
move_hero1_to_curs();//knight move
loop (coordn); //build towers cycle
{
if (c>1);
{
force_wave();
}
textout(1, 1542, 79, "Строим вышки...", 0);//начали строить
find_and_build();
c++;
}
timer:
textout(1, 1542, 79, "Играем", 0);//в процессе игры
pause(500);
if (Min<7);
{
check_and_force();
goto timer;
}
else
{
pause(5000);
endbattle:
mouse(LEFT, 1014, 682);
beep(300,40);
mouse(LEFT, 1014, 682);
pause(200);
//logging
function spots_find();
{
coordn=findimage(40, #tower_spot[0][0], 0, #coordsx[0], #coordsy[0], 633, 206, 1393, 852, -1);
loop (coordn);
{
int found_spots=0;
findimage(1, #tower_spot[0][0], 0, #coordsx[found_spots], #coordsy[found_spots], 633, 206, 1393, 852, 0, 0, 0, 0, 0, 0, 100, 1, -1);
found_spots++;
}
}
function loadcheck();
{
if (getcolor(666, 231)==1457631);
{
return 1;
}
return 0;
}
function move_to_spot();
{
int x, y;
x=(coordsx[spot_n]+638);
y=(coordsy[spot_n]+208);
mousemove(x, y);
spot_n=(spot_n+twrcoef);
}
//goto strt;
Краши начались после изменения строчек: (Отобразить)int twrcoef=2;//Коэфицент кол-ва вышек деф=1
spot_n=(spot_n+twrcoef);
Странно, после второй перезагрузки компьютера все заработало.
Ну раз написал, пускай будет.(Отредактировано автором: 17 Февраля, 2016 - 23:07:18) |
|
|
Kibor |
Отправлено: 18 Февраля, 2016 - 00:17:05
|
Эксперт
Покинул форум
Сообщений всего: 8227
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Цитата: enabletimer(0);
{
pause (1000);
скобка без пары
Цитата: fopen ("C:\TD_log.txt", "w");
не закрыт файл
Цитата: else
{
pause(5000);
endbattle:
mouse(LEFT, 1014, 682);
beep(300,40);
mouse(LEFT, 1014, 682);
pause(200);
//logging
// где закрытие скобкой блока??
function spots_find();
ну и еще наверно есть ошибки.. |
|
|
DeLiberate |
Отправлено: 18 Февраля, 2016 - 02:24:57
|
Участник
Покинул форум
Сообщений всего: 63
Дата рег-ции: Янв. 2015
Репутация: 0
|
Kibor пишет: DeLiberate пишет: Я был бы рад, если бы это было так.
я пишу то что вижу в этом коде.
странно что этот скрипт вообще работает.
на любой файлообменник..
В следующий раз буду внимательней при копировании.
Вот весь код, если надо(Отредактировано автором: 18 Февраля, 2016 - 02:28:31) |
|
|
DeLiberate |
Отправлено: 18 Февраля, 2016 - 04:44:53
|
Участник
Покинул форум
Сообщений всего: 63
Дата рег-ции: Янв. 2015
Репутация: 0
|
Kibor пишет: почему fclose(); находится не в связке с fopen??
Потому, что функция fclose(); вызывается, только когда программа завершает работу, или начинает её заново и разницы особой не вижу.
Kibor пишет: то есть где то далеко
файл открывается в начале, т.к. записывал в него из разных частей кода, а каждый раз открывать и закрывать его не вижу смысла.
Kibor пишет: зачем столько круглых скобок?
Когда то были ошибки, из-за неправильно расставленных скобок - теперь паранойя.
На счет скобок: мне удобнее писать в нотпаде++, там наглядей.
Раз вопросы/ответы, то у меня есть один
Так работает:
CODE:
textout (6, 1682, 100," " +formatwi(getwindow()), 2);
Так не работает
CODE:
win actwind=getwindow();
textout (6, 1682, 100," "+format(actwind.class), 2);
И так тоже нет
CODE:win actwind=getwindow();
textout (6, 1682, 100, actwind.class, 2);
Как вывести название класса активного окна?
(Добавление)
Покажите на вот этом примере, если не затруднит.
CODE: win wind=window (-1, "GeckoFPSandboxChildWindow", window ("Король Башен: TD - Mozilla Firefox", "MozillaWindowClass", -1));
win actwind=(getwindow());
activate(wind);
int okno=formatwi(wind);
int actw=formatwi(getwindow());
loop ();
{
if (getkeystate(20)==1)
{
goto quit;
}
textout (4, 1542, 100,"актив_инт"+format(actw), 2);
textout (5, 1542, 130,"флш_инт"+format(okno), 2);
textout (6, 1542, 160,"актив win"+format(actwind.name), 2);
textout (7, 1542, 190,"флш_win"+format(wind), 2);
}
quit:
(Добавление)
разобрался, все понятно. |
|
|
Kibor |
Отправлено: 18 Февраля, 2016 - 05:35:40
|
Эксперт
Покинул форум
Сообщений всего: 8227
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
DeLiberate пишет: На счет скобок: мне удобнее писать в нотпаде++, там наглядей.
Да?
Тогда почему он не показал что function check_and_force() имеет лишнюю закрывающую скобку? откройте в кибор , увидите и исправите.
DeLiberate пишет: Раз вопросы/ответы, то у меня есть один
DeLiberate пишет: И так тоже нет
CODE:
win actwind=getwindow();
textout (6, 1682, 100, actwind.class, 2);
loop()sleep(500);
прекрасно работает.. если добавить петлю что бы порсле выполнения этих строк кибор не завершил работу..
так же такая оптимизация улучшит работу......
CODE:win actwind;
string t="";
loop()
{
actwind=getwindow();
if (actwind.class!=t)
{
t=actwind.class;
textout (0, 182, 100, actwind.class, 1);
}
sleep(100);
}
actwind.class имеет тип string... format не нужен и будет ошибкой
=====================================
Ну а если уже серьезно говорить о самой ошибке, то не стоит приписывать крах программы Кибор сразу к ошибке в программе...
Кибор это среда разработки и сам не правильный код легко вызывает такие ошибки даже при правильном синтаксисе...
пример..
CODE:int a[5];
a[4657465]=55;
ошибки синтаксиса нет..
но... есть ошибка обращения к памяти c0000005
. думаю что в чем ошибка программиста ясно... обращение к не выделенной памяти....
при выполнение такого скрипта кибор крашится с вышеупомянутой ошибкой.. и это не ошибка в кибор.
теперь ладно... разберем ваш скрипт на наличие таких багов программирования...
берем массивы
CODE:int coordsx[40];
int coordsy[40];
берем часть кода
Цитата: loop (coordn);
{
findimage(1, #tower_spot[0][0], 0, #coordsx[found_spots], #coordsy[found_spots], #coordsx[found_spots], #coordsy[found_spots], 1393, 852, 0, 0, 0, 0, 0, 0, 100, 1, -1);
found_spots++;
}
смотрим где обнуляется переменная found_spots...
один раз при запуске скрипта..
теперь не трудно догадаться что рано или поздно при выполнение скрипта (конкретно строки found_spots++, found_spots станет более 40 и приведет к переполнению массивов
CODE:int coordsx[40];
int coordsy[40];
================================
вторая ошибка...
Цитата: findimage(1, #tower_spot[0][0], 0, #coordsx[found_spots], #coordsy[found_spots], #coordsx[found_spots], #coordsy[found_spots], 1393, 852, 0, 0, 0, 0, 0, 0, 100, 1, -1);
что это?? это явная ошибка.. использование указателей вместо значений..
==============================
рассмотрим третий случай в этом скрипте который может привести к краху...
открытие файла для записи...
см справку
там написано в примерах что надо проверять что файл открылся
if (fopen ("c:\5.txt", "w")!=0)
и только потом уже писать в него..
зачем проверять? а если C:\TD_log.txt создать не возможно??
на диске c не всегда можно создать файп под правами юзера... иногда надо запуск от администратора.
Теперь пользователь у которого не хватает прав встретится с крахом. и это не ошибка в кибор. это ошибка программирования.
надеюсь понятно пояснил.
будьте внимательны при программирование... |
|
|
DeLiberate |
Отправлено: 18 Февраля, 2016 - 15:54:24
|
Участник
Покинул форум
Сообщений всего: 63
Дата рег-ции: Янв. 2015
Репутация: 0
|
Kibor пишет: один раз при запуске скрипта..
Переменная объявляется после метки strt: ,на которую прыгаем по завершению уровня, а за уровень функция вызывается один раз.
CODE:strt:
fopen ("C:\TD_log.txt", "w");
int found_spots=0;
int builded=0;
int coordn=0;
А количество циклов в функции ограничено переменной coordn
CODE:coordn=findimage(10, #tower_spot[0][0], 0, #coordsx[0], #coordsy[0], 633, 206, 1393, 852, -1);
Поэтому переполнения нет.
Kibor пишет: использование указателей вместо значений..
Это потому, что из справки (Отобразить)Указатель на переменную ссылается на один и тот же адрес в памяти что и переменная, то есть работая с указателем на переменную мы по сути работаем с самой переменной. я не совсем понял, чем отличаются указатели на переменную от самой переменной, код работает и я думал, что это нормально. Буду рад разъяснению почему это неправильно.
Что касается лога:
Мне он нужен для отладки, на своем компе, у меня есть права на запись на C:/
Я к тому, что в конечном итоге его может и не быть.Но впредь, дабы избежать рисков - буду проверять.
--------
Можно ли написать библиотеку с функциями кибора, и подключать её только если потребуется с помощью external? |
|
|
Kibor |
Отправлено: 18 Февраля, 2016 - 16:09:07
|
Эксперт
Покинул форум
Сообщений всего: 8227
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Указатель - это число обозначающее номер ячейки в памяти, в которой находятся данные. то есть просто адрес.
использовано неправильно.
к тому же даже если использовать не указатель а само значение как тут, то опять не правильно, так как на момент вызова
findimage(1, #tower_spot[0][0], 0, #coordsx[found_spots], #coordsy[found_spots], coordsx[found_spots], coordsy[found_spots], 1393, 852, 0, 0, 0, 0, 0, 0, 100, 1, -1);
в этом выделенном нет значений. там мусор. посколько там значения появятся после выполнения и нахождения рис.
Скрипт полон ошибок. К примеру что означает fwrite (,);??
Короче просматривайте скрипт и устраняйте ошибки и будет работать..
DeLiberate пишет: Можно ли написать библиотеку с функциями кибора, и подключать её только если потребуется с помощью external?
Не понял.. Эти функции подключать не надо. А если не все функции нужны, то кушать не просят.. |
|
|
|