LoadRunner脚本编写之二

编程基本语法必须要记牢。程序的思想也很重要。

下面来回顾一下嵌套循环例子。

Action()
{
    int 
i,j;   //生命两个变量
    for (i=1;i<=5;i++)   //第一重循环,循环5次
    {
        if (i==3)   
            break;   //当i等于3时,跳出本重循环
        else
             lr_output_message("i=%d",i);  //否则,输入i的值

for (j=1;j<=5;j++)  //第二重循环,循环5次
        {
            if (j==2)  
                break;   //当j等于2时,跳出本重循环
            else
            
lr_output_message("j=%d",j); 
//否则,输入j的值
        }
    }
}

上面的代码中我加了注释,这里就不用再解释。

运行结果:

Starting iteration 1.
Starting action Action.
Action.c(9): i=1
Action.c(16): j=1
Action.c(9): i=2
Action.c(16): j=1
Ending action Action.
Ending iteration 1.

函数
                     
                     
                     
              

函数,通常 一小段C语言程序仅有一个main()函数组成。然而,在实际编写应用程序中,需要开发人员编写大量的用户自定交函数,不仅要在程序中定义函数本身,而且在主调函数模块中还必须对该被调函数进行类型说明,然后才能使用,与用户自定义函数相对应的是函数库,C语言集成开发环境(IDE)提供,我们只要调用就是行了。就就所谓前人种树,后人乘凉,不然看似一个简单的东西,寻其源头来做,都是一个相当复杂的过程。

