Регрессии и ошибки NXScript
-
@skynv said in Регрессии и ошибки NXScript:
- пре инкремент
работает как декремент
Исправил.
@skynv said in Регрессии и ошибки NXScript:
- uint32 conversion
не работает данная конвертация
А можно пример скрипта?
@skynv said in Регрессии и ошибки NXScript:
- парсер и "//"
если в конце скрипта добавить комментарий с помощью
//то парсер выдаст ошибку
syntax error, unexpected '/', expecting $end
хотя на
/* В конце*/парсер реагирует нормально
Исправил.
@skynv said in Регрессии и ошибки NXScript:
большой скрипт не напишешь, постоянно Stack underflow...
Это скорее всего следствие одной из ошибок. Можете привести пример скрипта, который дает stack underflow?
- пре инкремент
-
@victor said in Регрессии и ошибки NXScript:
Это скорее всего следствие одной из ошибок. Можете привести пример скрипта, который дает stack underflow?
честно говоря, наверно с десяток скриптов всех и не упомнишь. Вот свежий пример, ошибка возникает из-за условия i!=-10, вернее из-за отрицательного числа и не важно инкремент или декремент мы используем.
sub CheckPreInc() { for(i=0;i!=-10;i++) { println(i); } }еще один скрипт во вложении, там ошибка возникает из-за процедуры которая вообще не должна никак влиять на скрипт так-как она ни разу не выполниться.
далее
@victor said:
@skynv said:
- uint32 conversion
не работает данная конвертация
А можно пример скрипта?
например такой
sub TestUInt32() { UvalMax=65535; UvalMin=0; uint32(UvalMax); uint32(UvalMin); resVal = false; if ((typeof(UvalMax) == "uint32") && (typeof(UvalMin) == "uint32")) { println("uint32 range check ok"); } else { println("uint32 range check failed"); println(typeof(UvalMax)); println(typeof(UvalMin)); } }причем даже если мы сначала инициализируем её так
sub SmallTestUint32() { uint32(value); value=1; println(typeof(value)); return 0; }И даже так
sub SmallTestUint32() { uint32(value); value=1; println(typeof(uint32(value))); return 0; }А можно мне для win32 собранные nxscript с нужными либами прикреплять сюда, а то до сборки под win32 у меня еще руки не дошли. Я себе сделал для удобства подсветку в EmEditor и интерпретатор прикрутил. Ну и на wiki немножко похозяйничал в разделе functions.
Ну и пока руки не дошли, но помоему sleep() работает несколько не адекватно.

- uint32 conversion
-
Действительно, uint32(x) делал cast в int32. Опять copy/paste

Пре-инкремент у меня работает как надо - я это уже исправлял. В аттаче свежесобранный интерпретатор для 32 битного Windows.
-
@victor said in Регрессии и ошибки NXScript:
Действительно, uint32(x) делал cast в int32. Опять copy/paste

