Сейчас 13:32:10 Четверг, 25 апреля, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » простейший вопрос по Jass - вылетает Memory Cannot Read (Я в Jass буквально вчера и уже пытаюсь писать функции...)
простейший вопрос по Jass - вылетает Memory Cannot Read
AnyOne697Дата: Пятница, 14 Января 2011, 00:46:55 | Сообщение # 1
2 уровень
Группа: Пользователи
Сообщений: 35
Награды: 0
Репутация: 9
Блокировки:
Здравствуйте, я в Jass пошёл буквально вчера и уже пытаюсь писать несложные функции.
Сам я программист, пишу на C/C++, немного C# на .Net (если с инетом)... В общем общие понятия ООП есть.
Паскаль очень не люблю... Слышал, что Jass очень похож на C - фулфло! Не похож совсем - даже близко не стоял. Куда более похож cJass (даже название говорит об этом, но есть там и свои проблемы - отсутствие классов как таковых)
Но... Редактору карт такие навороты не нужны...

Что-то расписался... :D Пойду к теме...

Code

function rmvHeroOnArray takes integer hero returns nothing
    local integer i
    local integer temp
    loop
       if(udg_AllHeroes[0] == hero) then //да... и кстати, откуда здесь нумерация идёт... всё забываю...
           set temp = i
       endif
       set i = i + 1
       exitwhen(i == 16)
    endloop
    set udg_AllHeroes[temp] = udg_AllHeroes[udg_AllHeroInteger - 1]
    set udg_AllHeroInteger = udg_AllHeroInteger - 1
endfunction

function createRndHeroForPlayerByNumber takes integer num, integer cmdNum returns nothing
     local integer rndTemp
     call SaveIntegerBJ( ( LoadIntegerBJ(0, 0, GetLastCreatedHashtableBJ()) - 1 ), 0, 0, GetLastCreatedHashtableBJ() )
     set rndTemp = GetRandomInt(1, udg_AllHeroInteger)
     call CreateNUnitsAtLoc( 1, udg_AllHeroes[rndTemp], ConvertedPlayer(num), GetPlayerStartLocationLoc(Player(cmdNum + 9)), bj_UNIT_FACING )
     call rmvHeroOnArray(udg_AllHeroes[rndTemp])
     call PanCameraToTimedLocForPlayer( GetOwningPlayer(GetLastCreatedUnit()), GetUnitLoc(GetLastCreatedUnit()), 2.00 )
endfunction

Это пара функций, грузящихся в начале...
Методом тыка выяснил, что не рабит CreateNUnitsArLoc(...); В чём проблема - не знаю... Карта запускается, но при вызове - валиться... Если закомментить его - ничего не работает :( , но, собственно, ничего и не вылетает :)

Вопрос естественен - в чём проблема? Думал сразу начать на cJass (он понравился, да и псевдоШаблонные классы можно делать by define... Да и include есть (только вот зачем он там huh )... Но он скачал странный Jass New Gen (инет), который уверенно твердил про несоответствие версий - побоялся писать долго и мучительно, чтобы потом париться с копи-пастом... Опять от темы отхожу...

В общем проблемы не нашёл (искал пару часов - не написал эссе), решил попросить помочь. Все переменные объявлены (иначе не запускался бы).

Заранее спасибо.

Добавлено (14-01-2011, 00:46)
---------------------------------------------

Quote

//да... и кстати, откуда здесь нумерация идёт... всё забываю...

В смысле в массивах... Ну это так... Чтобы не искать - спросить у знающего (ему то не сложно пару слов написать, имхо, а если сложно - пусть не пишет :))


Я у узнал, что у меня
Есть огромная семья:
Монитор, системный блок,
В сеть воткнул я проводок,
Windows - небо голубое...
Это всё моё - родное!
Без инета жить нельзя -
Наркоман наверно я!
 

ПиксДата: Пятница, 14 Января 2011, 00:59:26 | Сообщение # 2
3 уровень
Группа: Пользователи
Сообщений: 53
Награды: 0
Репутация: 4
Блокировки:
Есть одно предположение, вылетать будет если при вызове функции "createRndHeroForPlayerByNumber" в параметре "num" указать номер несуществующего игрока.

Добавлено (14-01-2011, 00:59)
---------------------------------------------
Нумерация идет с нуля


Без любви к своему делу создать что-то великое невозможно, а ради всего остального жить нет смысла (с) Сергей Орловский (глава компании Astrum Nival)
 

KartohaДата: Пятница, 14 Января 2011, 01:00:29 | Сообщение # 3
10 уровень
Группа: Ветераны
Сообщений: 2851
Награды: 1
Блокировки:
Quote (AnyOne697)
откуда здесь нумерация идёт... всё забываю...