void SsyHello()  //打招呼函数
{
    lr_output_message("hello
%s",lr_get_host_name());
}

int GetBigger(int x,int y)  //得到最大值函数
{
    if (x>y) {
        return x;
    }
    else{
        return y;
    }

}

Action(){
    int x=10,y=20, result;   //声明变量

SsyHello();  //无形参,无返回值函数
    result = GetBigger(x,y);
   
lr_output_message("GetBigger(%d,%d)=%d",x,y,result);  //带形参,带返回值函数

return 0;
}

上面的程序加注解了,简单来说就是前面定义了两个函数SsyHello() 和 GetBigger(),主函数Action()对前面两个函数进行调用。

运行结果:

Starting iteration 1.
Starting action Action.
Action.c(4): hello 2011-20120624YO
Action.c(23): GetBigger(10,20)=20
Ending action Action.
Ending iteration 1.

动态存储方式与静态存储方式
                     
                     
  

我们在定义变量时,根据定义的位置不同,分为全局变量与局部变量。我出生在一个叫“舞阳”的小县城,在这个县城中也有人名“舞阳”,前一个作用于整个县城,后一个只作用于他个人。那么从变量值的存在生存期角度,又可分为静态存储方式和动态存储方式两类。

静态存储方式:是指在程序运行期间分配固定的存储空间方式。

动态存储方式:是在程序运行期间根据需要进行动态的分配存储空间的方式。

用户存储空间可分三部分:

1、程序区

2、静态存储区

3、动态存储区

全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序运行完毕就释放,在程序执行过程中它们占据固定的存储单元,而不动态地进行分配和释放。

  动态存储区存放以下数据

(1)函数形式参数

(2)自动变量(未加static声明的局部变量)

(3)函数调用时的现场保护和返回地址

上面这些数据,在函数开始调用时分配动态空间,函数结果时释放这些空间。

在C语言中,每个变量和函数有两个属性:数据类型和数据的存储类别

* 自动(auto)变量

函数中的局部变量,如不专门的声明为static存储类别,都是动态地分配存储空间的。

* 静态(static)声明局部变量

有时希望函数中的局部变量的值在函数调用结束后不消失而保留,这时就应该指定局部变量为“静态局部变量”,用static关键字。

*  寄存器(register)变量

为了提高效率,C语言允许把局部变量的值放在CPU中的寄存器中,这种变量叫“寄存器变量”,用关键字register变量。

static int c;

int prime(register int number)   //判断是否为素数
{
    register int flag=1;
    auto int n;
    for (n=2;n<number/2 &&
flag==1;n++) {
        if (number % n==0) flag=0;
    return(flag);   
       
    }
}

demo(int a)    //static、auto变量的演示函数
{
    auto int b=0;
    int d;
    static c=3;
   
b=b+1;
    c=c+1;
    lr_output_message("demo()函数中的d=%d",d);
    lr_output_message("demo()函数中的static c=%d",c);
    return a+b+c;

}
Action(){
    int a=2,i;   //变量声明

for (i=0;i<3;i++) {
        lr_output_message("demo()函数部分第%d运行情况如下:",i+1);
        lr_output_message("函数demo运行结果为:%d",demo(a));
       
lr_output_message("-------------------\n\r");
    }

//判断13是否为素数,并输出提示信息
    if (prime(13)==0)
        lr_output_message("13不是素数!");
    else
        lr_output_message("13是素数!");

lr_output_message("c=%d",c);  //输入变理的值

return 0;
}

素数:指大于1的自然数,除了1和它本身不能被其它数整除的数。prime()函数部分主要用来判断传入的数是否是素数。

demo()函数用来做static和auto类型的变量演示。Action()函数用于调用与输入结果。

运行结果

Starting iteration 1.
Starting action Action.
Action.c(31): demo()函数部分第1运行情况如下:
Action.c(22): demo()函数中的d=51446257
Action.c(23): demo()函数中的static c=4
Action.c(32): 函数demo运行结果为:7
Action.c(33): -------------------

Action.c(31): demo()函数部分第2运行情况如下:
Action.c(22): demo()函数中的d=51446257
Action.c(23): demo()函数中的static c=5
Action.c(32): 函数demo运行结果为:8
Action.c(33): -------------------

Action.c(31): demo()函数部分第3运行情况如下:
Action.c(22): demo()函数中的d=51446257
Action.c(23): demo()函数中的static c=6
Action.c(32): 函数demo运行结果为:9
Action.c(33): -------------------

Action.c(40): 13是素数!
Action.c(42): c=0
Ending action Action.
Ending iteration 1.

指针
                     
                     
                     
                    

指针是C语言中广泛使用的一种数据类型,指针可以使我们的程序变得非常灵活,但也让不少程序员头痛,一不小心就会使程序出错。

指针一般指向一个函数或一个变量。在使用一个指针时,一个程序既可以直接使用这个指针所储存的内存地址,又可以使用这个地址里储存的变量或函数的值。

有一本很厚小说,为了便于读者找到某一段内容,我们会给某一段内容起一个小标题并标注上页数。这样找起来就非常方便了。那在内存中,小标题页数就相当于内存单元的指针,具体的小说内容就是内存单元的内容。

Action(){
    int score[5]={100,98,78,55};   //一维数组
    int *p=score;         //一维数组指针
    int
sixnum[2][3]={{1,2,3},{4,5,6}};  //二维数组
    int (*p1)[3];        //二维数组指针
    int i,j;      //定义两个变量

for (i=0;i<=4;i++) {
       
lr_output_message("score[%d]=%d",i,score[i]);  //以下标形式标识数组
       
lr_output_message("*(p++)=%d",*(p++));   //以指针方式输出数组
    }
   
lr_output_message("--------------------------");

p=score;
    for (i=0;i<=4;i++) {
        lr_output_message("score[%d]=%d",i,score[i]);  //以下标形式标识数组
       
lr_output_message("*(p+%d)=%d",*(p+i));   //以指针方式输出数组
    }
   
lr_output_message("--------------------------");

p1=sixnum;
    for (i=0;i<=1;i++) {
        for (j=0;j<=2;j++) {
             lr_output_message("sixnum[%d][%d]=%d",i,j,sixnum[i][j]);   //以下标形式标识数组
            
lr_output_message("*(*(p1+%d)+%d)=%d",*(*(p1+i)+j));  //以指针方式输出数组
        }

}
   
    return 0;
}

运行结果

Starting iteration 1.
Starting action Action.
Action.c(11): score[0]=100
Action.c(12): *(p++)=100
Action.c(11): score[1]=98
Action.c(12): *(p++)=98
Action.c(11): score[2]=78
Action.c(12): *(p++)=78
Action.c(11): score[3]=55
Action.c(12): *(p++)=55
Action.c(11): score[4]=0
Action.c(12): *(p++)=0
Action.c(14): --------------------------
Action.c(18): score[0]=100
Action.c(19): *(p+100)=0
Action.c(18): score[1]=98
Action.c(19): *(p+98)=0
Action.c(18): score[2]=78
Action.c(19): *(p+78)=0
Action.c(18): score[3]=55
Action.c(19): *(p+55)=0
Action.c(18): score[4]=0
Action.c(19): *(p+0)=0
Action.c(21): --------------------------
Action.c(26): sixnum[0][0]=1
Action.c(27): *(*(p1+1)+0)=54385392
Action.c(26): sixnum[0][1]=2
Action.c(27): *(*(p1+2)+0)=54385392
Action.c(26): sixnum[0][2]=3
Action.c(27): *(*(p1+3)+0)=54385392
Action.c(26): sixnum[1][0]=4
Action.c(27): *(*(p1+4)+0)=54385392
Action.c(26): sixnum[1][1]=5
Action.c(27): *(*(p1+5)+0)=54385392
Action.c(26): sixnum[1][2]=6
Action.c(27): *(*(p1+6)+0)=54385392
Ending action Action.
Ending iteration 1.

本章节算做对C语言一些概念性知识的回味道吧。后面再写关于loadrunner脚本编写的内容要根据实际意义一些脚本进行分析

LoadRunner脚本编写之二的更多相关文章

  1. LoadRunner脚本编写(转)

    性能测试工程师要懂代码么?答案是必须的.好多测试员认为在loadrunner中编写脚本很难很牛X ,主要是大多测试人员并未做过开发工作,大学的那点程序基础也忘记的差不多了.还有非计算机专业出身的测试员 ...

  2. LoadRunner脚本编写

    性能測试project师要懂代码么?答案是必须的.好多測试员觉得在loadrunner中编写脚本非常难非常牛X ,主要是大多測试人员并未做过开发工作,大学的那点程序基础也忘记的几乎相同了. 还有非计算 ...

  3. LoadRunner脚本编写(6)— 数据类型转换和字符串操作

    LoadRunner脚本编写(6)— 数据类型转换和字符串操作 一,数据类型转换 没有使用过C编程的LoadRunner脚本编写者会发现在数据类型转化方面比较困难.下面介绍这方面的知识. 1. 相似函 ...

  4. LoadRunner脚本编写之三(事务函数)

    LoadRunner脚本编写之三(事务函数) 关于脚本的这块,前两篇都在讲C语言,其实,要整理点实用的东西挺难,在应用中多对录制的脚本分析,但对于新手学脚本确实无从下手. 先贴一个脚本: 完整代码: ...

  5. LoadRunner脚本编写之一

    LoadRunner脚本编写之一 性能测试工程师要懂代码么?答案是必须的.好多测试员认为在loadrunner中编写脚本很难很牛X ,主要是大多测试人员并未做过开发工作,大学的那点程序基础也忘记的差不 ...

  6. LoadRunner脚本编写(5)-- 检查点,关联等函数

    LoadRunner脚本编写(5)-- 检查点,关联等函数 http://www.51testing.com/?34866/action_viewspace_itemid_70224.html来继续翻 ...

  7. loadrunner脚本编写经验

    最近写了不少loadrunner脚本,记录一下心得:1 loadrunner脚本基本可以认为就是c语言代码(loadrunner支持不同语言的脚本,默认生成的是用c语言写的脚本)2 loadrunne ...

  8. loadrunner脚本编写http协议

  9. Loadrunner Webservice接口性能测试脚本编写优化总结

    本文主要介绍使用Loadrunner Webservice接口性能测试脚本编写及优化总结. 1.Webservice协议脚本编写流程 下面介绍使用Loadrunner 11调用Webservice接口 ...

随机推荐

  1. Visual Studio 2019社区版:错误 MSB6006 “CL.exe”已退出,代码为 2

    系统:win10 环境:Visual Studio 2019社区版 问题:错误 MSB6006 “CL.exe”已退出,代码为 2 解决方法: 1 一个类内部的定义返回类型为double的方法种没有写 ...

  2. uboot驱动模型(DM)分析(二) (转)

    上篇分析了两个关键宏U_BOOT_DRIVER及U_BOOT_DEVICES的作用,有了上篇的基础,本文将分析: 1.上篇中的uboot_list段中的信息如何被用起来? 2.uclass,uclas ...

  3. AspectJ注解支持

    <aop:aspectj-autoproxy/> 配置aspectj启动 AspectJAutoProxyBeanDefintionParser implements BeanDefini ...

  4. Systemd-journalctl日志管理

    Systemd 统一管理所有 Unit 的启动日志.带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志).日志的配置文件/etc/systemd/journald. ...

  5. substring和substr的区别

    substring和subsrt都是获取指定位数 字符串的方法: 语法: substring(start,end)/substring(one); substr(start,end)/substr(o ...

  6. ESP8266常见问题汇总——转载自官网

    ESP8266 常见问题 本页面收集esp8266常见问题 概述 本文档主要介绍开发者在ESP8266开发中常见的一些问题. 这些问题主要包括以下几大类: 基本概念相关 ESP8266 相关 AiCl ...

  7. Web前端开发——概述

    前端技术构成: 结构:html,从语义的角度,描述页面结构 样式:css,从审美的角度,美化界面样式 行为:JavaScript,从交互的角度,提升用户体验 前端技术标准: 前端技术的标准就是由W3C ...

  8. Springboot项目报错【java.base/jdk.internal.loader.ClassLoaders$AppClassLoader cannot be cast to java.base/java.net.URLClassLoader】

    1.发生问题: 升级了JDK9,发现原先的springboot项目起不来了,以为是maven中jdk配置有问题. 于是在pom中添加了 <plugin> <groupId>or ...

  9. sklearn PCA的使用

    import numpy as np from sklearn.decomposition import PCA # 训练数据 train_data = np.array([[1, 2, 3], [4 ...

  10. Spring——5种增强方式

    一.前置增强 二.后置增强 三.环绕增强  环绕增强相当于前置增强和后置增强的结合体,可以使用<aop:around>进行处理,这里我采用代理工厂的方式 1.接口及其实现类 public ...