XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
ScorpioT1000
Работаем
online
Опыт: отключен
[cJass] IFDEBUG library

Лолшто?

Вспомогательная отладочная build-time библиотека, наподобие Assert.h
Выводит информацию о месте вызова(функции) и условии на экран.

Лолгде?

Решил замутить всетаки тред, остальное, что выложил в пабе, скрою.
1 теперь не Assert, а Ifdebug как Van Damm предлагал)
2 перегружены вызовы с возвратом и без возврата
3 теперь не надо передавать имя ф-ций, спасибо Адику..
3 методы выводятся красиво ! спасибо Адику :)
» ЛолКОД !
library_once Ifdebug {
//   by ScorpioT1000, 2009
//   powered by AdicHelper(cJass.xgm.ru)

    #define private msgwinX = 1.5
    #define private msgwinY = -1.4
    #define private assert_color = "FF404040"

    nothing Ifdebug_debug_msg(string message, integer whichPlayer) {
    // -1 = for all
        integer i = 0
        if(whichPlayer >= 0 and whichPlayer <= 15) {
            DisplayTextToPlayer(Player(whichPlayer),msgwinX,msgwinY,"|c"+assert_color+"Debug: "+message+"|r")
        } elseif(whichPlayer == -1) {
            do {
                DisplayTextToPlayer(Player(i),msgwinX,msgwinY,"|c"+assert_color+"Debug(all): "+message+"|r")
            } whilenot(i++ > 11)
        }
    }
    
    #define private DMSGFUNC = Ifdebug_debug_msg
    
    #define IFDEBUGF(ARG,DEST_PLAYER) = {
        if(ARG) {
            DMSGFUNC(`FUNCNAME` + ": " + `ARG`,DEST_PLAYER)
        }
    }
    
    #define IFDEBUGR(ARG,WHATRET,DEST_PLAYER) = {
        if(ARG) {
            DMSGFUNC(`FUNCNAME` + ": " + `ARG`,DEST_PLAYER)
            return WHATRET
        }
    }
    
    //overloading
    #define {
        IFDEBUG(ARGUMENT) = IFDEBUGF(ARGUMENT, -1) // with condition to all players
        IFDEBUG(ARGUMENT,RET) = IFDEBUGR(ARGUMENT,RET, -1) // with condition and return to all players
        IFDEBUGP(ARGUMENT,DEST_PLAYER) = IFDEBUGF(A,DEST_PLAYER) // with condition to one player
        IFDEBUGP(ARGUMENT,RET,DEST_PLAYER) = IFDEBUGF(A,RET,DEST_PLAYER) // with condition and return to one players
    }

}
IFDEBUG( ARGUMENT ) with condition, to all players
IFDEBUG( ARGUMENT, RET ) with condition and return, to all players
IFDEBUGP( ARGUMENT, DEST_PLAYER ) with condition, to one player
IFDEBUGP( ARGUMENT, DEST_PLAYER, RET ) with condition and return, to one player

Лолкак?

Вставляете внутри любой функции IFDEBUG или IFDEBUGP(если вывести требуется для одного игрока).
В аргументах указываете условие и (если после этой ошибки нужно завершить ф-цию) возвращаемое значение.
Если ф-ция типа void(returns nothing) то указываете пробел, типа:
IFDEBUG(mybool, )
тогда он подставит просто return.
Для случая IFDEBUGP, требуется указать игрока как 2 аргумент.
» ЛолПРИМЕРЫ !

Пример 1:

void MySampleFunc1(unit u) {
    IFDEBUG(u == null)
}
Если u равен null, выведет:
Debug(all): MySampleFunc1: u == null

Пример 2:

bool MySampleFunc2(unit u) {
    IFDEBUG(u == null, false)
    return true
}
Если u равен null, выведет:
Debug(all): MySampleFunc2: u == null
и ф-ция вернет false

Пример 3:

bool MySampleFunc3_player6(real dur) {
    IFDEBUGP(dur < 5, 6)
}
Если dur меньше 5, выведет для игрока 6:
Debug: MySampleFunc3_player6: dur < 5

Отредактировано ScorpioT1000, 14.12.2009 в 00:20.
Старый 01.10.2009, 04:40
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
Мб всё же добавить сюда аналоги, работающие как assert? Ну то есть которые выдают мессаги если условие не истинно.
Старый 01.10.2009, 11:09
NETRAT

offline
Опыт: 83,712
Активность:
а че в cJass нет конструкции типа for (i=0;i<10;i++) ???
переменную i и пару строк кода можно выкинуть нафиг
т.о.
        if(whichPlayer >= 0 and whichPlayer <= 15) {
            DisplayTextToPlayer(Player(whichPlayer),msgwinX,msgwinY,"|c"+assert_color+"Debug: "+message+"|r")
        } elseif(whichPlayer == -1) {
            do {
                DisplayTextToPlayer(Player(whichPlayer),msgwinX,msgwinY,"|c"+assert_color+"Debug(all)​: "+message+"|r")
            } while (++whichPlayer < 12)
        }
ну и, возможно, elseif вообще можно выкинуть заменив на else и принудительно whichPlayer = -1
NETRAT добавил:
хм, нафиг изврат с оверлодами - значения по default для аргументов не поддерживаются?
Ifdebug_debug_msg(string message, integer whichPlayer = -1)
NETRAT добавил:
полноценный assert крут тем что выдается номер строки в коде, иначе он ничем не отличается от debugMsg
Старый 01.10.2009, 11:31
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
а че в cJass нет конструкции типа for (i=0;i<10;i++) ???
будет =)
значения по default для аргументов не поддерживаются?
пока нет
полноценный assert крут тем что выдается номер строки в коде, иначе он ничем не отличается от debugMsg
здесь тоже можно выдавать номер строки в war3map.j, это тебе чем-то поможет?
Старый 01.10.2009, 13:02
NETRAT

