loadrunner指令碼編寫二
今天有朋友問我,關於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 iteration1.
函式
函式,通常 一小段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指令碼編寫的內容要根據實際意義一些指令碼進行分析。