|
|
|
Lua |
|
|
DarkMaster |
27.4.2017, 18:04
|
Модератор UOPilot
Сообщений: 9.568
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 28530
Пользователь №: 11.279
|
Сортировка с учетом значений двух первых столбцов, третий игнорируется: Цитата Справку по луа я читал и не одну, так что копипаст не поможет. От примеров больше пользы.
Код --lua
function mySort(a,b) if a[1] < b [1] then return true else if a[1] == b [1] and a[2] < b [2] then return true end end return false end
arr = {} arr [1] = {20, 10, 15} arr [2] = {15, 5, 13} arr [3] = {15, 4, 13}
table.sort(arr, mySort)
log (table.concat(arr[1], ","), table.concat(arr[2], ","), table.concat(arr[3], ",")) так же можно использовать упрощенную запись типа: Код arr [1] = {20, 10, 15} arr [2] = {15, 5, 13} table.sort (arr, function (a, b) return (a[1] < b[1]) end)
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
cirus |
29.5.2017, 3:10
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 27515
Пользователь №: 16.971
Возраст: 29
|
Цитата Есть поле, допустим 5*5. Каждая точка имеет несколько параметров. Как лучше хранить все данные? Цитата Массив. Очень информативно (IMG: style_emoticons/default/smile.gif) В пилотовском варианте: Код set %arr [1 1] 10 20 30 set %arr [1 2] 15 33 6 init_arr %tmp (1) %arr [1 2] // костыль в виде временного массива log %tmp [1 3] // обратиться к параметру 3 2й точки. end_script Или же делать 3 массива 5*5, т. е. для каждого параметра свой массив. На луа как-то удобнее можно сделать?
|
|
|
|
DarkMaster |
30.5.2017, 17:07
|
Модератор UOPilot
Сообщений: 9.568
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 28530
Пользователь №: 11.279
|
Цитата Так должно быть? Да. Цитата Вариант 1 предпочтительнее в плане производительности? Да, но нужно понимать насколько это критично для конкретного случая. Первый вариант гарантирует, что данные будут расположены в памяти единым блоком (формально вроде бы не оговорено, но по факту луа старается делать именно так). Т.е. это массив в чистом виде. Второй вариант будет содержать указатель на данные хранящиеся отдельно от непосредственно массива. Второй вариант может быть более производителен при присвоении строк, т.к. не будет требовать перестроения всего массива в момент присвоения, если строка не влазит. В этом варианте полная свобода по размеру данных в ячейке. Если мы пытаемся вставить элемент в середину массива, то это приводит к полному копированию "хвоста" массива, чтобы в середине образовалась дырка для наших данных. Указатели и хэш таблицы позволяют этого избежать, однако при переборе с большим количеством операций мы будем неизбежно проигрывать в производительности. Тут все достаточно очевидно на самом деле. Если у нас фиксированный массив, то интерпретатор вычисляет смещение от начала массива до нашей ячейки и получает данные, если хеш таблица, то интерпретатор вычисляет смещение от начала массива до нашей ячейки, считывает из нее указатель, получает данные по указателю. На один этап больше, дополнительное обращение к случайному участку памяти, как следствие снижение производительности. // Кстати ты обратил внимание на то, что ты создаешь 2 мерный массив и присваиваешь ячейкам int значения, а потом вместа int присваиваешь массив? Вообще формально это допустимо, но выглядит дико.
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
DarkMaster |
31.5.2017, 11:36
|
Модератор UOPilot
Сообщений: 9.568
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 28530
Пользователь №: 11.279
|
Цитата for j = 1, 5 do z = z + 1 field [i][j] = z end вот это бы выкинуть просто. Я понимаю, что оно для отладки, но ты потом этот "номер" заменяешь на массив. Луа прекрасен своей гибкостью и он это позволяет, но, как я уже говорил, выглядит это дико. Просто всмотрись в код, ты делаешь: z = z + 1 field [i][j] = z а ниже идет field [i][j] = {x=100, y=200, n=300} формально твой код полностью корректен.
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|