Порядок полей таблицы Даты-Времени у обезличенной сделки. Квик 8.5 Луа53.

Страницы: 1
RSS
Порядок полей таблицы Даты-Времени у обезличенной сделки. Квик 8.5 Луа53.
 
Переписываю старую дллку под новый Квик и столкнулся с серьёзной проблемой.
В старой версии поля таблицы Времени-Даты были статичными, то есть было ясно где часы, где минуты, где секунды и т.д.
В новой же версии при каждом новом запуске скрипта с моей дллкой поля меняются местами

Запускаю первый раз скрипт, пишу ячейки в файл:  
9  3  48  14  4  480  2020  22  480334  
минуты - деньнедели- секунды - часы - месяц - мсек - год - число - мксек

Запускаю второй раз, этот же самый тик:
14  480  4  2020  480334  3  22  48  9
 
Внутри одного исполнения скрипта очерёдность полей не меняется
 
Это же нормальное явление для луа, полагаться на какой-то порядок полей было изначально ошибкой.
 
Цитата
Aleks написал:
В новой же версии при каждом новом запуске скрипта с моей дллкой поля меняются местами
Добрый день.
В VM Lua 53 присутствует недетерминированное поведение в порядке ключе в Lua таблице, попробуйте перед выводом в файл сортировать данные по ключу.
Вот полезная информация по сортировке в Lua:
https://www.lua.org/pil/19.3.html
http://lua-users.org/wiki/SortedIteration
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
 
Цитата
Nikolay Pavlov написал:
В VM Lua 53 присутствует недетерминированное поведение в порядке ключе в Lua таблице, попробуйте перед выводом в файл сортировать данные по ключу.
Можно быть уверенным, что внутри одного исполнения очерёдность полей не поменяется?
 
Цитата
Anton написал:
Это же нормальное явление для луа, полагаться на какой-то порядок полей было изначально ошибкой.
Тем не менее, обращаться по индексу - самый эффективный способ. Квик и без всяких сортировок и поиску по ключу тормозит сильно
 
Цитата
Aleks написал:
обращаться по индексу - самый эффективный способ
Точно ли есть разница, заметная невооруженным глазом, вот в чем вопрос. Я б в сторону for k,v in pairs(t) посмотрел. Раз дело в длл, завсегда можно напихать в локальную сишную структурку сначала, а потом одним разом ее в файл записать, на этом сэкономите времени на пару порядков больше.
 
Цитата
Aleks написал:
Можно быть уверенным, что внутри одного исполнения очерёдность полей не поменяется?
К сожалению, с уверенностью сказать не можем. Тесты показывали, что официальная VM Lua  (https://sourceforge.net/projects/luabinaries/files/5.3.5/Tools%20Executables/ ) внутри одного запуска порядок ключей в таблице сохраняет, после перезапуска порядок ключей меняется. Аналогично и в VM Lua в терминале Quik.
Все же это не очень удачный подход затачиваться на порядок ключей в Lua таблице, лучше сортировать или обращаться по ключу, что гораздо быстрее.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
 
Цитата
Aleks написал:
Цитата
Anton написал:
Это же нормальное явление для луа, полагаться на какой-то порядок полей было изначально ошибкой.
Тем не менее, обращаться по индексу - самый эффективный способ. Квик и без всяких сортировок и поиску по ключу тормозит сильно
Любопытно. Это заключение на основе чего сделано?

В lua все строки имеют абсолютный индекс.
table["key"] (как и table.key)  -  это всегда доступ по индексу строки, никакого сравнения строк (парсинга, вычисления хэшей и т.п.) по содержимому строки в lua тут не происходит.
Потому lua со строковыми ключами таблиц работает максимально шустро.

А вот конкатенация строк - это в противовес самое тормозное в lua.
 
Цитата
Aleks написал:

Запускаю первый раз скрипт, пишу ячейки в файл:  
9  3  48  14  4  480  2020  22  480334  
минуты - деньнедели- секунды - часы - месяц - мсек - год - число - мксек

Запускаю второй раз, этот же самый тик:
14  480  4  2020  480334  3  22  48  9
Попробуйте:
Код
string.format('%04d-%02d-%02d %02d:%02d:%02d.%06d', dt.year, dt.month, dt.day, dt.hour, dt.min, dt.sec, dt.mcs or 0)
Строку формата скорректируйте под себя. Сравните по скорости :)
 
Цитата
Latrop написал:
никакого сравнения строк (парсинга, вычисления хэшей и т.п.) по содержимому строки в lua тут не происходит.
Справедливости ради, вычисление хэша и поиск строки происходит, если речь о длл и сначала на стек пихается строка с ключом, а потом по ней индексируется таблица. Но это не проблема луа, а проблема дллписателя скорее, строк можно и заранее напихать. А вообще господин Иерусалимский говорит следующее
 
 
короч, не надо баломутить меня, есть дллка, написанная на нормальном языке программирования, а не на этом недоразумении, в котором нет никакого желания разбираться. Дллка отлично работает последние фиг знает сколько лет, сбился со счёта.
Надо с минимальными трудозатратами перелопатить под новый Квик 8.5 и под новый недоязык 5.3.
Что я почти и доделал, сделал индексацию полей при каждом запуске скрипта, надеюсь внутри одного запуска нет чехорды с порядком полей.
 
Цитата
Anton написал:
А вообще господин Иерусалимский говорит следующее ...
Господин, должно быть, имел ввиду код на lua , а не dll
Хотя звучит немного пафосно, видимо он очень любит lua, и не видел скриптов, когда в циклах собираются строки через плюсик :)

Для dll можно, наверное, попробовать сделать lua-макрос, и дергать его, чтоб строки не слать.

Кстати, а как так можно заранее напихать, и чтоб lua не стыковал строки со своим реестром при работе через lua_getfield и т.п.? Такое возможно?  
 
Цитата
Latrop написал:
Кстати, а как так можно заранее напихать
В upvalues я имел в виду.
Страницы: 1
Читают тему
Наверх