zoukankan      html  css  js  c++  java
  • lr 函数--lr_save_string

    lr_eval_string   返回脚本中一个参数当前的值

    Returns the string argument after evaluating embedded parameters.一般都用在调试脚本时输出参数的值。

    lr_save_string   ——Saves a null-terminated string to a parameter.

    帮助文档里:

    char *lr_eval_string( const char *instring );
     
    例子:下面的例子使用lr_eval_string来代替参数row_cnt的当前值。使用lr_output_message把这个值输出到输出窗口。
    lrd_stmt(Csr1, "select count(*) from employee", -1, 1 /*Deferred*/, 2 /*Ora V7*/, 0);
     
    lrd_bind_col(Csr1, 1, &COUNT_D1, 0, 0);
     
    lrd_exec(Csr1, 0, 0, 0, 0, 0);
     
    lrd_save_col(Csr1, 1, 1, 0, "row_cnt");
     
    lrd_fetch(Csr1, 1, 1, 0, PrintRow2, 0);
    lr_output_message("value : %s",  lr_eval_string("The row count is: {row_cnt}"));
    lr_log_message(lr_eval_string("{row_cnt}"));
    注:lr_eval_string是内部地分配内存。在每一次迭代之后会释放。如果你在循环中给参数赋值,不要使用lr_eval_string保存内存。你需要使用lr_eval_string_ext,并且在每个循环迭代中使用lr_eval_string_ext_free释放内存。
    lr_eval_string_ext在关联的数据是二进制数据,例如,数据包含嵌入的NULL字符时是非常有用的。
     
    问题:常量参数?
    示例代码1:
       const char * data="abcd";
       char * data1,data2,data3 ;
       lr_message("data value: %s",data);
       lr_save_string(data,"data1"); 
       lr_message("data1 value: %s",lr_eval_string("{data1}"));
       
       lr_convert_string_encoding(data,LR_ENC_UTF8,LR_ENC_SYSTEM_LOCALE,"data2");
       lr_message("data2 value : %s",lr_eval_string("{data2}"));
    lr_convert_string_encoding这行时,编译不通过,type error in argument 1 to `lr_convert_string_encoding'; found `pointer to const char' expected `pointer to char' 
    修改代码,将data的定义中const去掉,则可直接运行成功。
    Starting action Action.
    data value: abcd
    Action.c(6): Notify: Saving Parameter "data1 = abcd".
    Action.c(7): Notify: Parameter Substitution: parameter "data1" =  "abcd"
    data1 value: abcd
    Action.c(9): Notify: Saving Parameter "data2 = abcdx00".
    Action.c(10): Notify: Parameter Substitution: parameter "data2" =  "abcdx00"
    data2 value : abcd
    Ending action Action.

    问题来了,那这个data参数就是这样定义的,不能改变呢。如果用lr_eval_string函数,

       const char * data="abcd";
       char * data1,data2,data3 ;
       lr_message("data value: %s",data);   
       lr_convert_string_encoding(lr_eval_string("{data}"),LR_ENC_UTF8,LR_ENC_SYSTEM_LOCALE,"data2");
       lr_message("data2 value : %s",lr_eval_string("{data2}"));

    运行结果有误:

    Starting action Action.
    data value: abcd
    Action.c(6): Warning: The string 'data' with parameter delimiters is not a parameter.
    Action.c(6): Notify: Saving Parameter "data2 = {data}x00".
    Action.c(7): Notify: Parameter Substitution: parameter "data2" =  "{data}x00"
    data2 value : {data}
    Action.c(9): Notify: Saving Parameter "data1 = abcd".
    Action.c(10): Notify: Parameter Substitution: parameter "data1" =  "abcd"
    data1 value: abcd

    将data保存成一个参数,再对值转换。

       const char * data="abcd";
       char * data1,data2,data3 ;
       lr_message("data value: %s",data);   
    //   lr_convert_string_encoding(lr_eval_string("{data}"),LR_ENC_UTF8,LR_ENC_SYSTEM_LOCALE,"data2");
    //   lr_message("data2 value : %s",lr_eval_string("{data2}"));
          
       lr_save_string(data,"data1"); 
       lr_message("data1 value: %s",lr_eval_string("{data1}"));   
       lr_convert_string_encoding(lr_eval_string("{data1}"),LR_ENC_UTF8,LR_ENC_SYSTEM_LOCALE,"data3");  
       lr_message("data3 value : %s",lr_eval_string("{data3}"));

    结果:

    Starting action Action.
    data value: abcd
    Action.c(9): Notify: Saving Parameter "data1 = abcd".
    Action.c(10): Notify: Parameter Substitution: parameter "data1" =  "abcd"
    data1 value: abcd
    Action.c(11): Notify: Parameter Substitution: parameter "data1" =  "abcd"
    Action.c(11): Notify: Saving Parameter "data3 = abcdx00".
    Action.c(12): Notify: Parameter Substitution: parameter "data3" =  "abcdx00"
    data3 value : abcd
    Ending action Action.

    总结:

    1)遇到const 取值时,去掉const

    2)将const值保存成另一个参数,通过对新值操作。

    这里只是简单的使用例子,这里为啥会用到要对参数值转换呢?比如乱码需要转码时。

     问题:在对服务器返回值重命名时部分值被去掉了

     具体描述:通过关联取值str,str中带%2等字符,在用函数值重命名后的新字符串中的%2没有了。在新脚本中尝试一下。

     测试版本:LR12.02

     测试代码:自定义字符串、参数列表中取值,分别使用sprintf、lr_save_string函数转换并输出结果

    Action()
    {
        char * str = "sdf%2Fdcdegdfs%2opied";
        char file[100],file1[100];
        
        //对直接定义的字符串重命名
        lr_save_string(str,"strnew");
        lr_output_message("str value : %s",str);
        lr_output_message("strnew value : %s",lr_eval_string("{strnew}"));
        
        sprintf(file, "%s", str);
        lr_output_message("file value : %s",file);
        
        //对参数列表中的值重命名
        lr_output_message("value : %s",lr_eval_string("{Pname}"));    
        lr_save_string(lr_eval_string("{Pname}"),"strnew1");
        lr_output_message("strnew1 value : %s",lr_eval_string("{strnew1}"));
        sprintf(file1, "%s", lr_eval_string("{Pname}"));
        lr_output_message("file1 value : %s",file1);    
    
        return 0;
    }
    View Code

     测试结果:

    Starting iteration 1.
    Maximum number of concurrent connections per server: 6      [MsgId: MMSG-26989]
    Starting action Action.
    Action.c(7): str value : sdf%2Fdcdegdfs%2opied
    Action.c(8): strnew value : sdf%2Fdcdegdfs%2opied
    Action.c(11): file value : sdf%2Fdcdegdfs%2opied
    Action.c(14): value : sdf%2Fdcdegdfs%2opied
    Action.c(16): strnew1 value : sdf%2Fdcdegdfs%2opied
    Action.c(18): file1 value : sdf%2Fdcdegdfs%2opied
    Ending action Action.
    Ending iteration 1.
    View Code

    测试结论:新字符串%2正确显示的,并未被去掉。在后续测试时,这项再注意下。

     
  • 相关阅读:
    getSupportFragmentManager要用在FragmentActivity及其子类中
    nginx 配置php
    openwrt 安装 ser2net 配置
    stm32 hid 键盘描述
    外部中断实验
    stm32 UART串口
    stm32 按键
    小结-stm32 驱动LED灯
    ASCII 计算机码
    debian/ubuntu安装桌面环境
  • 原文地址:https://www.cnblogs.com/kongzhongqijing/p/7000078.html
Copyright © 2011-2022 走看看