Вверх ↑
Этот топик читают: Гость
Ответов: 258
Рейтинг: -27
#136: 2015-12-28 15:16:30 ЛС | профиль | цитата
Раз Вы такой добрый, появился еще один вопрос

Как писать в начало блока, а не в конец?

Например блок BLK_MAIN , как мне написать текст в самое начало этого блока а не в конец?
(Другими словами как выбрать позицию в которую писать. т.е мне нужно каждый раз выбирать блок BLK_MAIN и установить position в 0.)

Просто каждая новая функция должна быть выше предыдущей, а у меня получается наоборот.
карма: 0

0
Ответов: 4629
Рейтинг: 749
#137: 2015-12-28 15:36:56 ЛС | профиль | цитата
Можно добавлять не новый блок к существующему, а существующий блок к новому, потом существующий блок удалять, а имя нового подставлять в глобальную переменную на место старого. Но это требует дополнительных движений.
А какая необходимость в том, чтобы "каждая новая функция должна быть выше предыдущей"?

Можно объявить глобальный массив, в который записывать имена блоков.
Затем в конце генерации кода перебирать этот массив в обратном порядке, впечатывать каждый блок в основной код и затем блок удалять.
карма: 26

0
Ответов: 258
Рейтинг: -27
#138: 2015-12-28 17:12:52 ЛС | профиль | цитата

В общем это осталась единственная проблема, вот пакет с несколькими компонентами http://rghost.ru/private/8vcqYTSkN/d21c065b2c7dacb9a9a7c77f3d2c7df9 . Компонент который создает функцию не работает при вызове такого же компонента после его. (Получается функция в функции, а нужно что бы были две разные функции, и вызываемая функция должна быть выше той что вызывает )
Схема:

Add(MapInitialize,2953706,21,70)
{
link(onStart,5446059:doEvent,[])
}
Add(PrintTextToAllPlayers,9919158,462,70)
{
data_TextToPrint="Text1"
}
Add(PrintTextToAllPlayers,6480637,546,228)
{
data_TextToPrint="Text223"
link(data_TextToPrint,12214394:Var2,[(552,213)(468,213)])
}
Add(Hub,5446059,84,70)
{
link(onEvent1,9919158:doPrintToAll,[])
link(onEvent2,5840295:doCreate,[(144,83)(144,255)])
}
Add(StringVar,2880804,462,126)
{
data_TextToSave="NULLSTRINGXXX"
}
Add(CreateFunction,5840295,313,249)
{
data_FuncName="zxnnyysd"
link(onCreate,3159071:doEvent,[(358,255)(358,258)])
link(data_FuncName,12214394:Var1,[(319,194)])
}
Add(GetDataEx,12214394,462,189)
{
link(Data,2880804:var_GetSavedText,[])
}
Add(CreateFunction,7377658,572,395)
{
data_FuncName="avzxcv"
link(onCreate,7467959:doWork3,[(616,401)(616,317)(534,317)])
}
Add(HubEx,7467959,530,238)
{
Angle=3
link(onEvent,6480637:doPrintToAll,[(534,234)])
}
Add(Hub,3159071,371,252)
{
link(onEvent1,7467959:doWork2,[(458,258)(458,244)])
link(onEvent2,7377658:doCreate,[(479,265)(479,401)])
}
------------ Дoбавленo в 16.37:
Я так понял в кодогенераторе массив в который добавляется строка с помощью Add?

Нельзя как-то заменить на InsertAt( INT id ), добавить переменную с текущим ID, и добавить функции block.getcurid, block.setcurid, block.begin, block.end, block.begin которая установит ID в 0, block.end которая установит ID в count строк (Чтобы перейти в начало и конец текущего блока) ?

Жаль паскаль не знаю

Или какой там есть другой способ добавлять код в начала блока а не в конец?
карма: 0

0
Ответов: 4629
Рейтинг: 749
#139: 2015-12-28 17:38:29 ЛС | профиль | цитата
Перед вызовом event(onCreate) у тебя должен быть установлен текущим блок cur_tmp_func. А ты делаешь block.select(BLK_MAIN), пишешь туда println('function '+code(data_FuncName)+varid, ' takes nothing returns nothing'), а потом вызываешь event(onCreate). И что может записать следующий компонент в BLK_MAIN? Всё, что он запишет, будет находиться после function предыдущего компонента. Я не зря в примере показал, что событие вызывается перед активацией BLK_MAIN, и данные в него заносятся уже после отработки события. То-есть, когда ты вызываешь событие onCreate, ты ничего ещё не должен выводить в BLK_MAIN, так как туда может захотеть что-то написать другой компонент.
Повторяю: если есть общий блок, в который могут писать разные компоненты, значит данные в него заносить только после вызова всех событий. Для этого и создается временный блок, который копируется в главный только после отработки событий.
карма: 26

