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

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

Закрытая тема
 
Maelstraz

offline
Опыт: 127
Активность:
Капризы JassHelper'а : syntax error в цикле
Пытаясь сохранить карту, я вижу, как ДжассХелпер выдаёт, что у меня синтаксическая ошибка в коде :

Код:
globals
integer array udg_MBNum
integer udg_Players = 0
integer udg_i = 0
unit array udg_Hero

trigger gg_trg_Main = null
endglobals

function InitMain takes nothing returns nothing
 local integer num = 0
 local real randX
 local real randY
 local real randA
 set udg_i=1
  loop
   exitwhen udg_i>12
    if GetPlayerSlotState(Player(udg_i-1))==PLAYER_SLOT_STATE_PLAYING then
     set num = num+1
     set udg_MBNum[num] = udg_i
     set randX = GetRandomReal(-2500.0, 2500.0)
     set randY = GetRandomReal(-2500.0, 2500.0)
     set randA = GetRandomReal(0.0, 360.0)
     set udg_Hero[udg_i] = CreateUnit(Player(udg_i-1), 'h000', randX, randY, randA)
    endif
   set udg_i = udg_i+1 
  endloop
 set udg_Players = num
 endfunction


Ему не нравится моё "exitwhen = 13"

Что я упускаю ?

PS : Это весь код карты на данный момент.
PPS : Ногами сильно не пинать, я только начал изучение jass
Старый 12.10.2009, 18:12
Nekit1234007

offline
Опыт: 11,916
Активность:
» А так?
Код:
globals
integer array MBNum
integer Players = 0
integer i = 0
unit array Hero

trigger gg_trg_Main = null
endglobals

function InitMain takes nothing returns nothing
 local integer num = 0
 local real randX
 local real randY
 local real randA
 set i=1
  loop
   exitwhen i>12
    if GetPlayerSlotState(Player(i-1))==PLAYER_SLOT_STATE_PLAYING then
     set num = num+1
     set MBNum[num] = i
     set randX = GetRandomReal(-2500.0, 2500.0)
     set randY = GetRandomReal(-2500.0, 2500.0)
     set randA = GetRandomReal(0.0, 360.0)
     set Hero[i] = CreateUnit(Player(i-1), 'h000', randX, randY, randA)
    endif
   set i = i+1 
  endloop
 set Players = num
 endfunction
Старый 12.10.2009, 18:19
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
// . . .
function InitMain takes nothing returns nothing
  local integer i = 0
  local integer num = 0
  loop
    if GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING then
      set udg_MBNum[num] = i
      set num = num + 1
      set udg_Hero[i] = CreateUnit(Player(i), 'h000', GetRandomReal(-2500.0, 2500.0), GetRandomReal(-2500.0, 2500.0), GetRandomReal(0.0, 360.0))
    endif
    set i = i + 1
    exitwhen i == 12
  endloop
  set udg_Players = num
endfunction
  1. Переменные не нужны, если значение используется 1 раз и сразу (поэтому randX, randY, randA убраны)
  2. Зачем начинать отсчет с 1 и вычитать из счетчика единицу в цикле? Проще нумеровать с нуля (так же и с массивами).
  3. exitwhen i == 13 нравится компилятору.
  4. Для циклов лучше использовать локальные переменные (во избежание коллизий).
Старый 12.10.2009, 18:22
Maelstraz

offline
Опыт: 127
Активность:
Магия : оба варианта не работают.

Пробую по-другому :

Код:
globals
integer array udg_MBNum
integer udg_Players = 0
unit array udg_Hero

trigger gg_trg_Main = null
endglobals

function TrigMainAction takes nothing returns nothing
  local integer i = 0
  local integer num = 0
  loop
    if GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING then
      set udg_MBNum[num] = i
      set num = num + 1
      set udg_Hero[i] = CreateUnit(Player(i), 'h000', GetRandomReal(-2500.0, 2500.0), GetRandomReal(-2500.0, 2500.0), GetRandomReal(0.0, 360.0))
    endif
    set i = i + 1
    exitwhen i == 12
  endloop
  set udg_Players = num
endfunction

//=======
//=Start=
//=======

function InitMain takes nothing returns nothing
 set gg_trg_Main = CreateTrigger ( )
 call TriggerAddAction (gg_trg_Main, function TrigMainAction)
endfunction


Теперь выдаётся ошибка "symbol массива multiply defined" (на массивы udg_MBNum и udg_Hero).
"Идентификатор массива определен несколько раз" ?
Старый 12.10.2009, 19:02
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
"symbol массива multiply defined" (на массивы udg_MBNum и udg_Hero).
Так может они у тебя уже в редакторе переменных созданы?
Старый 12.10.2009, 19:05
Maelstraz

offline
Опыт: 127
Активность:
Van Damm, исправил это недоразумение. Однако, при попытке запуска карты всё равно выдаётся ошибка. Хотя ДХ уже не капризничает.

Возможно ли, что проблема в версии варика ? (у меня 1.24.1)

Так, тест карты был успешно проведён при запуске карты в обычном редакторе, однако код банально не работает : не создаётся злополучный юнит. Попытка заменить h000 на hfoo, для чистоты эксперимента, успехом не увенчалась.

Отредактировано Maelstraz, 12.10.2009 в 20:49.
Старый 12.10.2009, 19:21
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Maelstraz, а ты уверен, что у тебя стоит галочка "Продолжается инициализация карты" ? =)
Старый 12.10.2009, 20:55
Nekit1234007

offline
Опыт: 11,916
Активность:
Maelstraz, А событие кто добавлять будет? о_О
Старый 12.10.2009, 22:20
Maelstraz

