下述的程式段,主要是以全域變數的矩陣變數作為說明。全域變數會消耗記憶體RAM,宣告越多消耗越多,若是宣告較大的矩陣空間,消耗十分驚人。(副程式是作為節省記憶體ROM所用)
以程式範例來做說明 :
void sub_1(void) ; // 宣告副程式
int var1[5]={1,2,3,4,5}; // 宣告全域變數,並定義初始值
// 矩陣變數進、出副程式
int main(void)
{
sub_1( ) ; // 代入副程式
sub_1( ) ; // 代入副程式
sub_1( ) ; // 代入副程式
while(1);
}
// 將重複的程式段,以副程式包起。(節省記憶體)
void sub_1(void)
{
int i;
for(i=0;i<5;i++){
var1[i] *= 2;
var1[i] += 1;
var1[i] *= 4;
}
}
下述程式段是以區域矩陣變數來取代全域矩陣變數,即可節省記憶體RAM :
1. 區域變數不會消耗記憶體RAM
需求 : 為了同時節省記憶體RAM、ROM
1. 使用區域變數
2. 使用副程式化
問題 :
1. 區域矩陣變數無法直接代入副程式運算後代出。
原因 :
1. 區域變數在離開副程式後即會將位址歸還。
解決方法 :
1. 將區域變數以指標形態做宣告,將變數位址化。
2. 進入副程式時只需要將位址代入,即可在原先的區域變數位址上進行運算。
改善後的程式段 :
void sub_1(int *Inv) ; // 宣告副程式
int main(void)
{
int var[5]={1,2,3,4,5}; // 宣告矩陣變數
int *p = &var[0]; // 定義指標變數
sub_1(p) ; // 將指標位址代入副程式中
sub_1(p) ; //
sub_1(p) ; //
while(1);
}
void sub_1(int *Inv)
{
int i;
for(i=0;i<5;i++)
*(Inv+i) = *(Inv+i) * 10;
}
留言列表