51Testing软件测试论坛

标题: Lr中的for循环越界问题 [打印本页]

作者: hanyuan72    时间: 2010-6-1 16:07
标题: Lr中的for循环越界问题
update:原来的代码因为转码的原因去掉了方括号,更新为

LR脚本如下:
----------------------------------------------------------
Action()
{
int i;

char j[10][20];
int count=10;

//循环1:i最大为10
for (i=1;i<=10;i++) {
sprintf(j[i],"abc",i);
lr_output_message("√ j%d=%s\n",i,lr_eval_string(j[i]));
}

//循环2:i最大为11
for (i=1;i<=count;i++) {
sprintf(j[i],"abc",i);
lr_output_message("× j%d=%s\n",i,lr_eval_string(j[i]));
}
return 0;
}
----------------------------------------------------------
这是简化后的脚本 ,[color=#ff0000]问题是:为什么加了变量的循环会越界[/color]
脚本说明:
通过循环对数组赋值,循环用常量赋值则一切正常,如用自定义变量则会越界,比如上例中count=10,结果存在i=11的情况,这时lr会报错
[font=mceinline]——难道是C语言编译器的问题?这样的结果岂不是不能用变量做for边界?
以上脚本可以贴到action中直接运行,有兴趣的可以试试,欢迎高手解惑:)

-----------------------------------------Ps:我的运行结果--------------------------------
Virtual User Script started
Starting action vuser_init.
Web Turbo Replay of LoadRunner 8.1.0 for WIN2003; Web build 4788 [MsgId: MMSG-27143]
Run-Time Settings file: "C:\Documents and Settings\robin\Local Settings\Temp\noname4\\default.cfg" [MsgId: MMSG-27141]
Ending action vuser_init.
Running Vuser...
Starting iteration 1.
Starting action Action.
Action.c(8): √ j1=abc
Action.c(8): √ j2=abc
Action.c(8): √ j3=abc
Action.c(8): √ j4=abc
Action.c(8): √ j5=abc
Action.c(8): √ j6=abc
Action.c(8): √ j7=abc
Action.c(8): √ j8=abc
Action.c(8): √ j9=abc
Action.c(8): √ j10=abc
Action.c(14): × j1=abc
Action.c(14): × j2=abc
Action.c(14): × j3=abc
Action.c(14): × j4=abc
Action.c(14): × j5=abc
Action.c(14): × j6=abc
Action.c(14): × j7=abc
Action.c(14): × j8=abc
Action.c(14): × j9=abc
Action.c(14): × j10=abc

Action.c(14): Error: C interpreter run time error: Action.c (14): Error -- memory violation : Exception ACCESS_VIOLATION received.
Action.c(14): Error: An exception was raised while calling invocation function in interpreter extension cciext.dll: System Exceptions: EXCEPTION_ACCESS_VIOLATION.
Ending Vuser...
Starting action vuser_end.
Action.c(14): Notify: CCI trace: Action.c(14): vuser_end()
.
Action.c(14): Notify: CCI trace: pop[1] -> 0
.
Ending action vuser_end.
Vuser Terminated.

[[i] 本帖最后由 hanyuan72 于 2010-6-3 16:25 编辑 [/i]]
作者: msnshow    时间: 2010-6-1 22:31
你改一下 char j[10][20];
改为 char j[11][20]; 就行了
作者: qzj_test    时间: 2010-6-2 08:40
啥子东西,还要积分
作者: peag    时间: 2010-6-2 08:54
C语言不过关,这样的错误都犯了
作者: xavier_007    时间: 2010-6-2 11:43
c的下标是从0开始的,10下标就是第11个元素
作者: a598824322    时间: 2010-6-2 14:08
标题: 回复 1# 的帖子
基础问题
作者: hanyuan72    时间: 2010-6-3 16:08
标题: 回复 2# 的帖子
如果说只是0~9和1~10的问题,为何count换成10不越界:)

//循环1:i最大为10
for (i=1;i<=10;i++) {
sprintf(j[i],"abc",i);
lr_output_message("√ j%d=%s\n",i,lr_eval_string(j));
}
作者: hanyuan72    时间: 2010-6-3 16:18
标题: 请各位看清楚问题:为何常量不越界,而变量会越界,谢谢:)
请各位看清楚问题:为何常量不越界,而变量会越界,谢谢:)
即使把变量改为count=9,循环改为0~9一样会越界——不是下标问题
for (i=0;i<=count;i++) {
sprintf(j[i],"abc",i);
lr_output_message("× j%d=%s\n",i,lr_eval_string(j[i]));
}

而同样的写法在C++里是不会越界——也不是C问题
# include "ostream"
int main() {
  int i;
  char j[10][20];
  int cnt;
  cnt=5;

  //循环1:i最大为10
  for (i=1;i<=5;i++) {
strcpy(j[i],"abc");
  printf("√ j%d=%s\n",i,j[i]);
  }

  //循环2:i最大为11
  for (i=1;i<=cnt;i++) {
strcpy(j[i],"abc");
  printf("* j%d=%s\n",i,j[i]);
  }

  return (0);
}

——这是loadrunner的问题!!!
作者: hanyuan72    时间: 2010-6-3 16:19
标题: 回复 3# 的帖子
要什么积分?不用回复的人付吧?




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2