offline
Опыт: 127
Активность:
Попытка #3 :

(Код написан в единственном триггере Main)

Код:
globals
integer array udg_MBNum
integer udg_Players = 0
unit array udg_Hero

trigger gg_trg_Main
endglobals

function Trig_Main_Action takes nothing returns nothing
  local integer i = 0
  local integer num = 0
  loop
    if GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING then
      set udg_MBNum[num] = i
      set num = num + 1
      set udg_Hero[i] = CreateUnit(Player(i), 'h000', GetRandomReal(-2500.0, 2500.0), GetRandomReal(-2500.0, 2500.0), GetRandomReal(0.0, 360.0))
    endif
    set i = i + 1
    exitwhen i == 12
  endloop
  set udg_Players = num
endfunction

//=======
//=Start=
//=======

function InitTrig_Main takes nothing returns nothing
 set gg_trg_Main = CreateTrigger(  )
 call TriggerRegisterTimerEvent(gg_trg_Main, 0.01, false)
 call TriggerAddAction (gg_trg_Main, function Trig_Main_Action)
endfunction


Никто из проверяющих синтаксис не возмущается, но юниты по-прежнему не создаются.

Галочка "Продолжается инициализация карты" стоит.
После нажания на пунктик "Включён" ДХ выдаёт что триггер Мэйн задан несколько раз, так что сиё действие не нужно.

Отредактировано Maelstraz, 12.10.2009 в 23:20.
Старый 12.10.2009, 23:13
Nekit1234007

offline
Опыт: 11,916
Активность:
Код:
trigger gg_trg_Main

Это писать не надо, этот триггер создаётся автоматически при сохраниении.
Старый 12.10.2009, 23:22
Maelstraz

offline
Опыт: 127
Активность:
Nekit1234007, если этого не писать, проверщик синтаксиса говорит о необъявленной переменной gg_trg_Main в строке "set gg_trg_Main = CreateTrigger( )". Как быть ?
Старый 12.10.2009, 23:44
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
Как быть ?
library MBtest initializer Init

  globals
    integer array MBNum
    integer Players = 0
    unit array Hero
  endglobals

  private function Actions takes nothing returns nothing
    local integer i = 0
    local player p = Player(0)
    loop
      if (GetPlayerSlotState(p) == PLAYER_SLOT_STATE_PLAYING) then
        set MBNum[Players] = i
        set Players = Players + 1
        set Hero[i] = CreateUnit(p, 'h000', GetRandomReal(-2500.0, 2500.0), GetRandomReal(-2500.0, 2500.0), GetRandomReal(0.0, 360.0))
      endif
      exitwhen i >= 11
      set i = i + 1
      set p = Player(i)
    endloop
  endfunction

  //=======
  //=Start=
  //=======
  private function Init takes nothing returns nothing
    local trigger Main = CreateTrigger()
    call TriggerRegisterTimerEvent(Main, 0.01, false)
    call TriggerAddAction(Main, function Actions)
  endfunction

endlibrary
Старый 12.10.2009, 23:55
Maelstraz

offline
Опыт: 127
Активность:
Van Damm, библиотека вообще тьму-тьмущую самых разнообразных ошибок выдаёт...

Подавляющее их большинство - "расположение (переменной) вне функции".
Старый 13.10.2009, 00:07
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
Ну не знаю, у меня сохраняется без ошибок. Код, что я дал, нужно вставить вместо всего кода триггера.
И проверь, чтобы не стояла галка "Disable vJass syntax" в меню "JassHelper"
Старый 13.10.2009, 00:14
Maelstraz

offline
Опыт: 127
Активность:
Цитата:
Сообщение от Van Damm
вместо

Да-да, именно так и я сделал.

Упомянутая галка не стоит, проверено.

Тест карты положительных результатов не дал, юнитов по-прежнему нет.

М, а дело не может быть в unit id для CreateUnit ? Тип этого параметра "integer", а я уверенно пишу там "string" ('h000', название юнита при Ctrl+D), по примеру некоторых пользователей, чьи посты уже читал перед началом своей бурной деятельности.
Старый 13.10.2009, 00:26
Garret
Недоброе творится
offline
Опыт: 3,893
Активность:
Код объектов - инт. Пробуй BJDebugMsg, это самое простое, что в твоей ситуации можно и нужно сделать.
Старый 13.10.2009, 00:39
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
'h000' это integer. Карта уже сохраняется?
Старый 13.10.2009, 02:13
Maelstraz

offline
Опыт: 127
Активность:
Van Damm, карта сохраняется.

Однако, Syntax Check продолжает ругаться, а код по-прежнему отказывается работать.

Garret, Debug Message не появляется.
Старый 13.10.2009, 09:10
Arty3ooo
...
offline
Опыт: 3,125
Активность:
function InitTrig_Main takes nothing returns nothing
Иногда нужно писать это без всяких initializer'ов, тк иначе триггер не будет работать. Аналогично с событиями таймер истек, кнопка нажата и тд.
private function Init takes nothing returns nothing
local trigger Main = CreateTrigger()
call TriggerRegisterTimerEvent(Main, 0.01, false)
call TriggerAddAction(Main, function Actions)
endfunction
а обнулить xD
Старый 13.10.2009, 09:19
Maelstraz

offline
Опыт: 127
Активность:
Elf_Stratigo, по заявкам :



Использован код, предложенный Van Damm.

Arty3ooo, ничего не понял.
Старый 13.10.2009, 09:34
Закрытая тема

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

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

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

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



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