С 0.
Quote (AnyOne697)
call SaveIntegerBJ( ( LoadIntegerBJ(0, 0, GetLastCreatedHashtableBJ()) - 1 ), 0, 0, GetLastCreatedHashtableBJ() )

-зачем нужно это действие?
Quote (AnyOne697)
ConvertedPlayer(num)

Локальная num не объявляется.
 

AjaccioДата: Пятница, 14 Января 2011, 01:02:32 | Сообщение # 4
7 уровень
Группа: Проверенные
Сообщений: 299
Награды: 1
Репутация: 239
Блокировки:
Кажется в вашем коде не была инициализирована переменная i. Вы пытаетесь сделать i = <ничего> + 1. Получаете закономерную ошибку.
Можете поставить local integer i = 0.


XOR EAX, EAX
MOV EAX, 00H ;; NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
 

ПиксДата: Пятница, 14 Января 2011, 01:17:34 | Сообщение # 5
3 уровень
Группа: Пользователи
Сообщений: 53
Награды: 0
Репутация: 4
Блокировки:
еще возможно, если udg_AllHeroes[rndTemp] не указана, тоесть функция ссылается на участок памяти, где должен лежать тип юнита, а там его нет, вследсвие чего это самая память не может быть прочитана. тоже и с номером игрока. попробуй упростить эту функцию. Задай эти параметры сначала как константы и посмотри. мб изза этого)

Добавлено (14-01-2011, 01:10)
---------------------------------------------
Kartoha, во первых: ты путаешь функцию с триггером) эта переменная запрашивается в эту функцию, ее объявлять не нужно.
во вторых: если бы было как ты говоришь, то функция бы просто не компилировалась.
Ajaccio, она по умолчанию содержит значение ноль.

Добавлено (14-01-2011, 01:17)
---------------------------------------------

Quote (Ajaccio)
Можете поставить local integer i = 0
в Jass это пишется так: set i = 0


Без любви к своему делу создать что-то великое невозможно, а ради всего остального жить нет смысла (с) Сергей Орловский (глава компании Astrum Nival)
 

AjaccioДата: Пятница, 14 Января 2011, 01:20:41 | Сообщение # 6
7 уровень
Группа: Проверенные
Сообщений: 299
Награды: 1
Репутация: 239
Блокировки:
Пикс, ничего она не содержит... Попробуйте создать и сразу вывести на экран - увидите пустоту, а не 0.
Но сейчас проверил, если даже не инициализировать, то ошибки не будет, просто текущий поток ушибется насмерть.

Добавлено (14-01-2011, 01:20)
---------------------------------------------

Quote
в Jass это пишется так: set i = 0

lol


XOR EAX, EAX
MOV EAX, 00H ;; NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
 

DreiiДата: Пятница, 14 Января 2011, 01:28:18 | Сообщение # 7
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
Quote (Пикс)
в Jass это пишется так: set i = 0

интегер можно сразу задать...

Добавлено (14-01-2011, 01:28)
---------------------------------------------

Quote (AnyOne697)
 call CreateNUnitsAtLoc( 1, udg_AllHeroes[rndTemp], ConvertedPlayer(num), GetPlayerStartLocationLoc(Player(cmdNum + 9)), bj_UNIT_FACING )

во 1 нету переменной num во вторых нету cmdNum
И своетую написать так local integer rndTemp=GetRandomInt(1, udg_AllHeroInteger)
и не используй call CreateNUnitsAtLoc, используй call CreateUnit(player id, integer unitid, real x, real y, real faceeUnit)
где х и у могут быть GetUnitX(юнит) GetUnitY(юнит) соответсвенно

Quote (AnyOne697)
    call SaveIntegerBJ( ( LoadIntegerBJ(0, 0, GetLastCreatedHashtableBJ()) - 1 ), 0, 0, GetLastCreatedHashtableBJ() )

Не знаю зачем тут это,но лучше не использовать БЖ пользуйся нативками call SaveInteger(table, missionKey, key, value)
GetLastCreatedHashtableBJ() лучше занести в переменную, и лучше прочитай вот это




Сообщение отредактировал Dreii - Пятница, 14 Января 2011, 01:30:12
 

ПиксДата: Пятница, 14 Января 2011, 01:38:50 | Сообщение # 8
3 уровень
Группа: Пользователи
Сообщений: 53
Награды: 0
Репутация: 4
Блокировки:
Quote (Dreii)
во 1 нету переменной num во вторых нету cmdNum
а вот это что?
Quote (AnyOne697)
takes integer num, integer cmdNum


Без любви к своему делу создать что-то великое невозможно, а ради всего остального жить нет смысла (с) Сергей Орловский (глава компании Astrum Nival)
 