0
Ответов: 258
Рейтинг: -27
#140: 2015-12-28 22:00:20 ЛС | профиль | цитата
Все теперь точно понял) Сейчас проверю.


func doCreate(_data)
fvar(old, tmp_locals, tmp_func)

old = block.select(cur_tmp_func)

println('call '+code(data_FuncName)+varid, '( )')


// Ñîõðàíèòü ñòàðûå áëîêè ëîêàëîê è òåëà ôóíêöèè
tmp_locals = cur_tmp_locals
tmp_func = cur_tmp_func

// Ñîçäàòü íîâûå
cur_tmp_locals = block.reggen()
cur_tmp_func = block.reggen()

block.select(cur_tmp_locals)

println('function '+code(data_FuncName)+varid, ' takes nothing returns nothing')
varid = varid + 1

event(onCreate)

block.select(cur_tmp_func)

println('endfunction')
block.select(BLK_MAIN)
block.copyhere(cur_tmp_locals)
block.copyhere(cur_tmp_func)
block.delete(cur_tmp_locals)
block.delete(cur_tmp_func)


cur_tmp_locals = tmp_locals
cur_tmp_func = tmp_func
block.select(old)
end

Все теперь работает как и было задумано

Просто ошибся в коде, блоки создал и ничего туда не записал)))

------------ Дoбавленo в 21.24:
Netspirit, не получается создать модифицированный компонент Memory.

Если используется точка doValue он должен с помощью println добавить новую глобальную переменную в код, и каждый вызов Value возвращать ее название.
Иначе просто вернуть стандартное значение.

Это вообще реально сделать или нет? локальные перменные FTCG нельзя объявить за пределами функции из-за этого по моему возникла эта проблема

Есть ли решение этой проблемы?
карма: 0

0
Ответов: 4629
Рейтинг: 749
#141: 2015-12-29 11:40:04 ЛС | профиль | цитата
Cubone писал(а):
Есть ли решение этой проблемы?
Есть. "Добавлять новую глобальную переменную в код" нужно один раз в методе func Init(). А во всех остальных методах использовать/выдавать имя этой переменной.

Cubone писал(а):
локальные перменные FTCG нельзя объявить за пределами функции
Не очень понял, что имелось в виду, но оператор var() объявляет переменную, которая видима во всех методах данного компонента.
карма: 26

0
Ответов: 258
Рейтинг: -27
#142: 2015-12-29 13:43:12 ЛС | профиль | цитата
Я думал она у меня не работает, а в документации не написано где ее объявлять )
карма: 0

0
Ответов: 4629
Рейтинг: 749
#143: 2015-12-29 13:45:10 ЛС | профиль | цитата
Когда что-то не получается - смотри код других пакетов.
карма: 26

0
Ответов: 258
Рейтинг: -27
#144: 2015-12-29 13:52:41 ЛС | профиль | цитата
Так зачем создавать что-то без документации.

Это означает что тот кто написал кодогенератор FTCG делал его лично для себя. Бред же.
карма: 0

0
Ответов: 4629
Рейтинг: 749
#145: 2015-12-29 14:05:11 ЛС | профиль | цитата
А тому, кто создавал кодогенератор, кто справку напишет? Радуйся, что хоть такое есть. Никто никому ничего не должен.
Бери и пиши сам.
карма: 26

0
Ответов: 824
Рейтинг: 138
#146: 2015-12-29 16:44:48 ЛС | профиль | цитата
Где же эта "ракета" подевалась...?
Никто не находил?
Если кто найдет - пустите плз.
карма: 1

0
Ответов: 178
Рейтинг: 9
#147: 2015-12-29 16:55:23 ЛС | профиль | цитата
За эту беседу вы Netspitrit-у должны спасибо сказать.
карма: 0

0
Ответов: 258
Рейтинг: -27
#148: 2016-01-05 08:30:42 ЛС | профиль | цитата
Hart, Говорил уже


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

Пакет: https://dl.dropboxusercontent.com/u/280307663/Warcraft3_hiasm_packet.rar
Пример: http://pastebin.com/DuSWZaim


В компоненте с динамическими верхними точками проблема. При чтении точка Value с других компонентов выдает значение по умолчанию вместо того что возвращает функция func Value.

Почему и как исправить?
карма: 0

0
Ответов: 70
Рейтинг: 1
#149: 2023-11-24 10:05:28 ЛС | профиль | цитата
Всем доброго времени!

Разбираюсь с FTCG, и вот на какую не понятную вещь наткнулся....

Происходит это в пакете питон.

