@m4zuper огромное приогромное спасибо!!!
PSet баг
-
q = "qwe" ; w = 'PSet("basglobal", "'+q+'", "12345");'; log(w); eval(w); log([[GLOBAL:qwe]]);криво работает.
Вывод в лог(w): PSet("basglobal", "qwe", "12345");
Вывод в лог([[GLOBAL:qwe]]): 12345
Отображение в диспетчере переменных: GLOBAL:'+q+': ""w = "asd" ; PSet("basglobal", w, "54321"); log([[GLOBAL:asd]]);Лог: 54321
Отображения нет.
проект: 0_1519473541442_qweqweqwe.xml -
@artihorror Я заметил, что вообще часто, когда определяешь через выполнить в диспетчере undefined. Сегодня тоже ладу дать не мог, ассоциативный массив, не показывало и через экшен лог тоже не выводило, а через выполнить и функцию log выводит.
-
@artihorror @Denis_krsk Думаю, что это не баг, а отсутствие доков. Дело в том, что, хотя для любого проекта и генерируется скрипт, похожий на просто JavaScript, этот скрипт потом при исполнении еще "допиливается" парсером. И уже исполняется допиленный код.
Парсер этот довольно просто устроен и заточен искать определенные подстроки и заменять их по определенным правилам. А другие правила говорят, что надо некий кусок кода перенести как есть. Видимо, здесь так и происходит.
Вывод: в Выполнить код можно писать свой код, но не любой. Надо быть осторожным с использованием функций и конструкций BAS.
Бонус для тру профи: все "опасные" места можно просмотреть, если в гитхабе BAS поискать по строке "regex" ))
-
@daemons на гитхабе таренкая версия лежит. да и тут точно такой же код как и в установке глобальной переменной, только ее имя заменено на переменную. код отрабатывает, а вот отображение отсутствует. в случае с эвалем все должно работать совсем без проблем, но все же
-
@artihorror Вы, видно, не утрудились вникнуть в мой ответ.
Разжевать? Вот фрагмент кода парсера, который извлекает имена глобальных переменных:
std::regex pieces_regex("PSet\\(\\s*\\\"basglobal\\\"\\s*\\,\\s*(\\\"[^\\\"]+\\\")");Если убрать лес экранирующих символов, то получим:
PSet\(\s*"basglobal"\s*\,\s*("[^"]+")Регексы читать умеете? Этот регекс даже не читает всю строку, где находится PSet. Его задача - вытащить имя переменной с помощью подгруппы в конце:
("[^"]+")Что будет, если применить всё это к вашему:
w = 'PSet("basglobal", "'+q+'", "12345");';?
Правильно:'+q+'Для тех, кто в танке. BAS ожидает, что в скрипте всё, что относится к PSet, будет только в виде:
PSet("basglobal", "NAME", val)То, что версия в гитхабе августовская - нерелевантно. Лично я из того, что мне было нужно, не нашел только часть с Node.js. Остальное в последней версии работает в полном соответствии с исходниками с гитхаба.
-
В качестве заключения добавлю, что править скрипты и использовать "Выполнить код", конечно, можно, в том числе и с PSet. Но умеючи и понимаючи.
Если вы в силу квалификации не можете или просто не взяли на себя труд провести своё исследование, то в следующий раз хотя бы поставьте знак вопроса в конце названия подобной темы. Пример:
PSet: баг? -
Если вдруг кому понадобится создавать много глобальных переменных и использовать их данные в логике скрипта:
Создаём в OnApplicationStart указанное в ресурсе {{thread}} количество переменных
for (var i = 1; i < {{thread}}+1; i++){ var w = "TEST_" + i PSet("basglobal", w, "54321"); }Затем в main определяем номер потока одноимённым экшеном и читаем данные из глобальной переменной
[[TOST]] = eval('P("basglobal", "TEST_'+ VAR_THREAD_INDEX +'")')Вот тестовый скрипт.