AjaccioДата: Пятница, 14 Января 2011, 01:51:24 | Сообщение # 9
7 уровень
Группа: Проверенные
Сообщений: 299
Награды: 1
Репутация: 239
Блокировки:
В общем я бы посоветовал проверить игроков, возможно вы пытаетесь создать героя несуществующему игроку.
Также нужно инициализировать переменные, но это вряд ли причина ошибки как таковой.
Вообще надо смотреть как происходит вызов функции, для полноты картины.

Code
Player(cmdNum + 9))

Особенно вот это напрягает, наверное очень просто выйти за число допустимых игроков.


XOR EAX, EAX
MOV EAX, 00H ;; NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
 

CHLSNДата: Пятница, 14 Января 2011, 08:35:21 | Сообщение # 10
10 уровень
Группа: Проверенные
Сообщений: 1627
Награды: 0
Репутация: 132
Блокировки:
Quote (Ajaccio)
Особенно вот это напрягает, наверное очень просто выйти за число допустимых игроков.

Также очень просто можно написать в начале функции: if cmdNum > 15 return false else return true (естественно с переносом строк). И указать в заголовке функции returns boolean
Quote (AnyOne697)
ConvertedPlayer(num)

Используй Player() но в параметре integer надо брать на единицу меньше.




Я в контакте и на warcraft3ft.info.
Кто может сказать, почему **** дизайнер писал вместо "pt" "px" в CSS, благодаря чему нужно смотреть форум через лупу с Ctrl++?
 

[DUОS]Дата: Пятница, 14 Января 2011, 08:41:17 | Сообщение # 11
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
Code
function rmvHeroOnArray takes integer hero returns nothing
     local integer i = 0
     local integer temp
     loop
        exitwhen i > 11
        if udg_AllHeroes[i] == hero then //да... и кстати, откуда здесь нумерация идёт... всё забываю...
            set temp = i
        endif
        set i = i + 1
     endloop
     set udg_AllHeroes[temp] = udg_AllHeroes[udg_AllHeroInteger - 1]
     set udg_AllHeroInteger = udg_AllHeroInteger - 1
endfunction

function createRndHeroForPlayerByNumber takes integer num, integer cmdNum returns nothing
      local integer rndTemp = GetRandomInt(1,udg_AllHeroInteger)
      local unit u = CreateUnit(Player(num),udg_AllHeroes[rndTemp],GetPlayerStartLocationX(Player(cmdNum + 9)),GetPlayerStartLocationY(Player(cmdNum + 9)),0.)
     
      call SaveInteger(udg_H,0,0,LoadInteger(udg_H,0,0) - 1)

      call rmvHeroOnArray(udg_AllHeroes[rndTemp])

      if GetLocalPlayer() == GetOwningPlayer(u) then
          call PanCameraToTimed(GetWidgetX(u),GetWidgetY(u),2.)
      endif

      set u = null
endfunction


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)
 

CHLSNДата: Пятница, 14 Января 2011, 09:05:38 | Сообщение # 12
10 уровень
Группа: Проверенные
Сообщений: 1627
Награды: 0
Репутация: 132
Блокировки:
Ох, мой Бог... Программисты мля...

Code
function createRndHeroForPlayerByNumber takes player pl returns nothing
     local integer i = GetRandomInt( 1, udg_AllHeroInteger )
     local unit rndHero = udg_AllHeroes[i]
     local integer x = 0
     local unit u
//udg_hash = InitHashtableBJ() при инициализации
     call SaveInteger( udg_hash, 0, 0, LoadInteger( udg_hash, 0, 0 ) - 1 )
     //call CreateNUnitsAtLoc( 1, udg_AllHeroes[rndTemp], ConvertedPlayer(num), GetPlayerStartLocationLoc(Player(cmdNum + 9)), bj_UNIT_FACING )
     //Кто-то интересно так делает... Создает юнита для ИгрокХ, а помещает в стартовую локацию ИгрокХ+9 ???
     set u = CreateUnit( pl, GetUnitTypeId( rndHero ), GetStartLocationX(GetPlayerStartLocation(pl)), GetStartLocationY(GetPlayerStartLocation(pl)), 0 )
     set udg_AllHeroes[i] = udg_AllHeroes[udg_AllHeroInteger]
     set udg_AllHeroInteger = udg_AllHeroInteger - 1
     if GetLocalPlayer() == pl then
         // Use only local code (no net traffic) within this block to avoid desyncs.
         call PanCameraToTimed( GetUnitX(u), GetUnitY(u), 2 )
     endif
     set rndHero = null
     set pl = null
     set u = null
endfunction




