Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (Flatly)
  • No Skin
Collapse
Brand Logo

NetXMS Forum

  1. Home
  2. Support (Russian)
  3. Регрессии и ошибки NXScript

Регрессии и ошибки NXScript

Scheduled Pinned Locked Moved Support (Russian)
11 Posts 2 Posters 91.6k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • V
    V
    Victor Kirhenshtein
    wrote on last edited by
    #2

    @skynv said in Регрессии и ошибки NXScript:

    1. пре инкремент
      работает как декремент

    Исправил.

    @skynv said in Регрессии и ошибки NXScript:

    1. uint32 conversion
      не работает данная конвертация

    А можно пример скрипта?

    @skynv said in Регрессии и ошибки NXScript:

    1. парсер и "//"
      если в конце скрипта добавить комментарий с помощью
    //
    

    то парсер выдаст ошибку

    syntax error, unexpected '/', expecting $end

    хотя на

    /* В конце*/
    

    парсер реагирует нормально

    Исправил.

    @skynv said in Регрессии и ошибки NXScript:

    большой скрипт не напишешь, постоянно Stack underflow...

    Это скорее всего следствие одной из ошибок. Можете привести пример скрипта, который дает stack underflow?

    1 Reply Last reply
    0
    • S
      S
      SKYnv
      wrote on last edited by
      #3

      @victor said in Регрессии и ошибки NXScript:

      Это скорее всего следствие одной из ошибок. Можете привести пример скрипта, который дает stack underflow?

      честно говоря, наверно с десяток скриптов всех и не упомнишь. Вот свежий пример, ошибка возникает из-за условия  i!=-10, вернее из-за отрицательного числа и не важно инкремент или декремент мы используем.

      sub CheckPreInc()
      {
      	for(i=0;i!=-10;i++)
      	{
      		println(i);
      	}
      }
      

      еще один скрипт во вложении, там ошибка возникает из-за процедуры которая вообще не должна никак влиять на скрипт так-как она ни разу не выполниться.

      далее

      @victor said:

      @skynv said:

      1. 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() работает несколько не адекватно.


      test.nx

      2012-09-23_00001.jpg

      1 Reply Last reply
      0
      • V
        V
        Victor Kirhenshtein
        wrote on last edited by
        #4

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

        Пре-инкремент у меня работает как надо - я это уже исправлял. В аттаче свежесобранный интерпретатор для 32 битного Windows.


        libnxsl.dll

        1 Reply Last reply
        0
        • S
          S
          SKYnv
          wrote on last edited by
          #5

          @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

          1 Reply Last reply
          0
          • V
            V
            Victor Kirhenshtein
            wrote on last edited by
            #6

            Конструкция вида

            uint32(value);
            

            смысла не имеет - возвращается преобразованное значение, которое выбрасывается. Тогда надо писать так:

            value = uint32(value);
            

            По сути type cast можно рассматривать как специальные функции - они принимают одно значение и возвращают преобразованное значение.

            1 Reply Last reply
            0
            • S
              S
              SKYnv
              wrote on last edited by
              #7

              @victor said in Регрессии и ошибки NXScript:

              Конструкция вида

              uint32(value);
              

              смысла не имеет - возвращается преобразованное значение, которое выбрасывается. Тогда надо писать так:

              value = uint32(value);
              

              По сути type cast можно рассматривать как специальные функции - они принимают одно значение и возвращают преобразованное значение.

              ясно
              stack underflow вроде пропал, пока не удалось воспроизвести.
              буду баловаться дальше, спасибо.

              1 Reply Last reply
              0
              • S
                S
                SKYnv
                wrote on last edited by
                #8
                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);
                }
                

                требуется уточнить, баг это или ошибка на моей стороне.

                1 Reply Last reply
                0
                • S
                  S
                  SKYnv
                  wrote on last edited by
                  #9

                  round работает немножко некорректно.
                  пример из вики

                  round(2.378, 2) -> 2.38

                  то есть скрипт

                  sub main()
                  {
                  println round(2.378, 2);
                  }
                  

                  но вернет следующее

                  netxmsd: exec test
                  2.378000
                  INFO: Script finished with rc=0

                  floor себя ведет также

                  sub main()
                  {
                  println floor(2.378);
                  }
                  

                  netxmsd: exec test
                  2.000000
                  INFO: Script finished with rc=0

                  netxmsd:

                  это баг или фича? конечно можно отбрасывать лишнее left'ом но не кошерно же...

                  1 Reply Last reply
                  0
                  • V
                    V
                    Victor Kirhenshtein
                    wrote on last edited by
                    #10

                    Странно. Написал вот такой тестовый скрипт:

                    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>
                    
                    1 Reply Last reply
                    0
                    • S
                      S
                      SKYnv
                      wrote on last edited by
                      #11

                      ясно, просто добивание отсутствующих разрядов нулями, несколько не то что ожидаешь. спасибо.
                      а использовать 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=0

                      0.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=0

                      0.000u 0.004s 0:00.10 0.0%      0+0k 0+0io 0pf+0w

                      1 Reply Last reply
                      0

                      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
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      Powered by NodeBB Contributors
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups