zoukankan      html  css  js  c++  java
  • LR中的C语言问题

      今天在调试LR的脚本(C)时遇到了几个甚是头痛得问题,下面简单总结下:

    1、首先LR中的C编译器遵循C90标准,规定在一个函数中,变量定义必须放在所有的执行语句之前!一旦在运行语句之间再有定义的话,会报错误!在实际写代码是经常会犯这个错误。不过对于函数外的全局变量就没有这个规定了(用于运行 Vuser 脚本的 C 解释器仅支持 ANSI C 语言。它不支持Microsoft 对 ANSI C 的任何扩展)。

    向Vuser脚本中添加任何C函数前,请注意下列限制:

    ➤ Vuser 脚本不能将其中某个函数的地址作为回调传递给库函数。
    ➤ Vuser 脚本不支持 stdargs、 longjmp 和 alloca 函数。
    ➤ Vuser 脚本不支持结构参数或返回类型。支持指向结构的指针。
    ➤ 在 Vuser 脚本中,字符串为只读。任何写入字符串的尝试都将生成访问冲突。
    ➤ 必须转换不返回 int 的 C 函数。例如, extern char * strtok();

    2、当在LR中定义一个数组时,数组的大小是有限制的,当定义的局部变量数组过大时会报如下的错误(实际发生错误的定义数组的语句在第3行):

         

      在我的机器上LR中定义数组的大小为1000000或100000都会出现这个问题,相同机器的VS中定义数组大小定义1000000时正常,但是再大一个数量级运行时也会出问题。所以数组定义的大小不要太大(跟具体机器的栈大小有关),我的机器(32位 4G内存)上LR中可定义的局部数组变量大小最大大概为32736(约32K),注意这个值是局部变量数组所能申请到的最大字节值,全局的数组变量可定义的总大小大一些,我的机器上这个值大概为642000000稍大一点(约642M)。超过最大值会报如下的错误。当需要的空间较大,数组不能满足时可以使用动态内存分配在堆中申请内存空间,另外,当处理的数据量或文件很大时考虑进行流的分部处理(一部分一部分的处理)。

    Run-Time Settings file: "E:yProgramyLR estEnc\default.cfg" [MsgId: MMSG-27141]
    Error: An exception was raised while calling invocation function in interpreter extension cciext.dll: System Exceptions: EXCEPTION_ACCESS_VIOLATION.

    3、在LR中定义文件句柄:FILE *fp; 会如下报错:

        

      可知,LR的编译器并不认识FILE类型,但当要写文件操作时怎么办?这里的解决办法就是直接定义一个long类型的变量,如:long fp;fopen函数打开的文件赋给fp即可。

    4、以下是字符数组的错误初始化方法:

      char p[100];
      p = "asdgasdg";  

      正确应该为:char p[100] = "asdgasdg";

      但是这样写是错误的:char p[100] = lr_eval_string("{testParam}");

      以下几种也都是正确的写法:

      1、char p[100]; strcpy(p, lr_eval_string("{testParam}"));

      2、char p[100]; sprintf(p,"%s",lr_eval_string("{testParam}"));

      3、char *p = NULL; p = lr_eval_string("{testParam}");

     

    5、fwrite()函数调用问题,函数原型是:size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream),参数说明如下:

    (1)buffer:是一个指针,对fwrite来说,是要获取数据的地址;
    (2)size:要写入内容的单字节数;
    (3)count:要进行写入size字节的数据项的个数;
    (4)stream:目标文件指针;
    (5)返回实际写入的数据项个数count。
      当要写入的buffer中的数据是大小为50K的字符串时,设置size为50K,count为1,写入会有问题,写入的数据会不完整(没有完全写入),这里如果设置size为1,count为50K,则写入就正常了。why?看来还待继续学习C语言了。
     
    6、小技巧:在输出语句lr_output_message中加上Notify:能使输出的语句在输出日志中蓝色高亮显示,如:lr_output_message("Notify:当前用户: %s", buffer);

    示例代码:

     1 Action()
     2 {
     3     char *q = lr_eval_string("{canshu}");
     4     int i = strlen(q);
     5 
     6     //FILE *fp;
     7     long fp;
     8     int count;
     9 
    10     lr_output_message("q: %s",q);
    11     lr_output_message("i = %d",i);
    12 
    13 
    14     if((fp = fopen("e:\filename","wt")) == NULL)
    15     {
    16         lr_output_message("Open File Failed!");
    17          return -1;
    18     }
    19 
    20     count = fwrite(q,1,i,fp);
    21 
    22 
    23     lr_output_message("count = %d",count);
    24     fclose(fp);
    25 
    26     return 0;
    27 }
  • 相关阅读:
    mysqladmin
    Android project structure in Eclipse
    Android System Architecture
    The Origins of Data Mining
    Ubuntu 12.04 ‘can not lock /etc/shadow try again later’
    20122013QS计算机专业世界大学排名
    What is Data Mining
    HOW to login MYSQL, Help, and Select Database
    C++函数指针与C#委托之间有何联系
    How to download codes from Google Code
  • 原文地址:https://www.cnblogs.com/yezhaohui/p/3283995.html
Copyright © 2011-2022 走看看