Я в контакте и на warcraft3ft.info.
Кто может сказать, почему **** дизайнер писал вместо "pt" "px" в CSS, благодаря чему нужно смотреть форум через лупу с Ctrl++?


Сообщение отредактировал CHLSN - Пятница, 14 Января 2011, 09:17:52
 

AnyOne697Дата: Пятница, 14 Января 2011, 17:03:53 | Сообщение # 13
2 уровень
Группа: Пользователи
Сообщений: 35
Награды: 0
Репутация: 9
Блокировки:
Ой, вэй... Много букАф... Долго читать, долго думать как ответить... Ну ладно...

Quote (Пикс)
Есть одно предположение, вылетать будет если при вызове функции "createRndHeroForPlayerByNumber" в параметре "num" указать номер несуществующего игрока.

Да... Это связано с нулями... Хоть чем-то теперь jass похож на C - нумерация элементов в массивах начинается с нуля - единственное, что так раздражает в Си, но потом привыкаешь и считаешь это удобным... Здесь я этого не знал... Поэтому код очень багнутый... Но это ладно - исправил... Вроде... Ошибка есть всё равно... По идеологии Си массив должен указывать на ячейку памяти, а не на сам элемент, поэтому там был бы мусор, который вряд ли вызовет ошибку... Ну... У WarCraft тенденция - вылетать только с Memory Cannot Read at XXXXXX... В общем - похоже, что нет...

Code
call SaveIntegerBJ( ( LoadIntegerBJ(0, 0, GetLastCreatedHashtableBJ()) - 1 ), 0, 0, GetLastCreatedHashtableBJ() )

Долгая история - не знаю правильно или нет, но в триггерах, который GUI - крейчу одну единственную хеш-таблицу и юзаю одну единственную ячейку - чтобы испробовать её в действии... Все пишут, что она очень и очень удобная... Вот и пробую... В общем это как-бы садистское использование хеш-таблице вместо переменной... Если всё будет удобно - пойду дальше :)

Quote (Kartoha)
Quote (AnyOne697)
Code
ConvertedPlayer(num)

Локальная num не объявляется.

Quote (AnyOne697)
Code
takes integer num,

Не сказал бы... Она в параметрах функции.

Quote (Ajaccio)
Кажется в вашем коде не была инициализирована переменная i. Вы пытаетесь сделать i = <ничего> + 1. Получаете закономерную ошибку.
Можете поставить local integer i = 0.

Да... Есть и такое... Но... С ней ничего не вылетает...
Вылетает почему-то именно здесь:
Code
call CreateNUnitsAtLoc( 1, udg_AllHeroes[rndTemp], ConvertedPlayer(num), GetPlayerStartLocationLoc(Player(cmdNum + 9)), bj_UNIT_FACING )

Если закомментить - просто нуль реакции... Но всё равно огромное спасибо...

Quote (Пикс)
еще возможно, если udg_AllHeroes[rndTemp] не указана, тоесть функция ссылается на участок памяти, где должен лежать тип юнита, а там его нет, вследсвие чего это самая память не может быть прочитана. тоже и с номером игрока. попробуй упростить эту функцию. Задай эти параметры сначала как константы и посмотри. мб изза этого)
Добавлено (14-01-2011, 01:10)
---------------------------------------------
Kartoha, во первых: ты путаешь функцию с триггером) эта переменная запрашивается в эту функцию, ее объявлять не нужно.
во вторых: если бы было как ты говоришь, то функция бы просто не компилировалась.
Ajaccio, она по умолчанию содержит значение ноль.

Добавлено (14-01-2011, 01:17)
---------------------------------------------
Quote (Ajaccio)
Можете поставить local integer i = 0
в Jass это пишется так: set i = 0

С первым нет - всё происходит при инициализации карты в таком духе (GUI):

Code
Set AllHeroes[1] = Vandal
Set AllHeroes[2] = Mosk
Set AllHeroes[3] = Habib

Кроме самоиницаилизации... Точно не знаю, но вроде это не так (или так), хотя если так - то он к лучшему...

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

Эм... А в Jass есть потоки!? Ну а вообще не пробовал... Вполне возможно что и так... Но не поток... Если бы в Jass были бы потоки и классы... Эх...

Quote (Ajaccio)
Добавлено (14-01-2011, 01:20)
---------------------------------------------
Quote
в Jass это пишется так: set i = 0

Ну... Так тоже можно... И наверное даже лучше... Хотя при объявлении можно вроде и инициализировать (ошибки нет, запускать не пробовал), но как-то слышал, что лучше не надо... Вот cJass спокойно такое можно - всё будет спарсено как надо...

Quote (Dreii)
Quote (AnyOne697)
call CreateNUnitsAtLoc( 1, udg_AllHeroes[rndTemp], ConvertedPlayer(num), GetPlayerStartLocationLoc(Player(cmdNum + 9)), bj_UNIT_FACING )

