adic3x

cJass - дополнение к языку JASS

Published

Что это?

cJass - это еще одно расширение языка JASS, которое полностью совместимо с популярным vJass. Цель его создания - дать программистам еще больше возможностей по созданию простого и качественного кода. Основными направлениями являются:
  1. Макросредства и стандартная библиотека - избавляют от рутины, позволяя сконцентрироваться на основном коде.
  2. Упрощение синтаксиса - мы не хотим снова начинать спор, какой синтаксис лучше (блоки через begin & end или {}), и более того, мы не навязываем свою точку зрения - все конструкции cJass имеют JASS-style аналоги, тем не менее мы предоставляем выбор.
  3. Оптимизация карты - основная концепция cJass - это то, что все языковые конструкции не должны сказываться на качестве генерируемого кода. Также мы работаем над встроенным оптимизатором.

Как это использовать?

Просто скачайте дистрибутив (пароль для архива: cjass), распакуйте и запустите инсталлятор. У вас уже должен быть установлен Jass New Gen Pack.
Ознакомиться с возможностями можно, прочитав руководство пользователя cJass (off-line версия этого файла также имеется в директории программы).

Что-то не работает!

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

У меня есть идея: а не плохо бы...

Мы всегда рады выслушать Ваши идеи и предложения по внесению каких либо новых возможностей в язык, расширению стандартной библиотеки и т.д. Иногда мы даже действительно делаем то, что Вы нам предлагаете ;) Наша секция обратной связи ждет Вас!
» И напоследок немного истории.
А история программы начинается на ресурсе wc3c.net, когда Vexorian, выслушав предложение от ADOLF'a сделать инструкции инкремента и декремента создает ветку с обсуждением синтаксиса... и благополучно забывает об этом. Тогда ADOLF подумал: "А неплохо было бы сделать свой парсер и включить в него всяких вкусностей". Изначально программа весила меньше заветных 9000 байт, распространялась по сети ICQ/Jabber и ее использовали несколько человек.
Однажды один из ее пользователей - Van Damm (впоследствии стал соавтором) сказал "это очень удобно!" (это было сказано про то, что можно вызывать функции без ключевого слова call) - и тогда мы решили, что если это удобно, почему бы не выложить программу на публичное обозрение. Благодаря zibade у нас появился сайт, где сразу стал отписываться Dark Dragon, который помог выявить львиную долю багов и внес множество интересных предложений.
С тех пор прошло много времени, мы сделали много новых версий, вес программы вырос в 3 раза (сейчас 26 Кбайт). На данный момент у нас есть планы, касающиеся многих конструкций, оптимизатора, и всего прочего.


Views: 87 270



Van Damm #1 - 11 лет назад 0
Голосов: +0 / -0
То, чего все так долго ждали, свершилось!
YellowStar #2 - 11 лет назад 0
Голосов: +0 / -0
Вероятно тут ответят на вопросы старой темы. И желательно узнать насчет предложении -.-
Van Damm #3 - 11 лет назад 0
Голосов: +0 / -0
Только дефайны без скобок, остальное - нет.
Chester #4 - 11 лет назад 0
Голосов: +0 / -0
А будет ли сборка JNGP+CJ+PH ?
спасибо, танкисты, они благодарны
Мануал класный!
Van Damm #5 - 11 лет назад 0
Голосов: +0 / -0
Для тех, кто в танке, напишу большими буквами:
[h2][url=http://cjass.xgm.ru/manual-ru][highlight]Руководство пользователя cJass[/highlight][/url][/h2]
Elf_Stratigo #6 - 11 лет назад 0
Голосов: +0 / -0
bb:гж)
У меня вопрос по области видимости:
если мне нравится пользоваться блоком define /enddefine то куда приписывать private?
Nekit1234007 #7 - 11 лет назад 0
Голосов: +0 / -0
define
    private bla=blabla
