FAQ > 金融建模 > 建模问题 > 系统参数

Q:CalcCTRLWord系统参数设置:控制nil参与计算以及浮点除0的警告或者出错    

简述
对异常运算进行提醒或报错,让用户很容易发现程序中的异常计算,方便数据的分析。
  • A:20240913日更新:
    1、新增pn_CalcCTRLWord()常量函数,其值为"CalcCTRLWord"。
    即可通过setsysparam(pn_calcctrlword(),v);来替代setsysparam("CalcCTRLWord",v);
    2、新一代服务器与新一代客户端中新增0x100和0x200支持对nil类型的.操作和[]操作,该类操作返回NIL。
    3、新增nilinvoke预定义,支持识别当前运行环境是否支持上述2中的设置。
    4、上述2中支持设置系统缺省行为(具体操作可查看下面说明)。

    用法说明:
    设置系统参数"CalcCTRLWord"可以控制程序中若有nil参与计算以及浮点除0时,进行警告或者程序抛出异常。
    设置语法:setsysparam(pn_CalcCTRLWord(),v);
    此为全局变量,对设置后的所有程序有效,默认为0,不启动。

    功能使用说明:
    异常值运算报错与警告:警告是指在运行信息中运行时打印提醒信息,报错即出现该类运算时直接报错,终止当前程序。
    该参数值类型为二进制:(ps:天软中0b开头表示二进制数)
    从低位到高位(位值为1则为启动,为0则为不启动,默认都不启动,则默认值为0):
    第一位:浮点除0警告 
    第二位:浮点除0报错
    第三位:Nil计算警告
    第四位:Nil计算报错
    第五位:Nil大小比较警告
    第六位:Nil大小比较报错
    第七位:Nil等于不等于警告
    第八位:Nil等于不等于报错
    第九位:Nil.与[]操作返回nil,并警告
    第十位:Nil.与[]操作返回nil,不报错也不警告
    使用范例01:只提醒,不报错
    Echo #127;//清除掉客户端ECHO窗口中的内容
    //启动:浮点除0警告,Nil计算警告,Nil大小比较警告,Nil等于不等于警告
    setsysparam("CalcCTRLWord",0b01010101); //等同setsysparam("CalcCTRLWord",85);
    return array(0/0,
         1/0,
         Nil*2,
         Nil>0,
         1+1);

    //程序不报错,不终止,且有返回值,打印提醒信息为:
    float division by zero at:noname86(TSCheckModel) line: 5
    float division by zero at:noname86(TSCheckModel) line: 6
    NIL calculation at:noname86(TSCheckModel) line: 7
    NIL Numerical great/less comparison at:noname86(TSCheckModel) line: 8

    使用范例02:报错+提醒
    Echo #127;
    setsysparam("CalcCTRLWord",0b11111111); //报错+提醒
    return array(0/0,
         1/0,
         Nil*2,
         Nil>0,
         1+1);

    程序报错:提示第5行出现除0操作


    使用范例03:Nil的.与[]操作不报错
      setsysparam(pn_CalcCTRLWord(),0x100); //默认是会报错的,设置后不报错只提醒
      t:=nil;
      return array(t.a,t[1]);

    程序不报错,返回数组:array(nil,nil),会打印信息如
    NIL invoke at:NoName339(xxx) line: 6
    NIL [] get at:NoName339(xxx) line: 6

    使用范例04:判断当前环境是否支持Nil的.和[]操作
      {$IFDEF nilinvoke}
      setsysparam(pn_CalcCTRLWord(),0x200); //不报错也不提醒
      t := nil;
      return array(t.a,t[1]);
      {$ENDIF}
      return "当前环境不支持Nil的.和[]操作";

    当前环境不支持Nil的.和[]操作时,会返回"当前环境不支持Nil的.和[]操作";
    支持时,则会返回数组:array(nil,nil)


    报错类型有以下六类,分别对应如下:
    1、float division by zero :出现除0运算
    2、NIL calculation:存在Nil运算
    3、NIL Numerical great/less comparison:存在Nil大小比较运算
    4、NIL Numerical eq/neq comparison:存在Nil等于或不等于运算
    5、NIL invoke:存在Nil.操作
    6、NIL [] get:存在Nil[n]操作

    缺省行为的设置
    支持在pubkrnl.ini中[TSL]段中使用CalcCtrlWord=来控制缺省的计算控制字,使得系统的缺省行为可配置。
    注:该种操作中仅适用于本地运行,落地服务器用户则可在服务器端进行相关配置。
    具体操作:
    第一步:打开或创建pubkrnl.ini文件
    pubkrnl.ini文件在天软安装目录下,没有的话可以新建此文件(或下载下面的附件放到安装目录下)
    一般默认安装路径为:C:\Program Files\Tinysoft\AnalyseNG.NET
    附件:附件:pubkrnl.ini
    第二步:在文件中添加以下内容(下面示例设置为默认nil.与[]操作不报错只提示,即0x100=256)
    注:ini文件中配置的值必须是一个十进制数值,不支持其它进制的数值配置。
    [TSL]
    CalcCtrlWord=256
    第三步:保存,若是客户端中本地运行,则需重启客户端生效。
    测试代码:
    t:=nil;
    echo tostn(array(t.a,t[1]));
    return;

    打印结果:(运行不报错,但会打印提示信息,并返回nil结果)
    NIL invoke at:__main__(local) line: 3
    NIL [] get at:__main__(local) line: 3

    array(NIL,NIL)
    2024-09-19 16:01:39 Load Trade GateWay(TT_CTP_GATEWAY.DLL) ok.


    相关知识点:FAQ:Q:TSL语言中异常值计算