во 1 нету переменной num во вторых нету cmdNum
И своетую написать так local integer rndTemp=GetRandomInt(1, udg_AllHeroInteger)
и не используй call CreateNUnitsAtLoc, используй call CreateUnit(player id, integer unitid, real x, real y, real faceeUnit)
где х и у могут быть GetUnitX(юнит) GetUnitY(юнит) соответсвенно


Ну да... Только если бы их даже не было - не запускалось бы вообще... Ошибка была бы при проверке кода на "синтаксические" ошибки...

Quote (Dreii)
Не знаю зачем тут это,но лучше не использовать БЖ пользуйся нативками call SaveInteger(table, missionKey, key, value)
GetLastCreatedHashtableBJ() лучше занести в переменную, и лучше прочитай вот это

Пока с hashtabl'ами только разбираюсь... За совет спасибо, но юзаю их специально, чтобы исключить переменные... Слышал, что hash быстрее и надёжнее... За статью спасибо - положил в закладки :)

Quote (Пикс)

Quote (Dreii)
во 1 нету переменной num во вторых нету cmdNum

а вот это что?
Quote (AnyOne697)
Code
takes integer num, integer cmdNum

Ну так я о чём?..

Quote (Ajaccio)
В общем я бы посоветовал проверить игроков, возможно вы пытаетесь создать героя несуществующему игроку.
Также нужно инициализировать переменные, но это вряд ли причина ошибки как таковой.
Вообще надо смотреть как происходит вызов функции, для полноты картины.
Code
Player(cmdNum + 9))

Особенно вот это напрягает, наверное очень просто выйти за число допустимых игроков.

Кстати, да... Ошибку понял... А! ХОТЯ НЕТ! Стоп, всё правильно - cmdNum - это номер команды, а + 9 - потому что проставлено правильно (там где надо, остальные разбросаны по карте) только два последних игрока... Они в разных командах, и передаю я cmdNum в функцию, конечно учитывая этот факт...

Quote (CHLSN)
Quote (Ajaccio)
Особенно вот это напрягает, наверное очень просто выйти за число допустимых игроков.

Также очень просто можно написать в начале функции: if cmdNum > 15 return false else return true (естественно с переносом строк). И указать в заголовке функции returns boolean
Quote (AnyOne697)
ConvertedPlayer(num)

Используй Player() но в параметре integer надо брать на единицу меньше.


Не знаю зачем возвращать bool, тем более игроков не может быть 15... По крайне мерее у меня... А cmdNum - command number (расшифровка)... Специально пишу более менее понятые названия переменных и всё равно путаемся... Плоха...

Quote ([DUОS)
]
Code
local integer rndTemp = GetRandomInt(1,udg_AllHeroInteger)  
       local unit u = CreateUnit(Player(num),udg_AllHeroes[rndTemp],GetPlayerStartLocationX(Player(cmdNum + 9)),GetPlayerStartLocationY(Player(cmdNum + 9)),0.)  
       
       call SaveInteger(udg_H,0,0,LoadInteger(udg_H,0,0) - 1)  

       call rmvHeroOnArray(udg_AllHeroes[rndTemp])  

       if GetLocalPlayer() == GetOwningPlayer(u) then  
           call PanCameraToTimed(GetWidgetX(u),GetWidgetY(u),2.)  
       endif  

       set u = null

Немного не понял, зачем if... Спасибо за saveinteger, и ещё вопрос - разве CreateUnit возвращает unit? Если да, то хорошо... Надо будет запомнить...
Только вот не понял в чём разница между
Code
call CreateNUnitsAtLoc( 1, udg_AllHeroes[rndTemp], ConvertedPlayer(num), GetPlayerStartLocationLoc(Player(cmdNum + 9)), bj_UNIT_FACING )

и
Code
local unit u = CreateUnit(Player(num),udg_AllHeroes[rndTemp],GetPlayerStartLocationX(Player(cmdNum + 9)),GetPlayerStartLocationY(Player(cmdNum + 9)),0.)