1) указываем в файле struct.hws
if (sys.gvarfind('struct_is_set') = -1) gvar (struct_is_set)
gvar(BLK_IMPORT,BLK_HEAD,BLK_GLOB,BLK_CLASS,BLK_OBJ,BLK_BODY,BLK_LABELS,BLK_FUNC,BLK_FUNCUP,BLK_NOTH,BLK_FOOTER,BLK_LOC,BLK_EVENTS,BLK_FUNCDW)
gvar (fn)
BLK_HEAD = "head"
BLK_IMPORT = "import"
BLK_GLOB = "globals"
BLK_CLASS = "class"
// BLK_OBJ = "objects" //Fso, Re, ...
BLK_BODY = "body"
// BLK_LABELS = "labels"
BLK_EVENTS = "events" // On...

BLK_FUNC = "functions"
BLK_FUNCUP = "functionsup"
BLK_NOTH = "Nothing"
BLK_FOOTER = "footer"
BLK_LOC = "locals"
BLK_FUNCDW = "functionsdw"

block.reg(BLK_HEAD)
block.reg(BLK_IMPORT)
block.reg(BLK_CLASS)
block.reg(BLK_GLOB)
block.reg(BLK_OBJ)
block.reg(BLK_FUNCUP)
block.reg(BLK_FUNC)
block.reg(BLK_FUNCDW)
block.reg(BLK_BODY)
block.reg(BLK_LOC)
block.reg(BLK_EVENTS)
block.reg(BLK_NOTH)
block.reg(BLK_FOOTER)
block.select(BLK_FOOTER)
println('# Created with HiAsm Studio '+code(sys.hi_version("%mj.%mn build %bl"))+ ' (http://www.hiasm.com)')
block.select(BLK_BODY)
end

блоки(секторы) для вставки сгенерированного кода.

2) Главный элемент кода hiEntriPoint.hws
include("import")
func doStart()
include("struct")
need_sys()
fvar(old, cname)

cname = "hi"+project_name()

old=block.select(BLK_FUNCUP)
block.inclvl()
println('# Functions')
println('def hi_input(self, prompt=f""):')
block.inclvl()
println('return input(prompt)')
println('')
block.declvl()
println('# BLK_FUNCUP')
block.select(old )

old=block.select(BLK_FUNC)
block.inclvl()
println('# BLK_FUNC')
block.select(old )

old = block.select(BLK_FUNCDW)
block.inclvl()
println('# BLK_FUNCDW')
block.select(BLK_FUNCDW )

old = block.select(BLK_BODY)
block.inclvl()
println('# Program body')
println('def main(self):')
block.inclvl()
println('# BLK_BODY')
//block.declvl()
event(onStart,'1')
if (isdef(AutoClose))
println('self.hi_input(u"Íàæìèòå êëàâèøó Enter äëÿ çàâåðøåíèÿ...")')
//println('self.hi_input(f"Press Enter to close...")')
end
block.select(BLK_BODY )
old = block.select(BLK_CLASS)
println('# Main class')
println('class ' && code(cname) && ':')
println('# BLK_CLASS')
//block.copyhere(BLK_FUNC)
block.select(BLK_CLASS )

old = block.select(BLK_HEAD)
println('#!/usr/bin/python')
println('# -*- coding: UTF-8 -*-')
println('#-----------------------------------------------------')
println('# ',code(project_name ()),'.py')
println('#-----------------------------------------------------')
println('# BLK_HEAD')
println('')
block.select(BLK_HEAD )

old = block.select(BLK_LOC)
println('########################################################################')
println('# Program body')
println('# BLK_LOC')
println('if __name__ == "__main__":')
block.inclvl()
println('run = ' && code(cname) && '()')
println('run.main()')
block.select(BLK_LOC )

old = block.select(BLK_IMPORT)
println('# imports')
println('# BLK_IMPORT')
block.select(BLK_IMPORT )

old = block.select(BLK_GLOB)
block.inclvl()
println('# Global vars')
println('# BLK_GLOB')
block.select(BLK_GLOB )

old = block.select(BLK_EVENTS)
println('# BLK_EVENTS')
block.select(BLK_EVENTS )

old = block.select(BLK_NOTH)
println('# BLK_NOTH')
block.select(BLK_NOTH )

old = block.select(BLK_FOOTER)
println('# BLK_FOOTER')
block.select(BLK_FOOTER )




end


Создаю заголовки у каждого блоки и выясняется, что код у некоторых заголовках находится с низу относительно заголовка а у некоторых блоков с верху, на картинке это видно
Снимок.JPG

Скажите это как-то фиксится ?

Редактировалось 1 раз(а), последний 2023-11-24 10:07:06
карма: 1

0
Ответов: 2237
Рейтинг: 676
#150: 2023-11-24 13:18:41 ЛС | профиль | цитата
Pavel, не приходилось пользоваться, а только поверхностно, но разве не должно быть одинаково:


old=block.select(BLK_FUNC) 
block.inclvl()
println('# BLK_FUNC')
block.select(old )


old = block.select(BLK_EVENTS)
println('# BLK_EVENTS')
block.select(BLK_EVENTS )
Справка писал(а):
inclvl ()
Увеличивает на 1 смещение печатаемого кода

карма: 11

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)