|
|
|
|
простейший вопрос по Jass - вылетает Memory Cannot Read
|
|
AnyOne697 | Дата: Пятница, 14 Января 2011, 00:46:55 | Сообщение # 1 |
2 уровень
Группа: Пользователи
Сообщений: 35
Награды: 0
Репутация: 9
Блокировки:
| Здравствуйте, я в Jass пошёл буквально вчера и уже пытаюсь писать несложные функции. Сам я программист, пишу на C/C++, немного C# на .Net (если с инетом)... В общем общие понятия ООП есть. Паскаль очень не люблю... Слышал, что Jass очень похож на C - фулфло! Не похож совсем - даже близко не стоял. Куда более похож cJass (даже название говорит об этом, но есть там и свои проблемы - отсутствие классов как таковых) Но... Редактору карт такие навороты не нужны... Что-то расписался... Пойду к теме... 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 есть (только вот зачем он там )... Но он скачал странный 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
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
Блокировки:
| В общем я бы посоветовал проверить игроков, возможно вы пытаетесь создать героя несуществующему игроку. Также нужно инициализировать переменные, но это вряд ли причина ошибки как таковой. Вообще надо смотреть как происходит вызов функции, для полноты картины. Особенно вот это напрягает, наверное очень просто выйти за число допустимых игроков.
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) Локальная 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) В общем я бы посоветовал проверить игроков, возможно вы пытаетесь создать героя несуществующему игроку. Также нужно инициализировать переменные, но это вряд ли причина ошибки как таковой. Вообще надо смотреть как происходит вызов функции, для полноты картины. Особенно вот это напрягает, наверное очень просто выйти за число допустимых игроков. Кстати, да... Ошибку понял... А! ХОТЯ НЕТ! Стоп, всё правильно - 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 Ммм... Потоки... Интересно, спасибо. Тоже интересно будет... Было бы конечно неплохо (даже очень хорошо) ссылку, ибо нахожу старую версию, которая требует WinXP для корректной работы... Но всё равно спасибо...
Я у узнал, что у меня Есть огромная семья: Монитор, системный блок, В сеть воткнул я проводок, Windows - небо голубое... Это всё моё - родное! Без инета жить нельзя - Наркоман наверно я!
|
|
|
|
SirNikolas | Дата: Пятница, 14 Января 2011, 17:26:33 | Сообщение # 18 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (AnyOne697) GetLastCreatedHashtableBJ() bj_lastCreatedHashtableQuote (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, а не WindowsQuote (AnyOne697) А вот это зачем?.. Раскрытие BJ.
|
|
|
|
|
|
|
|
|
|
|