Хотя код много красивее (знал бы я про возвращения типа unit, но... смысл тот же... Ну... Ещё не понял Player(num)... Почему не ConvertedPlayer(num), или смысл тот же? А хотя кажется понял... Ну... Наверное... В общем - спасибо...

CHLSN, я так понимаю смысл тот же что и у [DUOS]... Но... Почему создание юнита закомментировано?
Что-то большое сообщение очень...

Ещё раз ВСЕМ спасибо!

И... Вопрос не по теме, но тоже нужный - я так понимаю, что мне нельзя повышать репу (плюсика не вижу) ?.. Вроде бы в таких случаях админов просят или тех, кто может...

-------------------------------------------------------
P.S. Но по крайне менее, [DUOS] предложил рабочий вариант... Честно, не понимаю почему :'( ... Может кто-нибудь объяснит?..


Я у узнал, что у меня
Есть огромная семья:
Монитор, системный блок,
В сеть воткнул я проводок,
Windows - небо голубое...
Это всё моё - родное!
Без инета жить нельзя -
Наркоман наверно я!
 

ПиксДата: Пятница, 14 Января 2011, 17:09:58 | Сообщение # 14
3 уровень
Группа: Пользователи
Сообщений: 53
Награды: 0
Репутация: 4
Блокировки:
как то можно через лс но я сам незнаю как =)

Добавлено (14-01-2011, 17:09)
---------------------------------------------
я бы тоже хотел это узнать)


Без любви к своему делу создать что-то великое невозможно, а ради всего остального жить нет смысла (с) Сергей Орловский (глава компании Astrum Nival)
 

SirNikolasДата: Пятница, 14 Января 2011, 17:11:38 | Сообщение # 15
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (AnyOne697)
Только вот не понял в чём разница между
Code
call CreateNUnitsAtLoc( 1, udg_AllHeroes[rndTemp], ConvertedPlayer(num), GetPlayerStartLocationLoc(Player(cmdNum + 9)), bj_UNIT_FACING )

и
Code
local unit u = CreateUnit(Player(num),udg_AllHeroes[rndTemp],GetPlayerStartLocationX(Player(cmdNum + 9)),GetPlayerStartLocationY(Player(cmdNum + 9)),0.)
[Статья]Как оптимизировать свой код
Quote (AnyOne697)
И... Вопрос не по теме, но тоже нужный - я так понимаю, что мне нельзя повышать репу (плюсика не вижу)?.. Вроде бы, в таких случаях админов просят или тех, кто может...
Нужно стать проверенным - набрать 50 сообщений, оставить 10 комментариев к файлам и/или статьям, подтвердить e-mail и пробыть на сайте месяц.


 

[DUОS]Дата: Пятница, 14 Января 2011, 17:17:27 | Сообщение # 16
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
Quote (AnyOne697)
А в Jass есть потоки!?

В Jass есть потоки. Для управления ими есть функция ExecuteFunc, запускающая функцию в отдельном потоке.

Добавлено (14-01-2011, 17:17)
---------------------------------------------

Quote (AnyOne697)
Но по крайне менее, [DUOS] предложил рабочий вариант...

Парень, скачай JassCraft, там есть списки функций с разъяснениями, хотя, признаюсь, этот код оптимизировал, вообще не юзая крафт :)


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)
 

AnyOne697Дата: Пятница, 14 Января 2011, 17:23:57 | Сообщение # 17
2 уровень
Группа: Пользователи
Сообщений: 35
Награды: 0
Репутация: 9
Блокировки:
Quote (AnyOne697)
Но по крайне менее, [DUOS] предложил рабочий вариант... Честно, не понимаю почему ... Может кто-нибудь объяснит?..

Ммм... Понял - ConvertedPlayer(integer playerNum) возвращает игрока, с номером playerNum, а Player(integer num) - с номером num + 1 !!!
Ну, конечно, я этого не знал))) И поэтому играя первым игроком, пытался себе взять рандомного героя... А, так как нулевого игрока нет, а ему он нужет, он вылетает за пределы массива и похоже в защищённую зону... Вот потому Memory Cannot Read...

Тему можно закрывать, всем спасибо, а вот репу поднять не могу... Маловато я на сайте здесь сижу... Ну... Может кто-нибудь вместо меня поднимет?.. Особенно помог [DUOS], большинство также указало на другие, не "вскрывшиеся" ошибки и просто подняли мои знания. Ещё раз всем спасибо...
На всякий, конченый вариант:

Code

function rmvHeroOnArray takes integer hero returns nothing  
      local integer i = 0  
      local integer temp  
      loop
         if (udg_AllHeroes[i] == hero) then
             set temp = i
         endif  
         set i = i + 1  
         exitwhen i == 16
      endloop  
      set udg_AllHeroes[temp] = udg_AllHeroes[udg_AllHeroInteger - 1]  
      set udg_AllHeroInteger = udg_AllHeroInteger - 1  
endfunction  

