@Павел said in 24 версия, баг с отпечатком:
Итог desktop : http://joxi.ru/RmzqoV9HYe7GJr
PS так же при обновлении страницы news.mail.ru получаю desktop
Хорошо, проблему передал
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 +'")')
Вот тестовый скрипт.