enddefine
YellowStar #8 - 11 лет назад 0
Голосов: +0 / -0
Собственно для ленивых. Простенький хук позволяющий не писать нудные обнуления переменных.
Вес файла: около 2 кб.
юзать аттачи религия не позволяет? VD
Sunn #9 - 11 лет назад 0
Голосов: +0 / -0
А так, посмотрим.
[size=1][i]Sunn добавил:[/i][/size]
Даа, ридми кошерен... как и то, о чём там написано.
YellowStar #10 - 11 лет назад 0
Голосов: +0 / -0
Для такого файла я бы использовал атач, но мне выдает что расширения файла не верное (.j)
странно как то. Поэтому я и выложил через ссыль.
DragonSpirit #11 - 11 лет назад 0
Голосов: +0 / -0
narayan, в архив закинь..
если файл .j и весит 2 Кб, то лучше под cut загнать. © swdn
Daemonik #12 - 11 лет назад 0
Голосов: +0 / -0
А что это за файл AHU_selfdel.exe?
При открытии WE мне ошибку выдает.
Это сообщение удалено
Chester #14 - 11 лет назад 0
Голосов: +0 / -0
А что там на счет приравнивания к нулю переменных? Будет ли это, если да то как?
как насчет unit var => !var
Van Damm #15 - 11 лет назад 0
Голосов: +0 / -0
При открытии WE мне ошибку выдает.
все баги с этим были исправлены в тот же день
Будет ли это
не будет
Chester #16 - 11 лет назад 0
Голосов: +0 / -0
По какой причине? И возможно ли это сделать с помощью деф ?
Hellfim #17 - 11 лет назад 0
Голосов: +0 / -0
Chester, возможно, делай. Но это никому не нужно =)
adic3x #18 - 11 лет назад 0
Голосов: +0 / -0
обьясните хоть что?
Hellfim #19 - 11 лет назад 0
Голосов: +0 / -0
ADOLF, что-то типо автообнуления локалок.
adic3x #20 - 11 лет назад 0
Голосов: +0 / -0
ясно, этого небудет)
Chester #21 - 11 лет назад 0
Голосов: +0 / -0
А как это сделать с пом деф?
adic3x #22 - 11 лет назад 0
Голосов: +0 / -0
а чем вам не нравиться обычный вариант set var = null ?
Sebra #23 - 11 лет назад 0
Голосов: +0 / -0
А есть ли в планах преобразование выражений как в сишном препроцессоре? Вроде такого:
s=2*Pi*r => s=r*6.2831...
или такого:
whilenot !(a>b) => loop; exitwhen a<=b
И вообще, как бы заглянуть в ваше "планов громадьЁ"? А то многое, чего хочется, видимо там уже есть. Если чего не найдём - скажем. :)
Van Damm #24 - 11 лет назад 0
Голосов: +0 / -0
Sebra, в планах такое есть, этим будет заниматься оптимизатор.
Elf_Stratigo #25 - 11 лет назад 0
Голосов: +0 / -0
[quote=Sebra]s=2*Pi*r => s=r*6.2831...[/quote]
а разве при загрузке варик не считает константы?
Daemonik #26 - 11 лет назад 0
Голосов: +0 / -0
Варик их считывает только в том случае если ты пишешь bj_PI итд
Van Damm #27 - 11 лет назад 0
Голосов: +0 / -0
а разве при загрузке варик не считает константы?
такое он не считает точно
ScorpioT1000 #28 - 11 лет назад 0
Голосов: +0 / -0
считает я думаю.
Elf_Stratigo #29 - 11 лет назад 0
Голосов: +0 / -0
bb:предлагаю придумать дерективы
private:
public:
ну то есть чтобы не перед каждой функцией, переменной, константой, дефином писать их область видимости, а чтобы сразу разбить всё по сегментам)))
(вроде такого нет, правда?)
Sebra #30 - 11 лет назад 0
Голосов: +0 / -0
такое уже предлагалось - вроде в "тудулист" попало.
Кстати я тут вычитал, что вар спокойно понимает числа вида $34 без замены их на 0x34.
Проверил - игнорит доллар, а 0х работает.
NCrashed #31 - 11 лет назад 0
Голосов: +0 / -0
Ура мануал появился!! Безумно рад, теперь каша в голове систематизируется).
Хотелось бы нормальную подсветку кастом функций
ScorpioT1000 #32 - 11 лет назад 0
Голосов: +0 / -0
всем хотелось бы.. тока для этого надо переписывать хайлайтер) вандам вроде начал. или нет ?
adic3x #33 - 11 лет назад 0
Голосов: +0 / -0
txt2:> Кстати я тут вычитал, что вар спокойно понимает числа вида $34 без замены их на 0x34.
проблемы были толи в хелпере векса, толи в пЖасс
1.4.0.3 уже превращает автоматически $ в числах в 0х
private:
public:
сделаю, только позже
считает я думаю.
вар несчитает константы, я приводил пост на сижассе, сейчас найду его
"прекалькуляция" также планируется, но только для литералов
ADOLF добавил:
» как вар работает с константами (англ.)
Here's the JASS code, which we're going to disassemble:
constant real x = 0.
define xx = 0.
void fx () { real const = x, def = xx }
And here's what operations we've got when the above code is run by the game's JASS interpreter:
08C9E0A0 fx+0000 00 00 05 05 00000eaf CREATE_LOCAL const {real (5)}
08C9E0A8 fx+0008 00 05 68 0e 0000024a MOV_VAR_REG x => #68 {real (5)}
08C9E0B0 fx+0010 00 00 68 11 00000eaf MOV_REG_VAR #68 => const
08C9E0B8 fx+0018 00 00 05 05 00000eb0 CREATE_LOCAL def {real (5)}
08C9E0C0 fx+0020 00 05 69 0c 00000000 MOV_VAL_REG 0 => #69 {real (5)}
08C9E0C8 fx+0028 00 00 69 11 00000eb0 MOV_REG_VAR #69 => def
08C9E0D0 fx+0030 00 00 00 27 00000000 RETURN
08C9E0D8 fx+0038 00 00 00 04 00000000 STUB_FUNC_END
As you see, on line 2 the value is taken from the memory area, corresponding with the constant address and placed to the register (it's in bold text). Then the value in the register assigned to the local variable at line 3.
On line 5, direct value is placed to the register (it's in bold text), and then assigned to the second local variable at line 6.
If to make an example in plain asm, the difference is the same as the difference between these two statements:
mov eax, dword ptr [40000000h] ; address
mov eax, 10h ; value
In the first case, you have to look the memory for the address, then find what value is in that memory area and then move the value to the register.
In the second case, you just move the value to the register - it's much faster.
That's why in cJass defines do direct value substitution.
Van Damm #34 - 11 лет назад 0
Голосов: +0 / -0
txt2:Ничего оно не считает =)
Вот простейшая функция:
function fx takes real r returns real
   return 2*r*bj_PI
endfunction
А вот она дизассемблирована:
0E41D2A8         00 00 05 03  00000e98    STUB_FUNC_BEGIN fx
0E41D2B0 fx+0000 00 01 05 08  00000252    CREATE_LOCAL_FROM_STACK r [1] {real (5)}
0E41D2B8 fx+0008 00 04 c3 0c  00000002    MOV_VAL_REG 2 => #c3 {integer (4)}
0E41D2C0 fx+0010 00 00 c3 17  00000000    #c3 = (float)#c3
0E41D2C8 fx+0018 00 00 c3 13  00000000    PUSH #c3
0E41D2D0 fx+0020 00 05 c4 0e  00000252    MOV_VAR_REG r => #c4 {real (5)}
0E41D2D8 fx+0028 00 00 c5 14  00000000    POP #c5
0E41D2E0 fx+0030 c4 c5 c5 22  00000000    #c5 = #c5 * #c4
0E41D2E8 fx+0038 00 00 c5 13  00000000    PUSH #c5
0E41D2F0 fx+0040 00 05 c6 0e  000007ed    MOV_VAR_REG bj_PI => #c6 {real (5)}
0E41D2F8 fx+0048 00 00 c7 14  00000000    POP #c7
0E41D300 fx+0050 c6 c7 c7 22  00000000    #c7 = #c7 * #c6
0E41D308 fx+0058 00 c7 00 0d  00000000    MOV_REG_REG #c7 => #00
0E41D310 fx+0060 00 00 00 27  00000000    RETURN
0E41D318 fx+0068 00 00 00 27  00000000    RETURN
0E41D320 fx+0070 00 00 00 04  00000000    STUB_FUNC_END
откуда ясно видно, что вар просто считает всё подряд =)
adic3x #35 - 11 лет назад 0
Голосов: +0 / -0
ну это все правильно - в ситуации когда вар обрабатывает весь скрипт при выборе карты самое важно скорость этой обработки, и офк ни о какой оптимизации не может быть и речи
Sunn #36 - 11 лет назад 0
Голосов: +0 / -0
[quote=cJass readme][code] function test takes integer num, integer pow returns integer
integer res = 1, i = 0
whilenot (i++ >= pow) {
res *= num
}
return res
endfunction
что транслируется в следующее:
function test takes integer num, integer pow returns integer
local integer res = 1
local integer i = 0
loop
exitwhen (i >= pow)
set i = i + 1
set res = res * num
endloop
return res
endfunction[/code][/quote]
мне кажется, что следует поставить инкремент счетчика цикла в конец его действий, т.к. если мы по счетчику забиваем массив то пропадает нулевой элемент.
adic3x #37 - 11 лет назад 0
Голосов: +0 / -0
Sunn, нет, для забивания массива (например) просто используется другой цикл - do {} whilenot (expr)
читайте рид ми внимательнее
Sebra #38 - 11 лет назад 0
Голосов: +0 / -0
Sunn, Да какая разница, для чего и что мы используем?
Препроцессор cJass получил однозначную команду: посчитать условие и увеличить i.
i должно быть увеличено сразу после вычисления условия, а не там, где кому-то хочется.
Кстати, ADOLF, при невыполнении условия i тоже надо увеличивать! Это ошибка в справке?
Elf_Stratigo #39 - 11 лет назад 0
Голосов: +0 / -0
[code]define HASHTABLETYPE = 0 0=no hash 1=have
define hash = name
library System initializer init
define
{
private void=nothing
private int=integer
private bool=boolean
}
#if HASHTABLETYPE==0
hashtable HashTable=InitHashtable()
setdef hash = HashTable
#endif
void init()
{
hash=hash
}
endlibrary[/code]
почемуто условная трансляция не работает(
п.с. что я садист - можно не сообщать)
adic3x #40 - 11 лет назад 0
Голосов: +0 / -0
при невыполнении условия i тоже надо увеличивать! Это ошибка в справке?
нет... мда, баг. буду фиксить. т.е. постиксный инкремент в инструкции exitwhen должен обрабатывать аналогично ему же в инструкции if
ADOLF добавил:
Elf_Stratigo, у меня сохранило все правильно, поясните подробнее, что именно неработает
Sebra #41 - 11 лет назад 0
Голосов: +0 / -0
Конечно, ветвление же.
Кстати, а почему отказался от варианта i++ => (++i-1) ?
adic3x #42 - 11 лет назад 0
Голосов: +0 / -0
что бы два инкремента одной переменной в обычной инструкции и в подобной работали одинаково
Sebra #43 - 11 лет назад 0
Голосов: +0 / -0
То есть для того, чтобы всегда --i==i-- ?
:)
Elf_Stratigo #44 - 11 лет назад 0
Голосов: +0 / -0
после трансляции получаю код, в котором не убраны директивы условной трансляции:
[code]globals
globals from System:
#if 0==0
hashtable HashTable=InitHashtable()
#endif
endglobals from System
trigger gg_trg_____________________________________001=null
trigger l__library_init
endglobals[/code]
может у меня не последняя версия - есть какойто способ узнать версию AdicHelper?
такто я для уверенности несколько раз позапускал AHupdate.exe - результат - окошко "cJass is up to date."
Van Damm #45 - 11 лет назад 0
Голосов: +0 / -0
Версия показывается если нажать "About AdicHelper" в меню.
У меня твой код работает отлично.
Elf_Stratigo #46 - 11 лет назад 0
Голосов: +0 / -0
bb:если установка "старого образца" меню нету))
ок, переставлю через инсталятор...
adic3x #47 - 11 лет назад 0
Голосов: +0 / -0
эээ, у вас очевидно очень старая версия, раз нет меню...
NCrashed #48 - 11 лет назад 0
Голосов: +0 / -0
возможно, чтобы можно было приват ставить целому блоку дефайна, или хотя бы чтобы асид при этом ошибку выдавал а не вис намертво:
define private { 
    void = nothing
}
NCrashed добавил:
это так, предложение для следующих версий
adic3x #49 - 11 лет назад 0
Голосов: +0 / -0
уф, кто знает. как минимум я сделаю защиту - что бы он говорил что синтаксис еррор
Nekit1234007 #50 - 11 лет назад 0
Голосов: +0 / -0
Есть предложение для оптимизатора, если НЕ используется InitTrig_%trigname% или функция используется не для создания триггера, то удалять gg_trg_%trigname% из глобалок.
Elf_Stratigo #51 - 11 лет назад 0
Голосов: +0 / -0
bb:эта переменная может использоваться позже
Nekit1234007 #52 - 11 лет назад 0
Голосов: +0 / -0
Тогда так, если она нигде не используется, то удалять её =)
Elf_Stratigo #53 - 11 лет назад 0
Голосов: +0 / -0
bb:лучше выводить отчёт и неиспользуемых глобалках, ну или даже локалках будет айс ^^
adic3x #54 - 11 лет назад 0
Голосов: +0 / -0
оптимизатор удаляет ненужные функции и переменные, правда там много нюансов
Nekit1234007 #55 - 11 лет назад 0
Голосов: +0 / -0
Например с последней версией сЖасса, карта сохраняется с этими гг_трг...
adic3x #56 - 11 лет назад 0
Голосов: +0 / -0
они их не удалит, т.к. теоритически ты можешь вызывать функцию инициализации триггера через ExecuteFunc
ADOLF добавил:
хотя под генерируемые редактором функции можно написать проверялку)
Sebra #57 - 11 лет назад 0
Голосов: +0 / -0
Теоретически можно проверять все ExecuteFunc на наличие переменных, и если нет ни одной такой функции с переменными в аргументах, невызываемые функции удалять.
adic3x #58 - 11 лет назад 0
Голосов: +0 / -0
проверять все ExecuteFunc
гемора много, начнем с того, что она может быть зашита в импортированный blizzar.j/common.j
потому я забил на это. пока забил. а оптиональные функции делать всеравно
Это сообщение удалено
Toadcop #60 - 11 лет назад 0
Голосов: +0 / -0
bb:Zinc > cJass
это проверено на практике.
FREEZE_ball #61 - 11 лет назад 0
Голосов: +0 / -0
[b]ADOLF[/b], а нельзя ли сделать что-нибудь типа "тега неудаления" для глобальных переменных? Тегом !novjass (или как там) в этом случае особо не попользуешься. А мне эти три глобалки очень нужны.
ScorpioT1000 #62 - 11 лет назад 0
Голосов: +0 / -0
FREEZE_ball, ты издеваешься?
Nekit1234007 #63 - 11 лет назад 0
Голосов: +0 / -0
Было бы не плохо иметь дефайн, который подставляет билд карты:
[URL=http://i057.radikal.ru/0910/68/d35dff4f211c.png][IMG]http://i057.radikal.ru/0910/68/d35dff4f211​ct.jpg[/IMG][/URL]
ScorpioT1000 #64 - 11 лет назад 0
Голосов: +0 / -0
Это еще кто-то использует ?
NCrashed #65 - 11 лет назад 0
Голосов: +0 / -0
txt2:Попытался апдейтнутся до версии 1.4.0.3 c 1.4.0.1 автоапдейт зациклился, ввел ошибку '[]'. Начал перезапускать себя, его процесс жил менее секунды, поэтому убить через диспечер не получилось, перезагрузка помогла =). Опять надо ручками апдейтиться?
adic3x #66 - 11 лет назад 0
Голосов: +0 / -0
А мне эти три глобалки очень нужны.
если ты из будешь использовать - они не будут удалены
Zinc > cJass
лол
сейчас на зеХелпере такие епичные треды с приглашенной звездой вексом по этому поводу)
ADOLF добавил:
хотя на хайве тоже)
NCrashed #67 - 11 лет назад 0
Голосов: +0 / -0
txt2:Хотелось, чтобы при таком макросе парсер сразу подставлял значения произведений, разницы, сложения и т.п.
define {
    SetArray(type,name,n,l) = type array name [n*l] 
}
NCrashed добавил:
Иначе такая конструкция невозможна
NCrashed добавил:
Хм, а не пора ли выделить для cJass подфорум? А то сайт для обсуждений не подходит, и скоро из этой темы и раздела джазза будет такая каша...
adic3x #68 - 11 лет назад 0
Голосов: +0 / -0
cJASS defines can be a powerful tool when used correctly
© внезапно угадайте кто
I think of cJASS as the democrats and vJASS/Zinc as the republicans. Why? vJASS/Zinc continues to control while cJASS continues to provide more freedom.
лол)
ADOLF добавил:
Хотелось, чтобы при таком макросе парсер сразу подставлял значения произведений
нет, прекалькуляцию предусмотрена, но уже при оптимизации
а векс это не считает (в случае если там стоят литералы)?
NCrashed #69 - 11 лет назад 0
Голосов: +0 / -0
Я понимаю, что у вас с вексом там великий холивар, уж лучше давайте дальше "provide more freedom" для пользователей, демагогия полезна в ограниченных объемах.
NCrashed добавил:
а векс это не считает (в случае если там стоят литералы)?
На практике показано, что нет.
NCrashed добавил:
прекалькуляцию предусмотрена, но уже при оптимизации
С какой версии поддерживается (если уже сделана перекалькуляция)? Наверно, она должна проходить автоматически при включенном АсидОптимайзере , а я не могу норм обновиться с 1.4.0.1
NCrashed добавил:
Проблема с обновлением снята.
ScorpioT1000 #70 - 11 лет назад 0
Голосов: +0 / -0
векс уг - он тормознуто инлайнит ф-ции, не рассматривай его оптимайзер)
adic3x #71 - 11 лет назад 0
Голосов: +0 / -0
С какой версии поддерживается (если уже сделана перекалькуляция)?
с той, которую я выпущу сам низнаю когда
да нет, собственно что то будем думать (это я насчет холивара), сейчас нам надо выбрать политический курс.
ладно, я пошел писать новые фичи
Van Damm #72 - 11 лет назад 0
Голосов: +0 / -0
Вопрос с политическим курсом всё ещё не решен до конца :(
ScorpioT1000 #73 - 11 лет назад 0
Голосов: +0 / -0
Злой адик.
NCrashed #74 - 11 лет назад 0
Голосов: +0 / -0
Сказывается влияние линукса, теперь есть 2 ветки обновлений =) стабильная и нестабильная. А галочка "обновлять TESH" на будущее добавлена, и кто сервер обновлений держит?
ScorpioT1000 #75 - 11 лет назад 0
Голосов: +0 / -0
xgm я думаю)
adic3x #76 - 11 лет назад 0
Голосов: +0 / -0
txt2:> теперь есть 2 ветки обновлений =)
та что дев по идее не обновляется автоматически, но там всегда больше фич (и возможно багов^^)
ADOLF добавил:
1.4.1.6 - не отстаем от векса
void fx () {
    int i[]
}
Chester #77 - 11 лет назад 0
Голосов: +0 / -0
ADOLF, что значит сообщение Killing Vexorian при компиляции ?
Скрытая мечта хD?
Sebra #78 - 11 лет назад 0
Голосов: +0 / -0
Это Векс тебя заставил :)
А как насчёт блоков из одного выражения без { и }?
NCrashed #79 - 11 лет назад 0
Голосов: +0 / -0
Это такое направление политики выбрали xD
Это такое объявление массива?
Van Damm #80 - 11 лет назад 0
Голосов: +0 / -0
та что дев по идее не обновляется автоматически
обновляется автоматически то, что выберешь в настройках =)
Van Damm добавил:
Это такое объявление массива?
да
DragonSpirit #81 - 11 лет назад 0
Голосов: +0 / -0
Хз баг ли это,но когда нажимаешь AutoUpdate Settings,то запускается апдейтер о.О,версия AdicHelper`a 1.4.1.5
Van Damm #82 - 11 лет назад 0
Голосов: +0 / -0
О_О жутко странно. Какая версия апдейтера?
Sebra #83 - 11 лет назад 0
Голосов: +0 / -0
А что там в 1.4.1.6 ?
Ченджлог не правлен.
DragonSpirit #84 - 11 лет назад 0
Голосов: +0 / -0
Van_Damm, такая же,паком качал
Van Damm #85 - 11 лет назад 0
Голосов: +0 / -0
DragonSpirit, ну попробуй сам запустить AHupdate.exe /options
ZeToX2007 #86 - 11 лет назад 0
Голосов: +0 / -0
Вопросс: кто нибудь так делает ?)
constant int Type## helm = 1
constant int Type## boots = 2
... (и тд)
есть функция
void f0x00(integer){
....
}
и дефайка
define STI(T) = f0x00(Type## T)
мне кажется удобно
Sebra #87 - 11 лет назад 0
Голосов: +0 / -0
У Векса есть key
У Адика есть enum
В чём принципиальное отличие твоего предложения?
LordSerga #88 - 11 лет назад 0
Голосов: +0 / -0
Просто супер!!! я мануал проситал!! стока возможностей!
Вот как это???
integer i = 7, j, k
что произойдёт??
local integer i=7
set i=j
set i=k
или что буцдет? О_О
ZeToX2007 #89 - 11 лет назад 0
Голосов: +0 / -0
LordSerga, неааага
local integer i = 7
local integer j
local integer k
NCrashed #90 - 11 лет назад 0
Голосов: +0 / -0
Прошу подробнее рассказать про "optional functions"
NCrashed добавил:
И встречное предложение - сделайте Variadic function =)
Van Damm #91 - 11 лет назад 0
Голосов: +0 / -0
Прошу подробнее рассказать про "optional functions"
Это к выпиливанию кода. А вы что подумали?
Если эти функции (которые не принимают параметров) нигде не юзаются, то они спокойно выпиливаются.
Это сообщение удалено
adic3x #93 - 11 лет назад 0
Голосов: +0 / -0
Это к выпиливанию кода.
вам сойдет такое ?
грубо говоря, так надо метить функции, которые вы возможно не будете вызывать через call, и точно не будете вызывать через ExecuteFunc
стоить отметить, что все функции, которые принимают какие либо входные аргументы (т.е. все кроме takes nothing) считаются по умолчанию optional
опциональная функция выпиливается оптимизатором при сохранение, если она не используется
NCrashed #94 - 11 лет назад 0
Голосов: +0 / -0
Теперь все ясно, делайте ключевое слово "optional" пригодится
adic3x #95 - 11 лет назад 0
Голосов: +0 / -0
оно уже сделанно в "дев" версии, правда в ней еще прибавленно несколько багов, которые я пофиксю через пару дней
Hellfim #96 - 11 лет назад 0
Голосов: +0 / -0
ADOLF, слава богу ты пришел, тебе вд сказал про баг с каунтером? Если нет, то он прибавляется только до 9.
Так же несколько полезных предложений по его улучшению:
  1. Получить текущее значение счетчика.
  2. Обнулить счетчик.
Это реально важно и нужно (мне во всяком случае =)).
Van Damm #97 - 11 лет назад 0
Голосов: +0 / -0
Hellfim, всё уже украдено до вас. Будет, но не так, как ты думаешь.
adic3x #98 - 11 лет назад 0
Голосов: +0 / -0
коунтер пофиксил, скоро выльем
там я еще кое что фиксил, и надо еще что то отфиксить)
ScorpioT1000 #99 - 11 лет назад 0
Голосов: +0 / -0
да кстати сам по себе один счетчик не имеет смысла ведь у нас тут ооп зашкаливает, все либы независимы итп))
Van Damm #100 - 11 лет назад 0
Голосов: +0 / -0
да кстати сам по себе один счетчик не имеет смысла ведь у нас тут ооп зашкаливает, все либы независимы итп))
и что вы таки предлагаете?
MF #101 - 11 лет назад 1
Голосов: +1 / -0
Van_Damm, даешь новый тип counter с методами getCurent, getNext и так далее )))
Van Damm #102 - 11 лет назад 0
Голосов: +0 / -0
MF, ты почти угадал О_О
Elf_Stratigo #103 - 11 лет назад 0
Голосов: +0 / -0
[code]library ZloVnytri initializer init
define private e_Accelerator = 3
define
{
private void=nothing
private int=integer
private bool=boolean
}
private group dgroup
private bool Zlo
{
return GetWidgetLife(GetFilterUnit())>.405 and (not IsUnitAlly(GetFilterUnit(), dplayer))
}
private void OnTimer
{
dplayer=Player(1)
}
private void init()
{
count=0
dgroup=CreateGroup()
TimerStart(CreateTimer(),0.01*e_Accelerator,true,function OnTimer)
Zlo
}
endlibrary[/code]
Очень забавно - AdicHelper вешается в шаге Killing Vexorian
как бы если внутри очень много чего написано сомнительного, то тривиальность ошибки не сразу видна...
Sebra #104 - 11 лет назад 0
Голосов: +0 / -0
Библиотеку не открыл фигурной скобкой - раз
Начались дефайны - ждём закрытие endlibrary
определение переменной
private bool Zlo
и открываем блок...
{
return GetWidgetLife(GetFilterUnit())>.405 and (not IsUnitAlly(GetFilterUnit(), dplayer))
}
Вот на ничейном блоке влутри либы без { и затыкаемся
NCrashed #105 - 11 лет назад 0
Голосов: +0 / -0
Предложение сделать энум:
ForGroup name{

}
Sebra #106 - 11 лет назад 0
Голосов: +0 / -0
А нативку зачем приплёл?
Энум уже есть и собирается быть лучше. Давно.
Van Damm #107 - 11 лет назад 0
Голосов: +0 / -0
library/endlibrary тоже работает. Другое дело, что после имени функции должны стоять скобки! Это ведь чёрным по белому написано в руководстве! Его кто-то читает вообще?
adic3x #108 - 11 лет назад 0
Голосов: +0 / -0
[quote]ForGroup name{
}[/quote]
это векс делает, я пока над анонимными функциями не думал
Sebra #109 - 11 лет назад 0
Голосов: +0 / -0
Van_Damm, "Затыкаемся" - значит АдикХелпер зависает!
И с чего это твой апдейтер стал распознаваться трояном?
Кстати, в момент зависания (на функции Zlo) опять вылез антивирус.
ADOLF, Я понимаю, что вперёд Векса анонимные функции делать чревато, но может быть всё просто:
sometype somefunction(int arg){
...
      TimerStart(t, 65.0, false,  function(){ BJDebugMsg("65 seconds later") }  )
...
}
Выносим анонимную функцию перед текущей, даём ей уникальное имя, подставляем это имя в выражение. - Всё. Этого достаточно.
Векс, правда, хочет , чтобы внутрь передавались локалки, чтобы использовались интерфейсы, ещё что-то. Но уже этого будет достаточно для начала.
adic3x #110 - 11 лет назад 0
Голосов: +0 / -0
bb:ну мне сейчас надо баги отфиксить))) т.е. там их много... очень
насчет апдейтера - хз, ну вообще он даунлоадит... вд, а ты не думал мд делать сам .ехе апдейтера статичным, а даунлоадитть .длл, а потом ее через лоад либрари?
YellowStar #111 - 11 лет назад 0
Голосов: +0 / -0
function = nothing
дефаин с таким типом записи, умирает на убиистве векса.
Van Damm #112 - 11 лет назад 0
Голосов: +0 / -0
bb:Эм, странный дефайн вообще-то. Но вам ведь сказали, что вылеты ещё есть (
Sebra #113 - 11 лет назад 0
Голосов: +0 / -0
narayan, Это типа "функция - ничто, юнит - всё" ?
Ну да. Делает из кода такую кашу, что cJass вешается. Хотя надо, конечно выдавать ошибку.
Нож - инструмент опасный. Можно и порезаться.
После такого, даже если в пользовательском коде всё хорошо (да хоть пусто), близовские функции рушатся.
Elf_Stratigo #114 - 11 лет назад 0
Голосов: +0 / -0
bb:у меня вопрос по оптимизатору - а является ли эта штука супер чудоштукой?))))
поясню немного:
допустим есть в карте несколько триггерных спелов, разумеется они регистрируются эквивалентными событиями с разными условиями
дак супероптимизатор объединяет их события в один триггер - где будет одна функция GetSpellAbilityId() и кучка ифоф?))
ну и соответственно с другими событиями...
если нет, то можно считать это предложением)
Van Damm #115 - 11 лет назад 0
Голосов: +0 / -0
Elf_Stratigo, нет офк
Van Damm добавил:
Пока оптимизатор только режет неиспользуемые функции, и всё.
YellowStar #116 - 11 лет назад 0
Голосов: +0 / -0
Мне это нужно было, чтобы восстановить возможности zInc частично, так скажем. Все равно неприятный. Надо исправлять (догадываюсь что лаг изза main и конфиг)
Sebra #117 - 11 лет назад 0
Голосов: +0 / -0
Elf_Stratigo:
у меня вопрос по оптимизатору - а является ли эта штука супер чудоштукой?))))
поясню немного:
допустим есть в карте несколько триггерных спелов, разумеется они регистрируются эквивалентными событиями с разными условиями
дак супероптимизатор объединяет их события в один триггер - где будет одна функция GetSpellAbilityId() и кучка ифоф?))
ну и соответственно с другими событиями...
если нет, то можно считать это предложением)
Такого делать нельзя!
Автор карты может явно использовать подобные системы (они есть), но оптимизатор не может.
Разные триггеры могут использовать по нескольку разных событий, разные функции - фильтры, на их хэндлы могут быть привязаны разные данные. Всего этого просто так не учесть.
narayan:
Мне это нужно было, чтобы восстановить возможности zInc частично, так скажем. Все равно неприятный. Надо исправлять (догадываюсь что лаг изза main и конфиг)
Э-это как???
Elf_Stratigo #118 - 11 лет назад 0
Голосов: +0 / -0
[quote=Sebra]Такого делать нельзя!
Автор карты может явно использовать подобные системы (они есть), но оптимизатор не может.
Разные триггеры могут использовать по нескольку разных событий, разные функции - фильтры, на их хэндлы могут быть привязаны разные данные. Всего этого просто так не учесть.[/quote]
я и не спрашивал про всё, а токо эквивалентные!!!
пример реализации:
А:
  1. Ищем блоки, содержащие CreateTrigger( ) и считаем вхождение функций регистрации событий, допустим TriggerRegisterAnyUnitEventBJ, без ограничения общности, EVENT_PLAYER_UNIT_SPELL_EFFECT
  2. Отсеиваем функции, единственные в своём классе, и содержащие сложные условия
  3. Для каждого оставшегося класса оставляем один триггер - диспетчер
  4. Для каждого диспетчера - действие - выбор по соответствующему условию
Пример:
[code]
до оптимизации
function Trig001_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A001'
endfunction
function Trig001_Actions takes nothing returns nothing
endfunction
function InitTrig001 takes nothing returns nothing
local trigger t = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( t, Condition( function Trig001_Conditions ) )
call TriggerAddAction( t, function Trig001_Actions )
set t=null
endfunction
function Trig002_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A002'
endfunction
function Trig002_Actions takes nothing returns nothing
endfunction
function InitTrig002 takes nothing returns nothing
local trigger t = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( t, Condition( function Trig002_Conditions ) )
call TriggerAddAction( t, function Trig002_Actions )
set t=null
endfunction
результат оптимизации
function TrigSuper_Actions takes nothing returns nothing
local integer Super = GetSpellAbilityId()
if Super=='A001' then
call Trig001_Actions(Super)
elseif Super=='A002'
call Trig002_Actions(Super)
endif
endfunction
function InitTrigSuper takes nothing returns nothing
local trigger t = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddAction( t, function TrigSuper_Actions )
set t=null
endfunction[/code]
  1. 2 функции эквивалентной структуры InitTrig001 и InitTrig002
  2. нечего отсеивать...
  3. результат InitTrigSuper
  4. результат TrigSuper_Actions
И главное - критерии сравнения можно также передать в функцию, заменив соответственно вызовы "условной" функции переменной
Б:
Можно также сделать "явный" приказ оптимизатору - типо эта функция - должна относится к блоку "заклинания"; нечто вроде:
void OnSpell() #spell(<код заклинания>)
{
}
тогда эта функция при оптимизации будет зарегистрирована в соответствующем диспетчере
<код заклинания>==цифирка или глобалка типа инт
Каждая карта имеет в себе обычно несколько триггерных заклинаний, которые могут входить в разные системы(library) - поэтому чтобы джассеру самому оптимизировать вызовы функции, необходимо вручную избавляться от ООП, или работать с результатом трансляции vJASS компилятора...
Я бы сам сделал вариант Б, но я ассемблер немного плоховато знаю, чтобы подписать ...
ScorpioT1000 #119 - 11 лет назад 0
Голосов: +0 / -0
это "непросто"
Sebra #120 - 11 лет назад 0
Голосов: +0 / -0
Весьма мягко ещё сказано.
Для подобной оптимизации существуют наработки. Их автор должен применять сознательно.
Попытки оптимизатора сделать это автоматически будут натыкаться на 1000 мелочей типа сохранения или определения хэндла триггера, пересекающихся условий, неоднократно применяемых функций и т.д.
Хочешь сделать сам - пытайся.
Elf_Stratigo #121 - 11 лет назад 0
Голосов: +0 / -0
bb:я могу попробовать сделать это в паскале, если это переведут в ассемблер, то сё ок
разумеется буду делать вариант Б :Р
adic3x #122 - 11 лет назад 0
Голосов: +0 / -0
[quote]я могу попробовать сделать это в паскале[/quote]
сказанного достаточно
подобная оптимизация делаться небудет ввиду потенциально опасности возниконовения ошибок
Nekit1234007 #123 - 11 лет назад 0
Голосов: +0 / -0
bb:Обновил до .15, смотрю About...
adic3x #124 - 11 лет назад 0
Голосов: +0 / -0
адик забыл надпись поправить)))
сделаем сейчас
DragonSpirit #125 - 11 лет назад 0
Голосов: +0 / -0
ADOLF, и сделай (с) через © ))
Van Damm #126 - 11 лет назад 0
Голосов: +0 / -0
Обновил до .15, смотрю About...
fixed
ZeToX2007 #127 - 11 лет назад 0
Голосов: +0 / -0
Сделать бы перехват не только обычных функций но и vJass (структур в основном)
Van Damm #128 - 11 лет назад 0
Голосов: +0 / -0
Сделать бы перехват не только обычных функций но и vJass (структур в основном)
и в чём проблема это сделать сейчас?
Nekit1234007 #129 - 11 лет назад 0
Голосов: +0 / -0
жасс (0.A.2.5) и адик (1.4.1.1[h]6[/h]) хелперы опять не стакаются :]
При тупо (без изменений) пересохранении карты Fiziks0.6.w3x вылетает:
2 комментария удалено
Van Damm #132 - 11 лет назад 0
Голосов: +0 / -0
Nekit1234007, сейчас посмотрю
Diaboliko #133 - 11 лет назад 0
Голосов: +0 / -0
Мне не особо это нужно, но кто создал цджасс???(Русския или не русские?)
BK.Jugg #134 - 11 лет назад 0
Голосов: +0 / -0
[b]Diaboliko[/b], украинцы)
adic3x #135 - 11 лет назад 0
Голосов: +0 / -0
Nekit1234007, ты скинул карту ван дамму? если нет - то мне для отладки нужен материал, а именно исходный код
Diaboliko, в первом посте написана история создания программы
NCrashed #136 - 11 лет назад 0
Голосов: +0 / -0
Обновите сайт, а то там еще висит версия 15, а уже 16 вышла.
Van Damm #137 - 11 лет назад 0
Голосов: +0 / -0
ADOLF, вопрос с некитом уже решен. Парсер снова тупит на
function ...
   globals
      ...
   endglobals
   ...
endfunction
NCrashed #138 - 11 лет назад 0
Голосов: +0 / -0
В шестой версии физики такого не должно быть, помню, что фиксил. Вообще нужно добавить варны при компиляции на такую конструкцию.
NCrashed добавил:
Почему при такой конструкции парсер все равно выпиливает часть кода:
define Module = true

...
#if Module then


#endif 
...
NCrashed добавил:
Версия парсера 16. Выпиливается даже при такой конструкции
define Module = true

...
#if Module then

#else
	DoNothing()
#endif 
...
Chester #139 - 11 лет назад 0
Голосов: +0 / -0
SOS!
if a == "\"{}
"\" пытается склеивать след строку! Что делать?
adic3x #140 - 11 лет назад 0
Голосов: +0 / -0
NCrashed, зен ненужен
Van_Damm, скажите прямо - что фиксить?
ADOLF добавил:
if a == "\"{}
"\" пытается склеивать след строку! Что делать?
пытаться как то понять, что \" - а кавычка внутри строки?
Chester #141 - 11 лет назад 0
Голосов: +0 / -0
пытаться как то понять, что \" - а кавычка внутри строки?
ADOLF, не понял вопроса. Объясни как мне сровнять строки с символом \ ?
Нужно для функции экранирования путей иконок
adic3x #142 - 11 лет назад 0
Голосов: +0 / -0
Нужно для функции экранирования путей иконок
символ \ должен указіваться как \\ смотри любой рабочий код и как в нем указанны пути к ресурсам
Chester #143 - 11 лет назад 0
Голосов: +0 / -0
а что, не будет работать если я в указании пути напишу ekran("ReplaceableTextures\CommandButtons\BTNHolyBolt.blp") а она мне уже возвратит "ReplaceableTextures\\CommandButtons\\BTNHolyBolt.blp" ? Для меня удобней так, чем вручную добавлять по \ к каждой.
Так всеже, как можно сравнить этот символ?
Chester добавил:
думаю решение в
//! nocjass
adic3x #144 - 11 лет назад 0
Голосов: +0 / -0
а что, не будет работать если я в указании пути напишу ekran("ReplaceableTextures\CommandButtons\BTNHolyBolt.blp")
небудет
думаю решение в
! nocjass
думаю решение в
! подключить мозг
ADOLF добавил:
сЖасс к этому отношения не имеет
NCrashed #145 - 11 лет назад 0
Голосов: +0 / -0
Ну тогда, ошибку пусть выдает, а не просто втихую вырезает код =)
NCrashed добавил:
Мда и не мешает сделать систему варнов, чтобы быдлокод не плодился.
Sebra #146 - 11 лет назад 0
Голосов: +0 / -0
Chester:
ekran("ReplaceableTextures\CommandButtons\BTNHolyBolt.blp")
Попробуй вывести эту строку, набранную в джассе...
А потом попробуй её же, но с удвоенными '\'.
Просто этот символ в строке - спецсимвол. Читай правила работы со строками.
Elf_Stratigo #147 - 11 лет назад 0
Голосов: +0 / -0
[quote]\adichelper\AHupdate.exe
Win32:Malware-gen
Вирус/Червь[/quote]
D:
NETRAT #148 - 11 лет назад 0
Голосов: +0 / -0
у меня
обнаружено: троянская программа Trojan-Downloader.Win32.Genome.tkp URL: cjass.xgm.ru/files/cJassSetup.exe//stream//data0008//PE_Patch.UP...
обнаружено: троянская программа Trojan-Downloader.Win32.Genome.tkp Файл: cJassSetup\$INSTDIR\AdicHelper\AHupdate.exe//PE_Patch.UPX//UPX
адик зачем ты вишмастера постишь? =)
Van Damm #149 - 11 лет назад 0
Голосов: +0 / -0
бред и паранойя
adic3x #150 - 11 лет назад 0
Голосов: +0 / -0
это маразм конченых антивирусов - считать любое .ехе, которое загружает через инет другое .ехе - вирусом
ADOLF добавил:
хотя что бы хомячки не визжали надо это как то порезать
ADOLF добавил:
анивей там чистый си, если бы я писал виря то там бы был асм и что то нетривиальное
NETRAT #151 - 11 лет назад 0
Голосов: +0 / -0
ну так загружай не exe а _xe или архив
NETRAT добавил:
sfmpq.dll и horus.dll upx сожмите
а SQLite будет эффективнее файл-дб?
Chester #152 - 11 лет назад 0
Голосов: +0 / -0
[code]enum {array}[/code]
Можно ли это назвать багом?
Van Damm #153 - 11 лет назад 0
Голосов: +0 / -0
Можно ли это назвать багом?
Это можно назвать идиотизмом.
Chester #154 - 11 лет назад 0
Голосов: +0 / -0
[quote]Это можно назвать идиотизмом.[/quote]
Идиотизм то идиотизмом, но это парсит. Думаю что такого не должно быть.
Van Damm #155 - 11 лет назад 0
Голосов: +0 / -0
Chester,
Думаю что такого не должно быть.
lolwut? ты сам придумал использовать ключевые слова как идентификаторы?
NCrashed #156 - 11 лет назад 0
Голосов: +0 / -0
Если вот так написать (опечатка), то парсер зависнет:
	defain {
		privat msg(t) = BJDebugMsg(t)
	}
Van Damm #157 - 11 лет назад 0
Голосов: +0 / -0
NCrashed, =(
пока защиты от всякого рода описок маловато
ScorpioT1000 #158 - 11 лет назад 0
Голосов: +0 / -0
потомучто асм) :P
adic3x #159 - 11 лет назад 0
Голосов: +0 / -0
потомучто асм)
потому что я обрабатываю код как есть, побайтово
ScorpioT1000 #160 - 11 лет назад 0
Голосов: +0 / -0
молодец) любой нормальный кто пишет парсер вставит синтакс чекер(хотябы на то, что он же парсит) а не будет фаталить, я уж не знаю что там у вас на асм)
adic3x #161 - 11 лет назад 0
Голосов: +0 / -0
я впилю синтаксис чекер, когда у меня будет полный или более менее полный синтаксис языка
Sebra #162 - 11 лет назад 0
Голосов: +0 / -0
Это?
Или что ты хочешь, и в какой форме?
Если не найдём, то для тебя сделаем. :)
ScorpioT1000 #163 - 11 лет назад 0
Голосов: +0 / -0
что ты имеешь ввиду?
adic3x #164 - 11 лет назад 0
Голосов: +0 / -0
нет, мне удобнее свой сделать) т.е. оно уже во многих случаях выдает норм ерроры
Sebra #165 - 11 лет назад 0
Голосов: +0 / -0
Так может тебе помочь? Ты в каком виде делаешь?
adic3x #166 - 11 лет назад 0
Голосов: +0 / -0
Так может тебе помочь?
спасибо, но сначала глянь мой сорц) т.е. мне это легче самому будет сделать
ADOLF добавил:
Ты в каком виде делаешь?
словами это не описать
Sebra #167 - 11 лет назад 0
Голосов: +0 / -0
Что ж ты думаешь, я в него не глядел?
Зря ты всё в асме делаешь.
Van Damm #168 - 11 лет назад 0
Голосов: +0 / -0
Sebra, по-другому не будет.
Sebra #169 - 11 лет назад 0
Голосов: +0 / -0
Вероятно да.
Хотя Адольф кое что всё таки во внешние файлы вынес.
Я имею в виду библиотеку ptintf.
Или может ему легче было бы строить программу просто глядя на формальное описание синтаксиса.
Ну да ладно. Нет так нет.
adic3x #170 - 11 лет назад 0
Голосов: +0 / -0
Я имею в виду библиотеку ptintf.
я венес во внешний файл разметку, там немного не то
Chester #171 - 11 лет назад 0
Голосов: +0 / -0
ADOLF, а что enum считает только до 10? (0-9)
ScorpioT1000 #172 - 11 лет назад 0
Голосов: +0 / -0
с чего бы ?
Chester #173 - 11 лет назад 0
Голосов: +0 / -0
После 10-го перечисления, все остальные выдает 1
Chester добавил:
хоть с именным хоть без него
Van Damm #174 - 11 лет назад 0
Голосов: +0 / -0
После 10-го перечисления, все остальные выдает 1
хаха, неужели баг каунтера вылез и тут? xD
Chester #175 - 11 лет назад 0
Голосов: +0 / -0
cJass последней версии
adic3x #176 - 11 лет назад 0
Голосов: +0 / -0
гляну..., но не сегодня)
bee #177 - 11 лет назад 0
Голосов: +0 / -0
люди! вот я скачал, установил, и уже все должно работать в JNGP, т.е. запускать от старого ярлыка без изменений?
DragonSpirit #178 - 11 лет назад 0
Голосов: +0 / -0
Bee, да,только добавиться новый пункт cJass(со своими подпунктами)
bee #179 - 11 лет назад 0
Голосов: +0 / -0
DragonSpirit, угу, уже пользуюсь.
язык то сложный вроде, это же C++ только на языке WC3?
еще пару вопросов: я смотрел примеры, сначала fireball. открыл, сохранил и при проверке JNGP жаловался на строки где было записанно func
т.е. например
TimerStart(t_main, SPELL_PERIOD, true, func onTimer)
я изменил все "func" на "function" а он опять выдает ошибки! =\
4 комментария удалено
Chester #184 - 11 лет назад 0
Голосов: +0 / -0
Посмотри есть ли инкул либы cj_types.j вот такая строка должна быть:
[b]include[/b] "cj_types.j"
Помоему, в ранних версиях [b]cJass[/b]a в либе cj_types.j было профайнино слово func = [b]function[/b], а в новой версии нету, ибо примеры спелов под старый [b]cJass[/b]. Или мб не та либа?
Если я прав, то нужно задефить слово func а также вроде ret
Хилка:
[quote]
[b]define[/b] {
func = [b]function[/b]
ret = [b]return[/b]
}
[/quote]
Это сообщение удалено
Sebra #186 - 11 лет назад 0
Голосов: +0 / -0
По мне уж лучше такое в тексте заменить. По месту.
3-4 пропущенные иногда буквы сильно не помогут.
bee #187 - 11 лет назад 0
Голосов: +0 / -0
у меня пара вопросов:
» 1
function <название функции> takes <аргументы> returns <аргументы> {
...

call blablabla(blablabla)
call blablabla(blabla)

...
}
тоже самое что
function <название функции> takes <аргументы> returns <аргументы>
...

call blablabla(blablabla)
call blablabla(blabla)

...
endfunction
?
» 2
define {
blablabla=blabla
}
тоже самое что
define
 blablabla=blabla
enddefine
?
Bee добавил:
» 3
я могу писать вот так:
local unit u=null
unit d=null
т.е соеденять local записи и не локал записи. тоже самое с "call"
в одной функции / библиотеки
Nekit1234007 #188 - 11 лет назад 0
Голосов: +0 / -0
  1. хз но вроде нет
  2. да
  3. смотря где пишеш
кури [url=http://cjass.xgm.ru/manual-ru]мануал[/url]
NCrashed #189 - 11 лет назад 0
Голосов: +0 / -0
  1. нет, такая гремучая смесь =), лучше что то одно
  2. да
  3. да, только в функциях
Van Damm #190 - 11 лет назад 0
Голосов: +0 / -0
Bee, хоспади, какой получится говнокод... Читай руководство, там всё написано на русском
Fakov #191 - 11 лет назад 0
Голосов: +0 / -0
Вообщем ошибка такая
Стоит 1.24 вар и последний JNGP.
(Ну про прерикания антивира на AdicHelper.exe я уж не буду говорить)
Суть в том, что при сохранении ранее созданных карт в джипеге, вылазит эта сотня одинаковых ерроров. Что делать ума не приложу, помогайте((
Van Damm #192 - 11 лет назад 0
Голосов: +0 / -0
Судя по ошибкам, у тебя не стоит 1.24, т.к. ругается именно на hashtable
Fakov #193 - 11 лет назад 0
Голосов: +0 / -0
нет, стоит. JNGP лежит в папке с варом 1.24.
Единственное что может быть - попутаны exeшники. Где в JNGP указывать пути к экзешникам которые использовать? 0о
Van Damm #194 - 11 лет назад 0
Голосов: +0 / -0
В реестре. HKCU/Software/Grimoire/ там увидишь, какой ключ
Chester #195 - 11 лет назад 0
Голосов: +0 / -0
[b]Fakov[/b], HKEY_CURRENT_USER\Software\Blizzard Entertainment смотреть пути к файлам тут. Можно еще удалить папочку гримора, но вряд ли это поможет. А то что папочка лежит в папке вара 24, это генпаку ничего не говорит.
Fakov #196 - 11 лет назад 0
Голосов: +0 / -0
HKEY_CURRENT_USER\Software\Blizzard Entertainment
В папках Вар и ВЕ нет пути к ехешнику ВЕ.
ЗЫ: глянул версию открываемого джипегом редактора -действительно 1.21 в нем остался. А в директории Вара редактор 1.24. Надо как то связать джипег с этим ехешником. Как??? где путь к нему указать в джипеге? через реестр?
bee #197 - 11 лет назад 0
Голосов: +0 / -0
Van_Damm, Nekit1234007: курил уже. я потихоньку вникаю
Hellfim #198 - 11 лет назад 0
Голосов: +0 / -0
Fakov #199 - 11 лет назад 0
Голосов: +0 / -0
Hellfim, у меня все такое же, только еще есть InsallPathX строчка) это никак не влияет =\
Hellfim #200 - 11 лет назад 0
Голосов: +0 / -0
Fakov #201 - 11 лет назад 0
Голосов: +0 / -0
Hellfim, то. там я уже исправлял. Сейчас там путь к папке JNGP указан....
Это сообщение удалено
bee #203 - 11 лет назад 0
Голосов: +0 / -0
на хайве скачал способность посмотреть. открыл а там использован cJass. =)
там такой код:

//! zinc
    library booleanexpr
    {
    public boolexpr BOOLEXPR_TRUE;
    public boolexpr BOOLEXPR_FALSE;
    
        function returnTrue() -> boolean{return true;}
        
        function returnFalse() -> boolean{return false;}
        
        function onInit()
        {
            BOOLEXPR_TRUE=Condition(function returnTrue);
            BOOLEXPR_FALSE=Condition(function returnFalse);
        }
    
    }
//! endzinc

буржуи палят наш сайт? или адик выставил прогу за пределами XGM?
Bee добавил:
там еще код без call & local
DragonSpirit #204 - 11 лет назад 0
Голосов: +0 / -0
Адик выставил за границу XGM
ну и векс со своим zinc`ом
ScorpioT1000 #205 - 11 лет назад 0
Голосов: +0 / -0
хм не вижу тут cjass )
bee #206 - 11 лет назад 0
Голосов: +0 / -0
ScorpioT1000 мб я чето не понимаю, но разве в обычном Jass'e можно было писать вот так:
function lol takes nothing returns nothing {

}
O_O че он красным выделился???
Bee добавил:
вместо end*
ScorpioT1000 #207 - 11 лет назад 0
Голосов: +0 / -0
а векс такого не делал? ну значит очередной говнокодерский пример, как никогда (!) нельзя делать
Fakov #208 - 11 лет назад 0
Голосов: +0 / -0
Что это за ошибка и как ее лечить????
Она возникает при попытке загрузить JNGP, который по сути обращается к WE версии 1.24(в папку ...\JNGP\bin\ вставил ехешник WE версии 1.24, заменив тем самым старый ехе файл от 1.21 версии.)
bee #209 - 11 лет назад 0
Голосов: +0 / -0
[b]Fakov[/b], переустанови wc3 и JNGP =) хотя можно обойтись только вторым. кстати у тебя пиратка?
Fakov #210 - 11 лет назад 0
Голосов: +0 / -0
кстати у тебя пиратка?
Вар - хз, не помню ща уже, диск где то потерялся, сам вар на NoCD поставлен... JNGP надо наверно 5a скачать, тк ребилд 5д не помог
ZeToX2007 #211 - 11 лет назад 0
Голосов: +0 / -0
ScorpioT1000:
векс такого не делал? ну значит очередной говнокодерский пример, как никогда (!) нельзя делать
Смесь jass и cjass. O_O неее... это ещё как-то норм... хотел выложить кое что, но не у всех нервы железные, поэтому не буду
NCrashed #212 - 11 лет назад 0
Голосов: +0 / -0
Дайте нож в руки ребенку, то он обязательно кого-нибудь зарежет и сам пострадает. Вы меньше экспериментируйте с скрещиванием cjass и jass, потому что это проявляет вас не с лучшей стороны xD
или проводите свои опыты в темных подвалах
NCrashed добавил:
Профиксите загрузку обновлений, мой антивирь уже 2 недели зуб точит на адик хелпера. Не удобно же каждый раз вырубать хомячка.
Hellfim #213 - 11 лет назад 0
Голосов: +0 / -0
ScorpioT1000, правильно, это ZinC. Кстати, вам не кажется, что в названии "ZinC" заложена бесконечная рекурсия? Т.к. ZinC - Zinc is not C = (ZinC is not C) is not C и т.д.
ScorpioT1000 #214 - 11 лет назад 0
Голосов: +0 / -0
Hellfim, ты о чем? Я не знаю что это такое и мне не надо уже ниче от векса :) все что может jass уже можно предоставлять как ты хочешь с пом. cjass :)
Уродский код это когда ты юзаешь не по полной cjass, а суешь туда всякие function и прочюю убогость, тоесть таких "программистов" нельзя воспринимать всерьез..
ну я понимаю можно юзать endlibrary и прочие "большие" структуры по старому синтаксису
Van Damm #215 - 11 лет назад 0
Голосов: +0 / -0
Прошу воздержаться от обсуждения вексовского уг в этой теме.
Ranger21 #216 - 11 лет назад 0
Голосов: +0 / -0
А если проект был написан сначала на обычном jasse, но потом человек открыл для себя cjass, не переписывать же ему код под cjass ? ;p
Хотя я уже переписал пару эвентов
кстати void InitTrig_BlaBla () {
}
Айнит таким образом работает спокойно?
Nekit1234007 #217 - 11 лет назад 0
Голосов: +0 / -0
[quote=Ranger21]кстати void InitTrig_BlaBla () {
}
Айнит таким образом работает спокойно?[/quote]
Поч нет?
Chester #218 - 11 лет назад 0
Голосов: +0 / -0
Nekit1234007:
Поч нет?
По тому что функция может быть в библиотеке, и перед инит будет её название добавлено.
Nekit1234007 #219 - 11 лет назад 0
Голосов: +0 / -0
[b]Chester[/b], офк, если private или public.
ScorpioT1000 #220 - 11 лет назад 0
Голосов: +0 / -0
А если проект был написан сначала на обычном jasse, но потом человек открыл для себя cjass, не переписывать же ему код под cjass ? ;p
Ну мое мнение - если либа уже написана - ее не трогать. А если будешь править и вставлять что-то из cjass - переписать полностью под новый синтаксис.
Sebra #221 - 11 лет назад 0
Голосов: +0 / -0
Bee, и всем остальным, кто вдруг ещё не понял:
//! zinc
....
//! endzinc
Это не cJass, это Zinc - новая игрушка Вексориана.
adic3x #222 - 11 лет назад 0
Голосов: +0 / -0
что нового в 1.4.1.20
добавленна возможность передачи макроаргументов в подключаемый инструкцией include файл
зачем это надо? например я хочу подключить библиотеку, содержашую какой либо спелл. но для этого мне надо как минимум указать ИД спелла
выглядит это так
include "my file.j" {
    SPELL_ID = 'A128'
}
теперь в самом файле должно содержаться следующее
library MySpell32 {

    #define private SPELL_ID = 'A032'

    #sysinit // !!!

    // ....
}
фактически #sysinit будет заменен на то, что мы указали и блоке include (и добавлен setdef)
во первых, такой подход дает возможность обращаться к private макросам, а во вторых более логичен и понятен синтаксически
Sebra #223 - 11 лет назад 0
Голосов: +0 / -0
Документация всё ещё 1.4.0.2
Van_Damm, спишь?
YellowStar #224 - 11 лет назад 0
Голосов: +0 / -0
Добавить команду удалятора функции.
delete InitGlobals
просто столкнулся с проблемой. когда в карту поставил пустой близард.ж (сделал инжект конфига и маина на свои лад). После стал выдавать отсутствие функции в скрипте. Пришлось две функции превращать в дамми через дефаин что есть муторно.
Van Damm #225 - 11 лет назад 0
Голосов: +0 / -0
narayan, бред пишете, товарищ.
ScorpioT1000 #226 - 11 лет назад 0
Голосов: +0 / -0
вот что не помешало бы, так это внедрение своих функций в main, config итп, т.е. можеть чтото типа
ololo1() { }
ololo2() { }
mainstart
  ololo1()