function createRndHeroForPlayerByNumber takes integer num, integer cmdNum returns nothing  
       local integer rndTemp = GetRandomInt(1,udg_AllHeroInteger)  
       local unit u = CreateUnit(Player(num),udg_AllHeroes[rndTemp],GetPlayerStartLocationX(Player(cmdNum + 9)),GetPlayerStartLocationY(Player(cmdNum + 9)),0.)  
       
       call SaveInteger(GetLastCreatedHashtableBJ(),0,0,LoadInteger(GetLastCreatedHashtableBJ(),0,0) - 1)  

       call rmvHeroOnArray(udg_AllHeroes[rndTemp])  

       call PanCameraToTimedLocForPlayer( GetOwningPlayer(u), GetUnitLoc(u), 2.00 )
endfunction

первая функция удаляет героя из массива, если его взяли (или выбран был случайно) во избежание повторений
вторая функция генерирует случайного героя для указанного игрока (команда игрока также указывается вручную для ликвидации if'овой конструкции (её я реализовал отдельно, GUI методом)
udg_AllHeroes содержит всех героев, созданных в карте...

Добавлено (14-01-2011, 17:23)
---------------------------------------------

Quote ([DUOS)
]ExecuteFunc

Ммм... Потоки... Интересно, спасибо.
Quote
JassCraft

Тоже интересно будет... Было бы конечно неплохо (даже очень хорошо) ссылку, ибо нахожу старую версию, которая требует WinXP для корректной работы... Но всё равно спасибо...


Я у узнал, что у меня
Есть огромная семья:
Монитор, системный блок,
В сеть воткнул я проводок,
Windows - небо голубое...
Это всё моё - родное!
Без инета жить нельзя -
Наркоман наверно я!
 

SirNikolasДата: Пятница, 14 Января 2011, 17:26:33 | Сообщение # 18
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (AnyOne697)
GetLastCreatedHashtableBJ()
bj_lastCreatedHashtable
Quote (AnyOne697)
call PanCameraToTimedLocForPlayer( GetOwningPlayer(u), GetUnitLoc(u), 2.00 )
Code
if GetLocalPlayer() == GetOwningPlayer(u) then
     call PanCameraToTimed(GetWidgetX(u), GetWidgetY(u), 2.)
endif

Добавлено (14-01-2011, 17:26)
---------------------------------------------
JASS NewGen Pack 5d - тоже неплохая программка. Насчет Windows не знаю, у меня XP.


 

[DUОS]Дата: Пятница, 14 Января 2011, 17:37:33 | Сообщение # 19
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
Quote (AnyOne697)
exitwhen i == 16

Да неверно же.
максимум играющих 12 (указывать надо i > 11)


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)
 

SirNikolasДата: Пятница, 14 Января 2011, 17:41:45 | Сообщение # 20
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
А вдруг надо создать героя нейтрально-пассивному? Или боту, нейтральной жертве?

 

EdiTTORRДата: Пятница, 14 Января 2011, 17:49:26 | Сообщение # 21
8 уровень
Группа: Проверенные
Сообщений: 585
Награды: 0
Репутация: 147
Блокировки:
Quote (AnyOne697)
Ммм... Понял - ConvertedPlayer(integer playerNum) возвращает игрока, с номером playerNum, а Player(integer num) - с номером num + 1 !!!

Наоборот, ConvertedPlayer(1) == Player(0), т.е. если нумерация игроков начинается с 0 то в ГУИ с 1, эта функа для гуи и отнимает у числа 1 что бы вместо Игрок 1(Красный)(на jass Player(0)) мы не получили Игрок 2(Синий)(на jass Player(1)).
т.е. если функция Player не изменяет число, а ConvertedPlayer отнимает 1:
Code
function ConvertedPlayer takes integer convertedPlayerId returns player
     return Player(convertedPlayerId - 1)
endfunction


Местами здесь.


Сообщение отредактировал EdiTTORR - Пятница, 14 Января 2011, 17:51:35
 

SirNikolasДата: Пятница, 14 Января 2011, 18:01:08 | Сообщение # 22
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (AnyOne697)
Если бы в Jass были потоки и классы...
Классы тоже есть. http://warcraft3ft.info/board/vjass_dlja_novichkov/17-1-0-1186


 

CHLSNДата: Пятница, 14 Января 2011, 18:54:19 | Сообщение # 23
10 уровень
Группа: Проверенные
Сообщений: 1627
Награды: 0
Репутация: 132
Блокировки:
Quote (AnyOne697)
CHLSN, я так понимаю смысл тот же что и у [DUOS]... Но... Почему создание юнита закомментировано?

Глаза-то у кого-то кривые...
Quote (CHLSN)
set u = CreateUnit( pl, GetUnitTypeId( rndHero ), GetStartLocationX(GetPlayerStartLocation(pl)), GetStartLocationY(GetPlayerStartLocation(pl)), 0 )




Я в контакте и на warcraft3ft.info.
Кто может сказать, почему **** дизайнер писал вместо "pt" "px" в CSS, благодаря чему нужно смотреть форум через лупу с Ctrl++?
 

