[Вопрос] Структуры
|
|
[SeKtOR] | Дата: Четверг, 08 Ноября 2012, 15:53:07 | Сообщение # 1 |
Группа: Проверенные
Сообщений: 1143
Награды: 0
Репутация: 1168
Блокировки:
| Code scope Test initializer Trigger_Init { struct test string array s integer index = 0 method add takes string str returns nothing s[index] = str index++ endmethod method out takes nothign returns nothing local integer i = 0 loop exitwhen i > index BJDebugMsg(s[i]) i++ endloop endmethod endstruct private void Trigger_Actions() { local test s = test.create() s.add("1") s.add("2") s.add("3") s.out() s.destroy() } private void Trigger_Init() { .... } } В итоге на выходе мы получаем, что структура не создана(allocate) и он не может уничтожить нулевую структуру, хотя 1,2,3 выводится P.S. Код писался для примера
Сообщение отредактировал [SeKtOR] - Четверг, 08 Ноября 2012, 15:54:14 |
|
|
|
SirNikolas | Дата: Четверг, 08 Ноября 2012, 16:45:35 | Сообщение # 2 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Умоляю, никогда не мешай JASS2 и cJASS. Выбери что-нибудь одно.
А по существу - в структурах ввиду их "оригинальной" реализации можно располагать только массивы фиксированного размера.
|
|
|
|
[SeKtOR] | Дата: Четверг, 08 Ноября 2012, 21:06:33 | Сообщение # 3 |
Группа: Проверенные
Сообщений: 1143
Награды: 0
Репутация: 1168
Блокировки:
| Ты имееш ввиду loop из jass2?
Сообщение отредактировал [SeKtOR] - Четверг, 08 Ноября 2012, 21:07:35 |
|
|
|
Ty3uK | Дата: Четверг, 08 Ноября 2012, 21:47:05 | Сообщение # 4 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| [SeKtOR], фигурные скобки и loop...endloop, method...endmethod Вместе это делает код нечитабельным и местами глупым. То есть либо юзать возможности cJASS'a на всю катушку, либо не юзать вообще
|
|
|
|
lawson | Дата: Четверг, 08 Ноября 2012, 22:15:41 | Сообщение # 5 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (Ty3uK) [SeKtOR], фигурные скобки и loop...endloop, method...endmethod Вместе это делает код нечитабельным и местами глупым. То есть либо юзать возможности cJASS'a на всю катушку, либо не юзать вообще Хэээ хе хе, аж прослезился, ни один я такой был.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
[SeKtOR] | Дата: Пятница, 09 Ноября 2012, 13:10:16 | Сообщение # 6 |
Группа: Проверенные
Сообщений: 1143
Награды: 0
Репутация: 1168
Блокировки:
| Code method add(string str) { ... } выдаёт еррор :3
Сообщение отредактировал [SeKtOR] - Пятница, 09 Ноября 2012, 13:10:28 |
|
|
|
Ty3uK | Дата: Пятница, 09 Ноября 2012, 14:04:15 | Сообщение # 7 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| возвращаемый тип укажи. и в cJASS не надо писать ключевые слова. <возвращаемый тип> имя функции (аргументы) { }
|
|
|
|
[SeKtOR] | Дата: Пятница, 09 Ноября 2012, 21:40:54 | Сообщение # 8 |
Группа: Проверенные
Сообщений: 1143
Награды: 0
Репутация: 1168
Блокировки:
| Code scope Test initializer Trigger_Init { struct test string array s[8192] integer index = 0 method add takes string str returns nothing s[index] = str index++ endmethod method out takes nothing returns nothing local integer i = 0 loop exitwhen i > this.index BJDebugMsg(this.s[i]) i++ endloop endmethod endstruct
private void Trigger_Actions() { local test s = test.create() s.add("1") s.add("2") s.add("3") s.out() s.destroy() }
private void Trigger_Init() { set gg_trg___________________________u = CreateTrigger( ) call TriggerRegisterPlayerChatEvent( gg_trg___________________________u, Player(0), "-parse", true ) call TriggerAddAction( gg_trg___________________________u, function Trigger_Actions) } }
В итоге результат тотже
Добавлено (09 Ноября 2012, 21:40:54) --------------------------------------------- Походу придёться забить на структуры P.S. Уже близок к освоению do и whilenot
Сообщение отредактировал [SeKtOR] - Пятница, 09 Ноября 2012, 21:41:01 |
|
|
|
Ty3uK | Дата: Пятница, 09 Ноября 2012, 22:56:18 | Сообщение # 9 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Code scope Test initializer Init { #include "cj_types_priv.j" struct test { string array s[8192]; integer index = 0; void add(string str) { s[index++] = str; } void out() { int i = 0; while (i < .index) { BJDebugMsg(s[i++]); } } }
private void Init() { test s = test.create(); s.add("1"); s.add("2"); s.add("3"); s.out(); s.destroy(); } }
Сообщение отредактировал Ty3uK - Пятница, 09 Ноября 2012, 22:57:42 |
|
|
|
[SeKtOR] | Дата: Суббота, 10 Ноября 2012, 12:46:12 | Сообщение # 10 |
Группа: Проверенные
Сообщений: 1143
Награды: 0
Репутация: 1168
Блокировки:
|
|
|
|
|
SirNikolas | Дата: Суббота, 10 Ноября 2012, 12:56:21 | Сообщение # 11 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (Ty3uK) string array s[8192]; Извините, сколько таких массивов влезет в размерность массивов war3? Вы либо указывайте размер структуры (struct test[100000]), либо уменьшайте размер s (string array s[20]).Добавлено (10 Ноября 2012, 12:56:21) --------------------------------------------- BTW, никто не хочет сделать структуру приватной?
|
|
|
|
Ty3uK | Дата: Суббота, 10 Ноября 2012, 13:08:59 | Сообщение # 12 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| SirNikolas, пардон, не обратил внимания. Затупил Добавлено (10 Ноября 2012, 13:08:59) ---------------------------------------------
Quote (SirNikolas) BTW, никто не хочет сделать структуру приватной? это же тест
|
|
|
|
[SeKtOR] | Дата: Суббота, 10 Ноября 2012, 14:15:16 | Сообщение # 13 |
Группа: Проверенные
Сообщений: 1143
Награды: 0
Репутация: 1168
Блокировки:
| Quote (SirNikolas) Извините, сколько таких массивов влезет в размерность массивов war3? Вы либо указывайте размер структуры (struct test[100000]), либо уменьшайте размер s (string array s[20]). Добавлено (10 Ноября 2012, 12:56:21) --------------------------------------------- BTW, никто не хочет сделать структуру приватной? Вопрос #1: FTW помогло, но почему именно 100000 и почему надо было уменьшить, если структуру не делать массивной до 20? Вопрос #2: Создать структуру на все триггеры(естественно без destoy в конце висящий на всю игру) possible?
Сообщение отредактировал [SeKtOR] - Суббота, 10 Ноября 2012, 14:16:54 |
|
|
|
Ty3uK | Дата: Суббота, 10 Ноября 2012, 14:48:57 | Сообщение # 14 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| массив структур и массив в структуре трактуются парсером по-разному. Насчет второго вопроса - да, можно
|
|
|
|
lawson | Дата: Суббота, 10 Ноября 2012, 15:42:50 | Сообщение # 15 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| ну ка я че нибудь тоже напишу: Code scope Scope initializer init prviate struct Test static public string s
public method Add takes string s returns nothing this.s += s + " " endmethod
endstruct function init takes nothing returns nothing local Test t = Test.create() t.Add("HELLO WORLD") t.Add("BURN WORLD") DebugMSG(t.s) t.destroy() endfunction
endscope
Добавлено (10 Ноября 2012, 15:42:50) --------------------------------------------- няшна? Как давно же не писал на вжассе.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Суббота, 10 Ноября 2012, 15:45:10 |
|
|
|
Ty3uK | Дата: Суббота, 10 Ноября 2012, 16:38:28 | Сообщение # 16 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| у нас к статичным можно через this обращаться? что-то новое Ошибку не выдал D: Видимо, это я туплю.
Добавлено (10 Ноября 2012, 16:38:28) --------------------------------------------- да и даже если так можно было бы, к чему ее делать публичной? можно будет изменить и без метода. лучше тогда ридонли
Сообщение отредактировал Ty3uK - Суббота, 10 Ноября 2012, 17:40:33 |
|
|
|
SirNikolas | Дата: Суббота, 10 Ноября 2012, 17:38:11 | Сообщение # 17 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (lawson) няшна? Как давно же не писал на вжассе. Еще как няшно! Зачем извращаться, когда результата можно добиться средствами JASS2.
|
|
|
|
Ty3uK | Дата: Суббота, 10 Ноября 2012, 17:40:54 | Сообщение # 18 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| SirNikolas, WIN!
|
|
|
|
SirNikolas | Дата: Суббота, 10 Ноября 2012, 18:19:33 | Сообщение # 19 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (Ty3uK) у нас к статичным можно через this обращаться? что-то новое Ошибку не выдал D: Видимо, это я туплю.
Вообще-то нет. Это ошибка JASSHelper'а, что он не выдает здесь ошибку. Надо обращаться через thistype, либо вообще без всего.
НО в данном случае статическая переменная не нужна. Здесь нужен член класса переменная структуры.
|
|
|
|
Ty3uK | Дата: Суббота, 10 Ноября 2012, 18:42:23 | Сообщение # 20 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| SirNikolas, иммитировать стек?
|
|
|
|
SirNikolas | Дата: Суббота, 10 Ноября 2012, 18:54:39 | Сообщение # 21 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Code library MessageQueue { struct MessageQueue { readonly string msg = "";
void Add(string s) { msg += s + " "; }
void Out(real time) { DisplayTimedTextToPlayer(GetLocalPlayer(), .0, .0, time, msg); msg = ""; } }; }
callback onInit() { //test MessageQueue q = MessageQueue.create(); BJDebugMsg("started"); q.Add("1"); q.Add("2"); q.Add("3"); BJDebugMsg("filled"); q.Out(10.); BJDebugMsg("printed"); q.destroy(); } output: started filled 1 2 3 printed
|
|
|
|
lawson | Дата: Суббота, 10 Ноября 2012, 19:32:07 | Сообщение # 22 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (Ty3uK) можно будет изменить и без метода. лучше тогда ридонли ааа да у меня просто все в голове уже перепуталось и жасс и ява юнити с С. Обычно через this обращаюсь чтобы не путались лок переменные в классе и глоб.
Добавлено (10 Ноября 2012, 19:14:57) --------------------------------------------- Хмм кстати да зачем я ее статичной сделал, если все равно структуру через create создаю, а это уже результат недосыпания.
Добавлено (10 Ноября 2012, 19:32:07) --------------------------------------------- Шустрый вопрос не в тему: Ник, что значит на С "ref", я вот пишу клиент сервер на яве, и не могу наработку перевести с С т к не понимаю что это значит "ref". К примеру вот public static bool FileBrowser( ref string location, ref Vector2 directoryScroll, ref Vector2 fileScroll ) я так понял это просто обозначение изменяемых переменных в функции?
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Суббота, 10 Ноября 2012, 19:36:19 |
|
|
|
SirNikolas | Дата: Суббота, 10 Ноября 2012, 19:35:31 | Сообщение # 23 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Это не на C, это на C#. ref - передача аргумента по ссылке (кэп). Например:Code void abc(int i) { i = 10; } void def(ref int i) { i = 10; }
void test() { int i = 5; abc(i); Console.Write(i);//output: 5 def(i); Console.Write(i);//output: 10 }
|
|
|
|
lawson | Дата: Суббота, 10 Ноября 2012, 19:37:27 | Сообщение # 24 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| SirNikolas, ааааа ок, ясно теперь.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
SirNikolas | Дата: Суббота, 10 Ноября 2012, 19:45:59 | Сообщение # 25 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (wiki) Передача параметра
Передача параметра возможна по значению и по ссылке. Иногда также используют выражение «передача параметра по адресу». Ниже приведён пример, иллюстрирующий различия этих способов.
Передача параметра по значению
Передача параметра по значению означает что вызывающая функция копирует в память, доступную вызываемой, (обычно стек) непосредственное значение. Изменение копии переменной, соответственно, оригинал не затрагивает.
Передача параметра по адресу
Если необходимо именно изменить переменную из внешней, по отношению к вызываемой функции, области видимости, можно копировать адрес переменной, подлежащей изменению. Соответственно при вызове функции g(&x) приходится использовать операцию взятия адреса. Эта техническая деталь отвлекает внимание программиста от логики прикладной программы, однако в случаях невозможности передачи по ссылке может оказаться единственным решением.
Можно заметить, что передача параметра по адресу является частным случаем передачи по значению: передаваемым значением является адрес, по которому можно найти другое значение — значение переменной x.
Передача параметра по ссылке
Передача параметра по ссылке означает что копируется не само значение, а адрес исходной переменной (как в случае передачи параметра по адресу), однако синтаксис используется такой, чтобы программисту не приходилось использовать операцию разыменования и он мог иметь дело непосредственно со значением, хранящимся по этому адресу (как в случае передачи параметра по значению).
Передача по ссылке позволяет избежать копирования всей информации, описывающей состояние объекта (а это может быть существенно больше чем sizeof(int)) и является необходимой для конструктора копирования.
Если функция возвращает значение по ссылке (например, в виде «return *this;»), то её вызов можно использовать слева от оператора присваивания (смотри также L-выражение).
В случае если передача по ссылке используется именно как средство увеличения быстродействия, но изменение параметра нежелательно, можно использовать передачу по ссылке константного объекта.
Таким образом можно ожидать, что примерная программа напечатает (если закоментировать ошибочную строку) «0010 022 233 333».
Некоторые языки (или их диалекты) не поддерживают передачу по ссылке, некоторые наоборот - передают параметры исключительно по ссылке, что порождает риск непреднамеренного изменения контекста вызывающей функции. Я не помню, возможно ли в C# получить адреса, но первая и третья передача там есть.
|
|
|
|