offline
Опыт: 83,712
Активность:
конечно, а чем еще примечателен ассерт?
Старый 01.10.2009, 15:43
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
Просто здесь для определения строки юзеру надо было бы лезть в war3map_parsed.j, плюс к тому ск сделал мессаги с юзероопределяемым текстом, так что более-менее понятно будет наверное
Старый 01.10.2009, 16:46
NETRAT

offline
Опыт: 83,712
Активность:
гм, не, надо что бы номер строки был в исходном коде а не в отпарсенном - видимо надо во время парсинга эти номера проставлять, если, конечно, вообще нужен assert, ибо for и значения по умолчанию первоочереднее
Старый 01.10.2009, 16:57
ScorpioT1000
Работаем
online
Опыт: отключен
ты же знаешь какие функции пишешь начерта тебе еще и номер строк?
Старый 01.10.2009, 17:07
NETRAT

offline
Опыт: 83,712
Активность:
всмысле? что бы в коде найти тот самый ассерт, или ты прямо в ассерте пишеш "assert #151 line #522"?
обычно это делается так - получаешь номер строки, клацаешь ctrl+G вбиваешь туда номер и вот тебе проверка
Старый 01.10.2009, 17:10
ScorpioT1000
Работаем
online
Опыт: отключен
там имя ф-ции вобщето выводится)
ScorpioT1000 добавил:
иначе зачем все это надо..
Старый 01.10.2009, 17:10
NETRAT

offline
Опыт: 83,712
Активность:
где? какой функции?
NETRAT добавил:
в функции не может быть много строк или мы о разных вещах говорим?
NETRAT добавил:
btw assert - отладочная функция, выдавать assertion failed юзеру - моветон
Старый 01.10.2009, 17:12
ScorpioT1000
Работаем
online
Опыт: отключен
пример:
void myfunc(int a) {
IFDEBUG(a == 0)
}
выведет "Debug(all): myfunc: a == 0"
тоесть имя ф-ции ты узнаешь и поймешь где ошибка в коде
Старый 01.10.2009, 17:18
NETRAT

offline
Опыт: 83,712
Активность:
а если в твоей функции 100 строк кода, 20 из которых состоят из подобных проверок?
это не программирование, а атмта получается
автоподстановка имени функции это круто, парсер это делает или что?

Отредактировано ScorpioT1000, 03.10.2009 в 15:13.
Старый 01.10.2009, 17:22
ScorpioT1000
Работаем
online
Опыт: отключен
да емае там же условия еще выводятся... неужели неразобрать
ScorpioT1000 добавил:
я сам думал о line просто адик не сделал еще. что ты то хочешь ? ну сделай чтото лучше, я лично не вижу пока лучшего решения

Отредактировано ScorpioT1000, 01.10.2009 в 17:44.
Старый 01.10.2009, 17:25
NETRAT

offline
Опыт: 83,712
Активность:
ну так интересно стало чем ща народ в сJass занимается, решил посмотреть, откомментить
значит atm все круто
Старый 01.10.2009, 17:38
adic3x

offline
Опыт: 108,439
Активность:
имена методов ! должны быть как класс.метод, а не просто имя, ибо это некошерно
врядли, говорю сразу
у меня в голове крутяться сложные мысли про какие то фичи, но выразить я их пока немогу) что то с COUNTER, но что именно - я пока сказать несмогу
НТ с номером строки отпадает, там фича в том, что мы работаем с war3map.j, а не с war3map.wct, т.е. туда сам редактор еще кучу кода напишет
теперь, имхо стоит сделать только один макрос, точнее с одним именем, например:
IFDEBUG (arg, retn) = {
#if retn != NORETVAL
...
#else
...
#endif
}
второе - по моему есть смысл использовать системный макрос DEBUG, который обьвляется, если включен дебаг мод в жасс хелпере. круто же будет!
Старый 01.10.2009, 19:58
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
что-то вроде
#if DEBUG
  /* код либы */
#else
  #define IFDEBUG(ARGUMENT)
  /* итд, ну то есть сделать их пустыми дефайнами */
#endif
Старый 01.10.2009, 20:46
adic3x

offline
Опыт: 108,439
Активность:
ну тут вопрос не в технике, а в идее)
Старый 01.10.2009, 21:02
ScorpioT1000
Работаем
online
Опыт: отключен
нет, я вобще против вжасс дебаг моде ..
а про
врядли, говорю сразу
why? ты не можешь узнать, что это метод а не ф-ция и вписать имя класса?
Старый 02.10.2009, 06:54
adic3x

offline
Опыт: 108,439
Активность:
ты не можешь узнать, что это метод а не ф-ция и вписать имя класса?
хм... да вообще то могу) хм, ну я подумаю над этим, ок?)
ADOLF добавил:
define IFDEBUG (player, expr) = {
	#if DEBUG
		#if player == ALL
			BJDebugMsg(`FUNCNAME` + ": " + `ARG`)
		#else
			DisplayTextToPlayer(Player(player), msgwinX, msgwinY, "|c"+assert_color+"Debug: "+`FUNCNAME` + ": " + `ARG`+"|r")
		#endif
	#endif
}

define IFDEBUG (player, expr, ret) = {
	#if DEBUG
		#if player == ALL
			BJDebugMsg(`FUNCNAME` + ": " + `ARG`)
			return ret
		#else
			DisplayTextToPlayer(Player(player), msgwinX, msgwinY, "|c"+assert_color+"Debug: "+`FUNCNAME` + ": " + `ARG`+"|r")
			return ret
		#endif
	#endif
}
что то вроде этого)
Старый 02.10.2009, 15:24
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 15:30.