endmainstart

mainend
  ololo2()
endmainend

// или

mainstart {
  ololo1()
}

mainend {
  ololo2()
}
==>
function main takes nothing returns nothing
  ololo1()
  // standart main code
  ololo2()
endfunction
Van Damm #227 - 11 лет назад 0
Голосов: +0 / -0
у вжасса есть
//! inject main
//! inject config
...
//! endinject
ScorpioT1000 #228 - 11 лет назад 0
Голосов: +0 / -0
я догадывался :)
ZeToX2007 #229 - 11 лет назад 0
Голосов: +0 / -0
Можно было перехватить InitBlizard к премеру, с помощью макросов.
ZeToX2007 добавил:
А как насчёт inline функций в cJass ?.
или все-же такая констркция (int a = 5, a = GetX(), a++. a) была бы очень удобна, не пойму, почему не хотите её вводить О_о.
Van Damm #230 - 11 лет назад 0
Голосов: +0 / -0
почему не хотите её вводить
Потому что гладиолус. Спорить в данном случае бесполезно.
ZeToX2007 #231 - 11 лет назад 0
Голосов: +0 / -0
txt2:а может, к примеру int a[100], чтобы cJass сразу определял, что это массив, чтобы не писать array ?
YellowStar #232 - 11 лет назад 0
Голосов: +0 / -0
I.
Идейно хотелось бы нечто вроде.
Код:
location u,x,z,m
null -> u,x,z,m
Что трансформируеться в
local location u
local location x
local location z
local location m
set u = null
set x = null
set z = null
set m = null
II.
Также как вариант сокращения действия for
int x = 11
for(20>x>10){x++}
Что благополучно транскодиться в
local integer x = 11
loop
exitwhen (x>20) or (x<10)
set x = x + 1
endloop
Ranger21 #233 - 11 лет назад 0
Голосов: +0 / -0
насчёт перечисления однотипных локалок через запятую это конечно было бы гуд:)
Но может и не особо надо
ScorpioT1000 #234 - 11 лет назад 0
Голосов: +0 / -0
txt2:~ZeToX2007, есть просто [], как в си
ScorpioT1000 добавил:
насчёт перечисления однотипных локалок через запятую это конечно было бы гуд:)
это уже есть O_O
ScorpioT1000 добавил:
narayan, бред какойто
Van Damm #235 - 11 лет назад 0
Голосов: +0 / -0
narayan, оба предложения бредовы.
Sebra #236 - 11 лет назад 0
Голосов: +0 / -0
Я, конечно, понимаю, что Адольф делает, что хочет, и чего нет у Векса, но...
Вот Векс объявил, что параметры по умолчанию в vJass планируются через слово defaults.
А мне хочется через равно:
unit LinkedUnit(integer tag1=GetHandleId(GetExpiredTimer()), integer tag2=0){
    return GetStoredUnit(Hash,tag1,tag2)
}
ScorpioT1000 #237 - 11 лет назад 0
Голосов: +0 / -0
перегрузи несколько функций
Зевс #238 - 11 лет назад 0
Голосов: +0 / -0
txt2:""
int tempI=3
float array tempR[tempI]
""
Wrong [size] definition
agentex #239 - 11 лет назад 0
Голосов: +0 / -0
ну обычно компили требуют константу в качестве размера для масива.. тут по логике сделано также
Зевс #240 - 11 лет назад 0
Голосов: +0 / -0
txt2:""
constant int maxV=1
constant int tempI=3
float array tempR[tempI]
tempR[maxV]=.123 Expected a name
""
ScorpioT1000 #241 - 11 лет назад 0
Голосов: +0 / -0
txt2:""
#define maxV = 1
#define tempI = 3
float array tempR[tempI]
tempR[maxV] = 0.123
""
ScorpioT1000 добавил:
юзай дифайны вместо констант там, где это возможно. они увеличивают быстродействие
Зевс #242 - 11 лет назад 0
Голосов: +0 / -0
сделал инклуд cj_types. Выводит слледующее:
define
{ 
int=integer
bool=boolean
void=nothing
float=real
}
Critical error: Unclosed block.
Зевс добавил:
зы: при этом сторонних функций нет... то что инклудил до этого - закоментил - ошибка не пропадает.
ScorpioT1000 #243 - 11 лет назад 0
Голосов: +0 / -0
а версия та ? там гдето писали что какаято старая версия не обновляется с апдейтером. перепроверь всё
Зевс #244 - 11 лет назад 0
Голосов: +0 / -0
v 1.4.1.5
хз... теперь когда в карту инклудишь кастомный j файл (даже если в нем только один коммент и #guard filename) выводит подобную ошибку.
Зевс добавил:
зы: трололо... любая карта с любым инклудом ругается на Critical error: Unclosed block Oo
Nekit1234007 #245 - 11 лет назад 0
Голосов: +0 / -0
bb:Как ты инклюдиш?
Зевс #246 - 11 лет назад 0
Голосов: +0 / -0
txt2:""
define {
aa = 0x00
ab = 0x01
ac = 0x02
az = 0x03
}
float array b[az]
b[aa] =0.
b[ab] =0.
b[ac] =0.
Все тот же Expected a name - что ему не хватает теперь?

__Зевс добавил:__
~Nekit1234007:
> Как ты инклюдиш?
include "c_a.j" файл в папке lib.
""
Nekit1234007 #247 - 11 лет назад 0
Голосов: +0 / -0
Правильно, какого типа твои b? Транслятор ведь не экстрасенс. О_О
[size=1][i]Nekit1234007 добавил:[/i][/size]
[code]b[aa] =0.
b[ab] =0.
b[ac] =0.[/code]
Надо писать внутри функций, для присвоения.
Зевс #248 - 11 лет назад 0
Голосов: +0 / -0
txt2:> Правильно, какого типа твои b?
float array b[az]
Зевс добавил:
хз... сейчас вроде сохранил
YellowStar #249 - 11 лет назад 0
Голосов: +0 / -0
define={

maybe? 0.o
ScorpioT1000 #250 - 11 лет назад 0
Голосов: +0 / -0
narayan, нет.
ScorpioT1000 добавил:
Зевс, юзай лучше отдельную директорию с картой и всеми .j файлами, так "профессиональней"
ScorpioT1000 добавил:
хз... сейчас вроде сохранил
т.е. норм стало?
Van Damm #251 - 11 лет назад 0
Голосов: +0 / -0
Зевс, обновись с нестабильной ветки
Зевс #252 - 11 лет назад 0
Голосов: +0 / -0
т.е. норм стало?
да... создал новый файл и скопировал содержимое старого... хз почему так, но ругаться перестал.
ScorpioT1000 #253 - 11 лет назад 0
Голосов: +0 / -0

скорп поясняет

кодировка.. я адику уже напоминал. кодировка должна быть "UTF-8 in ASCII", тоесть все инг знаки - ascii, все русские в utf8->ascii
это есть в notepad++
ScorpioT1000 добавил:
тоесть вполне возможно, что какойто русский символ в неверной кодировке принялся программой как открытие блока ("{")
ScorpioT1000 добавил:
p.s. эта инфа уже проверялась. возможно, у Зевса не тот случай, но эту инфу надо знать
YellowStar #254 - 11 лет назад 0
Голосов: +0 / -0
txt2:cJass added:
Адресовано to Adolf
Остальные: "Ваше мнение интересно этим людям" => []
  1. Ну как вариант у меня появилась идея к твоему import'еру. Почему бы ему не интегрировать в карту свой собственный common.j при помощи такой функции
include "myFile.j" RUS
где ну include и в Африке инклад, далее файл. А после сладкая фича (Для переводчиков триггеров вообще прет шииикарна) добавляет по Locale ID.
  1. Сделать матпарсер в оптимайзере к примеру
function MyImbaMathFormula takes real r,real x returns real
return 2*r*x*5
endfunction
Что собственно оптимизируеться как
function MyImbaMathFormula takes real r,real x returns real
return r*x*10
endfunction
  1. Ну это самая бредовая идея что была за сегодня у меня XD. В общем она упростит некие подсчеты (только с цифрами).
Пример: x=2z+5y
Конвертируемая версия: set x =(2*z)+(5*y)
  1. Гыгы это не все идеи моего запала ^_^. 2 оптимизатор наверняка пойдет классно такая фича.
constant function Modulo takes integer a,integer b returns nothing
return a-(a/b)*b
endfunction
Ну соотвественно так как приставка констант(то и функция не меняеться XD)
Конвертиться в
define Modulo(a,b) = ##a##-(##a##/##b##)*##b##
(## - вокруг добавил ну как бы так проще.)
А далее по принципе дефанов (ну как бы свапиться позже текстмагросов,но до дефайнов)
P.S to all боюсь что астматик начинает задыхаться от количества кода =(((((.
ScorpioT1000 #255 - 11 лет назад 0
Голосов: +0 / -0
  1. скорей всего для перевода кода лучше юзать то, что я придумал) чтобы при изменении одного .j не менять и другие .j для других языков. т.е. проще задифайнить L(eng,rus) = rus
  1. вроде в разработке
  1. бред
  1. ты первый раз увидел язык программирования ? есть такое понятие как inline ф-ции, я думаю лучше развивать это направление
Зевс #256 - 11 лет назад 0
Голосов: +0 / -0
if i==0 {
 i=b+z
} else {1
}
краш... в результате карта автоматом канула в лету и если бы это не был тест, то было бы обидно... втфк
Nekit1234007 #257 - 11 лет назад 0
Голосов: +0 / -0
[code]else {1
}[/code]Что за бред?
Зевс #258 - 11 лет назад 0
Голосов: +0 / -0
если бы это не был тест
Зевс добавил:
Суть в том, что краш в сджас ремовит карту...
Nekit1234007 #259 - 11 лет назад 0
Голосов: +0 / -0
[b]Зевс[/b], быть такого не может О_О. У меня пару раз крашилось, но карта оставалось.
Athas #260 - 11 лет назад 0
Голосов: +0 / -0
bb:Парочка имхо бредовых идей:
  1. Сделать двухмерные массивы. Зачем надо? Чтобы координаты записывались удобней. Ибо создавать по 2 массива x и y малость не удобно. О_о
  2. Добавить оператор break (кто не знает то это "вывалиться из цикла" (т.е. забить на цикл и выполнять действия дальше)). Зачем надо? Допустим в цикле идёт проверка на значение такой-то переменной и при определённом значении нам нужно пропустить цикл и пойти дальше, но в Джассе функции выхода из цикла нету (вроде D:) и будет тратиться время (хоть и оооооооооооооооооооочень мало) на завершение цикла.
Ranger21 #261 - 11 лет назад 0
Голосов: +0 / -0
bb:Выход из цикла:
exitwhen i<5
exitwhen boolearrr==false
Можно ставить куда угодно в цикл и это обычная джассовая команда
Nekit1234007 #262 - 11 лет назад 0
Голосов: +0 / -0
[b]break[/b] уже какбэ есть.
Van Damm #263 - 11 лет назад 0
Голосов: +0 / -0
#define break = exitwhen true
Зевс, быть такого не может чтобы удаляло О_О
ScorpioT1000 #264 - 11 лет назад 0
Голосов: +0 / -0
адикхэлпер вроде гибнет в своем "потоке" (точнее процессе) и не задевает другие программы. просто векс ругнется на непропарсенный синтаксис
Зевс #265 - 11 лет назад 0
Голосов: +0 / -0
Van_Damm:
Зевс, быть такого не может чтобы удаляло О_О
... зато происходит ...периодически делаю резервные копии =(
Кстати на макрос все-равно ругается...
FREEZE_ball #266 - 11 лет назад 0
Голосов: +0 / -0
В названии функции внутри дефайна необходимо использовать две переменные, которые он даёт.
[code]
...
define <AnyName>(Name1, Name2) = {
void WTF_Func##Name1##_Func##Name2() {}
}
AnyName(1, 1)
AnyName(1, 2)
AnyName(1, 3)
AnyName(2, 1)
AnyName(2, 2)
AnyName(2, 3)
[/code]
Пример бессмысленный; каким образом отделить Name1?
Я пробовал:
[code]
##Name1##
#Name1#
^Name1^
%Name1%
##Name1#
$Name1$
##Name1
[/code]
Всё не получается, как надо правильно?
[size=1][i]FREEZE_ball добавил:[/i][/size]
Это же относится и к переменным.
Van Damm #267 - 11 лет назад 0
Голосов: +0 / -0
FREEZE_ball, никак О_О
define AnyName(Name1, Name2) = {
    void WTF_Func ## Name1 ## _Func ## Name2() {}
}
// Здесь ## — оператор конкатенации (склеивания)
FREEZE_ball #268 - 11 лет назад 0
Голосов: +0 / -0
[b]Van Damm[/b], противоречишь сам себе, либо я не понял предыдущего поста о_О
Вот конкретная моя задача:
[code]
define <Wave>(Num) = {
private int array Wave*Num*_1_ToPos[9]
...
}
Wave(1)
Wave(2)
...
[/code]
Это легко делалось через текстмакро, но последняя версия AH (CJ) совершенно (абсолютно) не дружит с ними. [off]Не надо указывать поставить здесь Num в конце, слишком большой кусок кода придется переписывть >_<[/off] .
Van Damm #269 - 11 лет назад 0
Голосов: +0 / -0
FREEZE_ball, ты вопрос ставь по-человечески, да? И мануал почитать неплохо было бы для начала.
FREEZE_ball #270 - 11 лет назад 0
Голосов: +0 / -0
[b]Van Damm[/b], омг, не понимаешь, чтоли?
'##' ставится, когда аргумент дефайна - последнее слово в названии функции/переменной
[code]
SomeFunc##'SomeArg'
[/code]
а мне нужно узнать, как ставить аргумент в середине названия функции/переменной
[code]
SomeFunc'SomeArg'SomeFunc
[/code]
Van Damm #271 - 11 лет назад 0
Голосов: +0 / -0
FREEZE_ball, я даже не знаю, на каком языке тебе объяснить, если ты не понимаешь по-русски. ## просто склеивает то, что слева от неё с тем, что справа. И нет абсолютно никакой разницы, где стоят агрументы.
Зевс #272 - 11 лет назад 0
Голосов: +0 / -0
define lolexample(someArg) = {void LetsPew##someArg## () {}}
lolexample(Pew)
//Получаем
function LetsPewPew takes nothing returns nothing
//Аналогично с переменными
ScorpioT1000 #273 - 11 лет назад 0
Голосов: +0 / -0
а у меня кстати с этим все отлично)
ScorpioT1000 добавил:
я склеивал коечто и похлеще..
FREEZE_ball #274 - 11 лет назад 0
Голосов: +0 / -0
[b]Van Damm[/b], ок, идём в лоб:
Код
[code]define <Wave>(num) = {
private int array Wave##Num##_1_ToPos[9]
...
}
Wave(1)[/code]
при попытке компиляции выдаёт
[IMG]http://s46.radikal.ru/i111/0911/66/05f7df05796d.jpg[/IMG]
Ещё одна твоя попытка объяснить то, что и так понятно?
[size=1][i]FREEZE_ball добавил:[/i][/size]
Я к тому, что прочтение [url=http://xgm.ru/forum/showpost.php?p=702902&postcount=255]вот этого поста[/url] должно было объяснить, что я пробовал так.
ShadoW DaemoN #275 - 11 лет назад 0
Голосов: +0 / -0
txt2:~FREEZE_ball, ну так все понятно - дефайн содержит в себе свое название. Измени хотя бы регистр букв в слове wave:
define <Wave>(num) = {
    private int array wave##Num##_1_ToPos[9]
}

Wave(1)
...и КиборгХелпер это скомпилит.
Van Damm #276 - 11 лет назад 0
Голосов: +0 / -0
И все дружно написали num в аргументах с маленькой буквы, а Num внутри дефайна — c большой.
Это сообщение удалено
ScorpioT1000 #278 - 11 лет назад 0
Голосов: +0 / -0
ScorpioT1000, 26.11.2009 5:37:01:
у меня нет проверки кода в кампании и если это адик, я его убью
ScorpioT1000, 5:38:18:
всегда мечтал закрыть пятилетний проект изза адольфа)
FREEZE_ball #279 - 11 лет назад 0
Голосов: +0 / -0
[b]ShadoW DaemoN[/b], помогло, спасибо =)
[b]Van Damm[/b], оно и без этого было, это мой личный глюк...
Это сообщение удалено
karaliti #281 - 11 лет назад 0
Голосов: +0 / -0
если с undef присвоить значение то парсер не распознает ошибку.
мелочь но можно изрядно поковеркать код )
Зевс #282 - 11 лет назад 0
Голосов: +0 / -0
 method CSmthd takes nothing returns nothing
  //Действия
 endmethod
на cjass ругает...
void method CSmthd () { } // и прочие перестановки воида не помогают
XimikS #283 - 11 лет назад