Пре-инкремент у меня работает как надо - я это уже исправлял. В аттаче свежесобранный интерпретатор для 32 битного Windows.
Видимо в этом была беда в старой теме про отрицательные значения ))
сразу же уточнение, такой скрипт
sub SmallTestUint32() { value=1; uint32(value); println(typeof(value)); }выдаст
int32
, но зачем он снова конвертирует значение? Если оно попадает в область uint32?
sub SmallTestUint32() { value=1; uint32(value); println(typeof(uint32(value))); }такой само собой
uint32
отрабатывает нормально.
зачем вообще нужна такая конвертация, если такой скрипт
sub SmallTestUint32() { value=-1; uint32(value); println(value); println(typeof(value)); println(typeof(uint32(value))); println(value); println(uint32(value)); return value; }выдаст
-1
int32
uint32
-1
4294967295 -
Конструкция вида
uint32(value);смысла не имеет - возвращается преобразованное значение, которое выбрасывается. Тогда надо писать так:
value = uint32(value);По сути type cast можно рассматривать как специальные функции - они принимают одно значение и возвращают преобразованное значение.
-
@victor said in Регрессии и ошибки NXScript:
Конструкция вида
uint32(value);смысла не имеет - возвращается преобразованное значение, которое выбрасывается. Тогда надо писать так:
value = uint32(value);По сути type cast можно рассматривать как специальные функции - они принимают одно значение и возвращают преобразованное значение.
ясно
stack underflow вроде пропал, пока не удалось воспроизвести.
буду баловаться дальше, спасибо. -
netxms# date & nxadm -c "exec time" понедельник, 1 октября 2012 г. 14:48:23 (YEKT) 1.9.2012, 14:48:23 INFO: Script finished with rc=0сам скрипт
sub main() { println(localtime(time())->mday.".".localtime(time())->mon.".".localtime(time())->year.", ".localtime(time())->hour.":".localtime(time())->min.":".localtime(time())->sec); }требуется уточнить, баг это или ошибка на моей стороне.
-
round работает немножко некорректно.
пример из викиround(2.378, 2) -> 2.38
то есть скрипт
sub main() { println round(2.378, 2); }но вернет следующее
netxmsd: exec test
2.378000
INFO: Script finished with rc=0floor себя ведет также
sub main() { println floor(2.378); }netxmsd: exec test
2.000000
INFO: Script finished with rc=0netxmsd:
это баг или фича? конечно можно отбрасывать лишнее left'ом но не кошерно же...
-
Странно. Написал вот такой тестовый скрипт:
C:\Source\NetXMS\x64\debug>cat test13.nxsl if ($1 == null) $1 = 1.234567; println "floor(" . $1 . ") = " . floor($1); println "ceil(" . $1 . ") = " . ceil($1); println "round(" . $1 . ") = " . round($1); println "round(" . $1 . ", 2) = " . round($1, 2);Результаты:
C:\Source\NetXMS\x64\debug>nxscript test13.nxsl NetXMS Scripting Host Version 1.2.6 Copyright (c) 2005-2012 Victor Kirhenshtein floor(1.234567) = 1.000000 ceil(1.234567) = 2.000000 round(1.234567) = 1.000000 round(1.234567, 2) = 1.230000 C:\Source\NetXMS\x64\debug>nxscript test13.nxsl 2.378 NetXMS Scripting Host Version 1.2.6 Copyright (c) 2005-2012 Victor Kirhenshtein floor(2.378) = 2.000000 ceil(2.378) = 3.000000 round(2.378) = 2.000000 round(2.378, 2) = 2.380000 C:\Source\NetXMS\x64\debug>nxscript test13.nxsl 2.98 NetXMS Scripting Host Version 1.2.6 Copyright (c) 2005-2012 Victor Kirhenshtein floor(2.98) = 2.000000 ceil(2.98) = 3.000000 round(2.98) = 3.000000 round(2.98, 2) = 2.980000 C:\Source\NetXMS\x64\debug>Т.е. round(x, 2) работает как описано. По поводу 0 в конце: после floor/ceil/round, тип данных у результата остается float - поэтомы и цифры после запятой. Это правильно, если число будет использоваться в дальнейших вычислениях. Для красивого форматирования числа можно использовать функцию format (http://wiki.netxms.org/wiki/NXSL:format), отдельно или как обертку вокруг ceil/floor/round.
Пример использования format:
C:\Source\NetXMS\x64\debug>cat test14.nxsl if ($1 == null) $1 = 1.234567; println "format(" . $1 . ", 1, 2) = " . format($1, 1, 2); println "format(floor(" . $1 . "), 1, 0) = " . format(floor($1), 1, 0); C:\Source\NetXMS\x64\debug>Результаты:
C:\Source\NetXMS\x64\debug>nxscript test14.nxsl NetXMS Scripting Host Version 1.2.6 Copyright (c) 2005-2012 Victor Kirhenshtein format(1.234567, 1, 2) = 1.23 format(floor(1.234567), 1, 0) = 1 C:\Source\NetXMS\x64\debug>nxscript test14.nxsl 17.5672334 NetXMS Scripting Host Version 1.2.6 Copyright (c) 2005-2012 Victor Kirhenshtein format(17.5672334, 1, 2) = 17.57 format(floor(17.5672334), 1, 0) = 17 C:\Source\NetXMS\x64\debug> -
ясно, просто добивание отсутствующих разрядов нулями, несколько не то что ожидаешь. спасибо.
а использовать left не быстрее чем format?
Не, не быстрее, одинаково, но писать кода чуть меньше.sub main() { if ($1 == null) $1 = 1.234567; println format(round($1,2), 1, 2); println typeof(format(round($1,2), 1, 2)); }и
sub main() { if ($1 == null) $1 = 1.234567; println left(round($1,2), 4); println typeof(left(round($1,2), 4)); }netxms# time nxadm -c "exec test"
1.23
real
INFO: Script finished with rc=00.000u 0.004s 0:00.10 0.0% 0+0k 0+0io 0pf+0w
netxms# time nxadm -c "exec test2"
1.23
real
INFO: Script finished with rc=00.000u 0.004s 0:00.10 0.0% 0+0k 0+0io 0pf+0w
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login