FAQ > 金融建模 > 建模问题 > 如何调试程序

Q:在天软程序中如何返回中间变量的值    

  • A:第一种方式,可以设置断点进行程序调试,相关操作请查看:FAQ:Q:怎么设置断点调试?

    第二种方式,可借助echo , DebugRunEnv, DebugRunEnvdo,debugreturn等函数的功能来查看程序运行过程中的变量情况。

    Echo:程序执行过程中打印信息到客户端。显示为字符串。
     适合简单类型的变量值输出,如循环中跟踪变量。

    DebugRunEnv(f:Boolean):程序结束时返回当时程序中所有变量的值。其中,f为true则输出结果中包括系统参数,为false则不包括。
      适合需要同时查看多个变量值时。程序只会返回一次结果,多次调用时后面的会覆盖前面的值。

    DebugRunEnvdo:程序结束时返回调用子函数执行完时该子函数在结束时的所有中间变量的值,不包括主程序的。不影响程序的正常运行。
      适合查看子函数变量值。程序只会返回一次结果,多次调用时后面的会覆盖前面的值。

    Debugreturn:在任意指定位置终止程序,并返回此时指定变量的值。
      适合程序中调用了多层子函数时,想返回执行到某一步时的某个变量的值。

    范例1:echo , DebugRunEnv, DebugRunEnvdo用法案例

    Function NoName6();
    Begin
      IndexID:='SH000300';
      Endt:=20190321T;
      sEndt:=datetostr(Endt);
      echo sEndt;//打印变量值
      //返回子函数执行完时所有中间变量的值
      stocks:=DebugRunEnvdo getStocksTest(IndexID,Endt);
      //运行到此时,输出所有中间变量的值,1输出结果中包括系统参数,0则不包括
      DebugRunEnv(1);
      data:=select sEndt as '截止日',*,spec(close(),['代码']) as '现价'
      from stocks end;
      return data;
    End;
    function getStocksTest(id,t); //选出PE最大的五支票
    begin
      //打印
      echo '当前程序:',functionname(),' 指数:',id,' 日期:',datetostr(t);
      bk:=getbkbydate(id,t);
      peS:=select thisrow as '代码',spec(stockpe(t,0),thisrow) as 'PE' from bk end;
      reS:=select *,thisorder as '排名' from peS order by ['PE'] desc end;
      reS:=select * from reS where ['排名']<=5 end;
      return reS;
    end
    //返回四个结果框

    运行信息:

    Noname6:getstockstest:

    Noname6: DebugRunEnv(1)返回的结果


    范例二:Debugreturn的应用

    Function NoName7();
    Begin
      IndexID:='SH000300';
      Endt:=20190321T;
      sEndt:=datetostr(Endt);
      stocks:=getStocksTest(IndexID,Endt);
      data:=select sEndt as '截止日',*,spec(close(),['代码']) as '现价'
      from stocks end;
      return data; //正常情况下程序到这里结束,并返回data
    End;
    function getStocksTest(id,t); //选出PE最大的五支票
    begin
      bk:=getbkbydate(id,t);
      peS:=select thisrow as '代码',spec(stockpe(t,0),thisrow) as 'PE' from bk end;
      reS:=select *,thisorder as '排名' from peS order by ['PE'] desc end;
      reS:=select * from reS where ['排名']<=5 end;
      debugreturn reS;//有这一句,则整个程序到这里结束,并返回reS
      return reS;
    end
    //返回