AnyOne697Дата: Суббота, 15 Января 2011, 15:07:05 | Сообщение # 24
2 уровень
Группа: Пользователи
Сообщений: 35
Награды: 0
Репутация: 9
Блокировки:
Quote
[DUОS]]Quote (AnyOne697)
exitwhen i == 16

Да неверно же.
максимум играющих 12 (указывать надо i > 11)


Я же писал, что AllHeroes - это массив, содержащий ВСЕХ героев, которые имеются на карте, которых пока 16... Да... Знаю - лучше в глобал или ещё как-то определять, чтобы не искать по всему коду потом, но это уже сделал... Ещё, когда записал в temp значение, сразу присваиваю i значение 16 - чтобы глюков не было и работало правильнее...

Quote (SirNikolas)
А вдруг надо создать героя нейтрально-пассивному? Или боту, нейтральной жертве?

Нет... Может мне заканчивать давать функциям хорошие имена и писать что-то вроде "Trig00001____MyStupidBrain___TrigName_GetHeroRND"... Название у функции createRndHeroForPlayerByNumber, то есть создать случайного героя игроку по его номеру...

Quote (CHLSN)
Quote (AnyOne697)
Quote
CHLSN, я так понимаю смысл тот же что и у [DUOS]... Но... Почему создание юнита закомментировано?

Глаза-то у кого-то кривые...
Quote (CHLSN)

Quote
set u = CreateUnit( pl, GetUnitTypeId( rndHero ), GetStartLocationX(GetPlayerStartLocation(pl)), GetStartLocationY(GetPlayerStartLocation(pl)), 0 )


Ну... а зачем комментировать мусор?.. Это просто так... Вопрос... Мешает думать немного... А функция похожа на то, что у DUOS, но всё равно спасибо!

Quote (EdiTTORR)
Quote (AnyOne697)
Ммм... Понял - ConvertedPlayer(integer playerNum) возвращает игрока, с номером playerNum, а Player(integer num) - с номером num + 1 !!!

Наоборот, ConvertedPlayer(1) == Player(0), т.е. если нумерация игроков начинается с 0 то в ГУИ с 1, эта функа для гуи и отнимает у числа 1 что бы вместо Игрок 1(Красный)(на jass Player(0)) мы не получили Игрок 2(Синий)(на jass Player(1)).
т.е. если функция Player не изменяет число, а ConvertedPlayer отнимает 1:

Code
function ConvertedPlayer takes integer convertedPlayerId returns player  
      return Player(convertedPlayerId - 1)  
endfunction

Я делаю, как самый кривой программер в мире... Я уже в GUI передаю в кастом скрипте в функцию в параметр num номер игрока, вычитая единицу...

Quote

Quote (AnyOne697)
Если бы в Jass были потоки и классы...

Классы тоже есть. http://warcraft3ft.info/board/vjass_dlja_novichkov/17-1-0-1186

Ну... Потоки я так понял несколько другие... Не совсем то, что реально именуется потоком, ни thread ни потоки ввода-вывода...
Ну, и структура =/= класс... Знаю, я прошу слишком много, и для такой вещи, как World Editor совсем не нужны такие вещи, как полиморфизм/наследование... Ну, и потом, это никак не ускоряет работу, как я понимаю, а парсится в чёрт знает что...

Вопрос к этому:

Quote
Добавлено (14-01-2011, 17:26)
---------------------------------------------
JASS NewGen Pack 5d - тоже неплохая программка. Насчет Windows не знаю, у меня XP.

В описании:
Quote (описание)
Работает на новом патче без проблем

Насколько новый этот новый патч?..

А вот это зачем?..

Quote (SirNikolas)

Quote (AnyOne697)
call PanCameraToTimedLocForPlayer( GetOwningPlayer(u), GetUnitLoc(u), 2.00 )

Code
if GetLocalPlayer() == GetOwningPlayer(u) then  
      call PanCameraToTimed(GetWidgetX(u), GetWidgetY(u), 2.)  
endif


Я у узнал, что у меня
Есть огромная семья:
Монитор, системный блок,
В сеть воткнул я проводок,
Windows - небо голубое...
Это всё моё - родное!
Без инета жить нельзя -
Наркоман наверно я!
 

SirNikolasДата: Суббота, 15 Января 2011, 15:14:26 | Сообщение # 25
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (AnyOne697)
Насколько новый этот новый патч?..
Имеется в виду патч 1.24, а не Windows
Quote (AnyOne697)
А вот это зачем?..
Раскрытие BJ.


 

Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » простейший вопрос по Jass - вылетает Memory Cannot Read (Я в Jass буквально вчера и уже пытаюсь писать функции...)
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz