silumin
offline
Опыт:
11,153Активность: |
Брудворк с массивами... (попытка приделать 5е колесо)
По сабжу: пока использую перебор индексов массивов при поиске свободной ячейки. Последее время в голове летает мысль о некоторой несостоятельности функции перебора, из-за чего появился альтернативный вариант. Что выбрать, я не знаю. Все свои мысли изложу кодом, а вы, участники форума, помогайте, но только с комментами.
Изначальная функция:Функция перебирает массив ключей, пока ключ не будет = true. После чего ключ фальсится (ячейка занимается) и возвращается индекс. Всё просто до предела. Код:
Альтернативная функция:Функция тоже перебирает массив ключей, но не с нуля, а со значения хранящегося в переменной udg_SaveIndex. Немного отягощён цикл - добавлена проверка. Код:
Собственно различия минимальны, но существенны с точки зрения поиска. п.с. Убедительная просьба отвечать по сабжу и не критиковать само использование брудворка. Отредактировано silumin, 04.10.2010 в 15:46. |
04.10.2010, 14:08 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Clamp
Lost in space
offline
Опыт:
71,158Активность: |
Зависит от того, может ли у тебя любая случайная ячейка принимать значение истины и от чего это зависит. Если может, то первый вариант оптимальнее. |
04.10.2010, 14:32 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Zanozus
Уехал учиться
offline
Опыт:
8,512Активность: |
Я это давно уже решил(но придумал не совсем я) то что ты спрашиваешь. Щас в кратце объясню: Нужен второй массив (по умолчанию все ячейки равны 0) для хранения индексов свободных ячеек в твоем массиве и целочисленная переменная в которой записано кол-во использованых ячеек. Когда нужен номер свободной ячейки то прибавляем к целочисленной 1 и обращаемся ко второму массиву под индексом целочисленной переменной, ЕСЛИ в этой ячейке хранится 0, то присваиваем этой ячейке номер самой целочисленной и это будет номер свободного индекса, ИНАЧЕ - номер свободной ячейки равен хранившемуся в нем числу, тогда это будет номером свободного индекса. Когда ячейка освобождается, то мы нааборот записываем номер освободившейся ячейки в массив под индексом целочисленной и уменьшаем целочисленную на 1. Вот держи пример: Создается футман и ему присваивается CustomValue, когда он умирает его CV сохраняется в массив и при следующем создании юнита ему будет присвоен CV из массива. Система создавалась для моих тригерных спеллов, но я перешел на Хендлы поэтому тут GUI вперемешку с JASS. Работает безотказно. Тут нет абсолютно никаких переборов/циклов. Можешь проверить мои пред-пред последние спеллы. В массиве юнитов записываются юниты под их CV чтобы было удобно к ним обращаться зная CV юнита. Отредактировано Zanozus, 04.10.2010 в 15:10. |
04.10.2010, 14:56 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Clamp
Lost in space
offline
Опыт:
71,158Активность: |
Zanozus, ужас, столько кода и лишних переменных вместо 9 строк... |
04.10.2010, 15:00 | #4
+1/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Zanozus
Уехал учиться
offline
Опыт:
8,512Активность: |
И где ты тут лишние переменные увидел ? Массив и целочисленная да и кода почти нет.
(ты хоть пример смотрел?) Массив юнитов можно удалить он для спеллов. проще этого уже не придумуать:
Отредактировано Zanozus, 04.10.2010 в 15:34. |
04.10.2010, 15:22 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
silumin
offline
Опыт:
11,153Активность: |
Clamp, всё под триггерные спеллы, которые в своём большинстве занимают ячейку на 3-20 сек. Есть и висяки по 60-180 сек. Ячейки освобождаются как попадёт.
Zanozus, спасибо, но тогда уже проще применить альтернативную функцию, ведь перебор в ней, я так думаю, будет от 0 до 10 циклов, учитывая специфику спеллов. silumin добавил: Zanozus, темболее параллельных массивов у меня за 15 штук... |
04.10.2010, 15:28 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Zanozus
Уехал учиться
offline
Опыт:
8,512Активность: |
от 0 до 10 циклов это много особенно для MUI. Для паралельных не нужно для каждого писать ты ведь в них под одним индексом сохраняешь. Отредактировано Zanozus, 04.10.2010 в 16:06. |
04.10.2010, 15:29 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Clamp
Lost in space
offline
Опыт:
71,158Активность: |
silumin, короче юзай первый вариант и не приделывай пятые/десятые колёса |
04.10.2010, 15:30 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
Вы забыли реализовать операцию удаления объекта из любого места в массиве. А ведь это часто пригоджается и считается правилом хорошего тона - очищать память при выходе. |
04.10.2010, 15:33 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Zanozus
Уехал учиться
offline
Опыт:
8,512Активность: |
где B,C - паралельный массив из которого ты удаляешь объект и одновременно сохраняется освободившийся индекс. Отредактировано Zanozus, 04.10.2010 в 15:56. |
04.10.2010, 15:44 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Elf_Stratigo
offline
Опыт:
4,699Активность: |
silumin:
вечный цикл если всё занято?! очевидно первая функция работает быстрее ибо меньше одним сравнением |
04.10.2010, 20:00 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
silumin
offline
Опыт:
11,153Активность: |
Elf_Stratigo, не успеют игроки накастовать столько спеллов, чтобы занять все 100 ячеек.
Цитата:
silumin добавил: ScorpioT1000, я не совсем тебя понял. Если ты про очистку ячеек (аналог дестракта структуры), то такая функция есть. silumin добавил: Цитата:
|
||
04.10.2010, 21:18 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Zanozus
Уехал учиться
offline
Опыт:
8,512Активность: |
смотря как часто ты перебирать будешь, если пару раз за игру при касте спелла то да, а если в периодическом таймере с малым периодом и по 10 и более раз + несколько игроков то ничего хорошего... короче выбирай сам. |
04.10.2010, 22:03 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
silumin
offline
Опыт:
11,153Активность: |
Zanozus, это только поиск свободных ячеек, а получение индекса ячеек при работе спелла происходит через хеш. Не знаю как остальные делают триггерные спеллы на парал-ных массивах, но поиск свободной ячейки происходит только при активации спелла.
|
04.10.2010, 22:36 | #14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
вот вам убертрушная функция выделения ячеек из массива, да так, чтобы всегда было известно какие ячейки заняты, а какие свободны
Если будете читать, сможете увидеть, что выделяются суб массивы в 62 слота каждый, ведётся список всех массивов что были выделены, для каждого массива ведётся список занятых и свободных слотов, если сделать ограничение на один массив в 8190 ячеек, будет один больной массив со списком занятых и свободных слотов, таблица сделана линкованная как в FAT почти.
код писал сам, но давно, версия без накруток не сохранилась, вернее надо искать, перепелить не проблема. Отредактировано agentex, 05.10.2010 в 17:28. |
05.10.2010, 16:50 | #15
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
silumin
offline
Опыт:
11,153Активность: |
DioD, применять на практике для 100 ячеек, имхо, глупее некуда. Но выпендрёж засчитан! =С
|
05.10.2010, 17:02 | #16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Zanozus
Уехал учиться
offline
Опыт:
8,512Активность: |
И куда такой убертрушный комбайн ? И вобще я не понимаю, автор просил системку для определения свободной ячейки из массива. Я её выложил. Вызвал первую функцию она тебе свободную ячейку из массива\паралельных массивов вызвал третью функцию (та которая в 10-ом посте) - освободил ячейку. без всяких циклов, сложных вычислений и других заморочек. Что еще надо ? |
05.10.2010, 18:24 | #17
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
чтобы определять заранее без циклов свободную ячейку, нужно вести список этих самых свободных ячеек.
Вот эти две функции, первая метит ячейку как занятую, вторая метит ячейку как свободную, при желании докручиваем таблицу разметки и можно делать циклы только по занятым слотам.
то что я выложил даёт реальную возможность иметь массивы дата[62][62] что очень и очень неплохо для решения всевозможных проблем, все метаданные хранятся в самом массиве, отлично накручивается безопасность, так как сбить метаданные и карта загибается по неочевидным причинам. |
05.10.2010, 20:54 | #18
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
silumin
offline
Опыт:
11,153Активность: |
Цитата:
DioD, заканчивай флудить, мне не нужны твои тонны кода. |
|
06.10.2010, 09:37 | #19
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
я вам говорю что обе функции фуфло и это делается БЕЗ циклов, обе функции фундаментально неверные. |
07.10.2010, 10:58 | #20
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|