線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1300
推到 Plurk!
推到 Facebook!

請問有關外部變數使用的問題

答題得分者是:aftcast
chang1981
一般會員


發表:31
回覆:28
積分:11
註冊:2008-09-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-10-29 14:50:43 IP:61.230.xxx.xxx 訂閱
各位前輩好  小弟最近在寫一個小工具軟體時碰到了共用全域變數的問題
首先簡述一下我想要達成的目標

目標: 我想要宣告一個程式處理當中會參考到的臨界值TH, 並給定TH初始值為100,此TH必須可以被任何有參考到的程式檔案修改
且修改後的值會一直保持住, 不會因為程式跳到別的檔案的function當中而又變回初始值100

EX:有兩個程式檔以及對應的兩個標頭檔 AAA.cpp AAA.h BBB.cpp BBB.h,
AAA下內含一function AAA_F()
BBB下內含一function BBB_F()

step1. 程式的順序一開始會先跑AAA_F() 此時我希望AAA_F()可以參考到TH=100
step2. 接下來呼叫 BBB_F() , 且BBB_F()會將TH的值改為50
step3. 程式如果又再跑到AAA_F(), 我希望AAA_F()抓到的TH值為50

我曾經嘗試過
AAA.cpp 宣告全域變數 static int TH=100;
BBB.cpp宣告 extern int TH;
如此寫法雖可以在BBB_F()取得TH=100並修改TH值=50
但重新呼叫AAA_F()值時 TH又變回100了
我想這是因為AAA.cpp又重新宣告了TH並且初始化TH=100
但我不知道這樣的狀況應該怎樣解決

因此想請問高手前輩們
應該用怎樣的宣告方式才能達到讓TH可以被每個檔案參考 且能保持被修改的值
感謝大家!!!




syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-10-30 11:08:33 IP:59.125.xxx.xxx 訂閱
AAA.h 宣告全域變數 static int TH=100;
===================引 用 chang1981 文 章===================
各位前輩好 小弟最近在寫一個小工具軟體時碰到了共用全域變數的問題
首先簡述一下我想要達成的目標

目標: 我想要宣告一個程式處理當中會參考到的臨界值TH, 並給定TH初始值為100,此TH必須可以被任何有參考到的程式檔案修改
且修改後的值會一直保持住, 不會因為程式跳到別的檔案的function當中而又變回初始值100

EX:有兩個程式檔以及對應的兩個標頭檔 AAA.cpp AAA.h BBB.cpp BBB.h,
AAA下內含一function AAA_F()
BBB下內含一function BBB_F()

step1. 程式的順序一開始會先跑AAA_F() 此時我希望AAA_F()可以參考到TH=100
step2. 接下來呼叫 BBB_F() , 且BBB_F()會將TH的值改為50
step3. 程式如果又再跑到AAA_F(), 我希望AAA_F()抓到的TH值為50

我曾經嘗試過
AAA.cpp 宣告全域變數 static int TH=100;
BBB.cpp宣告 extern int TH;
如此寫法雖可以在BBB_F()取得TH=100並修改TH值=50
但重新呼叫AAA_F()值時 TH又變回100了
我想這是因為AAA.cpp又重新宣告了TH並且初始化TH=100
但我不知道這樣的狀況應該怎樣解決

因此想請問高手前輩們
應該用怎樣的宣告方式才能達到讓TH可以被每個檔案參考 且能保持被修改的值
感謝大家!!!



aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-10-31 03:33:27 IP:59.115.xxx.xxx 訂閱
看你的定義與宣告非常的有問題!  

你說 BBB_F() 取得後並修改TH=50 後來還是100… 這句話就表示你一定是定義了2次TH!

注意!! 原則上c 不會讓你定義二次同個變數名,它會跳錯誤訊息給你。但你沒收到,為什麼?? 因為…

你用了static 這個字,這個字加入後會使得TH的可視範圍定在該檔案裡面。也就是說,在其他的檔案裡面是無法也看不到這個TH變數。但你說你在B檔裡用了extern int TH這個宣告,於是compiler看到這extern時會去找哪裡有定義TH這個變數,它會在B檔的任意地方找有沒有int TH全域變數,若沒有,它會試著去A檔案或C檔案或D檔案…(如果有的話)找,好不容易找到A檔案有 int TH的定義,但它卻發現前面有個static,於是它就會把這個定義"當作沒看到"。既然沒找到,而你的BBB_F( )還可以正常運行。那不就代表你在BBB.cpp或BBB.h或AAA.h這三個檔案中有多定義一行 int TH;

static的全域變數的可視範圍是該檔案的,這像是封裝一樣。別的檔案是無法管也見不到的。 所以,若你要能創造一個全域性且多檔案可共用的變數,那就該使用
int TH; (只能在所有檔案裡選其中一個檔案寫進一次)
extern int TH; (在任意的檔案內都可以宣告)

所以,問題點在於你用了static這個字。而且你還定義了2次(int TH) 。我把正確的例子寫給你看,其實很簡單的…

AAA.h檔不用管,BBB.h檔也不用管,這二檔都不要去宣告或是義定。
再來,AAA.cpp檔如下:

int TH = 100; //-------這行放在AAA_F( )的上方,且不能被包在任何{ } 裡面
AAA_F( ); //int TH 定義後的任意下方位置

再來,BBB.cpp檔如下:

extern int TH; //----這行可以放在任何地方,要用這變數前使用就是

假如你有 CCC.cpp,也是一樣:

extern int TH; //----這行可以放在任何地方,要用這變數前使用就是

PS. 怕你不了解什麼是全域變數,簡單講一下,凡是一個變數定義在 { } 區塊面就是全域或稱外在變數!
PS.什麼是宣告? 凡是變數前有加 extern的就是宣告,相反的沒有這個字就叫「定義」,函數例外,細節不談!


===================引 用 chang1981 文 章===================


我曾經嘗試過
AAA.cpp 宣告全域變數 static int TH=100;
BBB.cpp宣告 extern int TH;
如此寫法雖可以在BBB_F()取得TH=100並修改TH值=50
但重新呼叫AAA_F()值時 TH又變回100了
我想這是因為AAA.cpp又重新宣告了TH並且初始化TH=100
但我不知道這樣的狀況應該怎樣解決


------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2008-10-31 03:34:39, 註解 無‧
aftcast 重新編輯於 2008-10-31 03:37:06, 註解 無‧
aftcast 重新編輯於 2008-10-31 03:38:42, 註解 無‧
aftcast 重新編輯於 2008-10-31 03:39:29, 註解 無‧
aftcast 重新編輯於 2008-10-31 03:41:16, 註解 無‧
aftcast 重新編輯於 2008-10-31 03:46:47, 註解 無‧
aftcast 重新編輯於 2008-10-31 03:49:18, 註解 無‧
aftcast 重新編輯於 2008-10-31 03:54:51, 註解 無‧
chang1981
一般會員


發表:31
回覆:28
積分:11
註冊:2008-09-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-10-31 08:27:35 IP:61.230.xxx.xxx 訂閱
感謝S大及A大詳細的指點 讓我對static的意義有更清楚的認識 我馬上來嘗試一下!!!!!
chang1981
一般會員


發表:31
回覆:28
積分:11
註冊:2008-09-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-10-31 09:12:50 IP:61.230.xxx.xxx 訂閱
感謝S大及A大的指導, 小弟試了一下A大的方式, 但發現這樣的做法在BBB_F()中更動不了TH的值, 
ex:
newTH=50 ;
TH= newTH;//這行執行完TH值還是100沒動靜
以下是小弟的程式架構圖 希望這樣問題會比較清楚
還有就是如果可以的話 對於這樣的程式功能 是不是有更好的作法
如果有的話還請前輩們不吝提供 感恩!!!
http://delphi.ktop.com.tw/board.php?cid=31&fid=130&tid=95835
(用幫助的方式貼圖檔連結變成叉燒包.. 只好貼整篇網址XD)
編輯記錄
chang1981 重新編輯於 2008-10-31 09:17:48, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-10-31 11:55:58 IP:60.248.xxx.xxx 訂閱
看了你的圖,我想問題應該是BBB_F( )這個function你寫錯了。你在B.cpp裡要把BBB_F函數定義成

B.cpp

BBB_F(int NewValue)
{
extern int TH;
TH = NewValue;
.......
}

在FmainBtn.cpp裡,當按下後執行
int newTH = StrToInt(Edit1->Text);
BBB_F(newTH);


若真的不行,把程式壓上來,我直接幫你改吧! 這樣快一點!
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2008-10-31 11:56:42, 註解 無‧
aftcast 重新編輯於 2008-10-31 12:00:01, 註解 無‧
aftcast 重新編輯於 2008-10-31 12:42:16, 註解 無‧
chang1981
一般會員


發表:31
回覆:28
積分:11
註冊:2008-09-18

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-11-04 08:56:35 IP:61.230.xxx.xxx 訂閱
感謝A大耐心的指導!! 依照您的方式來安排參數的宣告已經解決了我的問題!!謝謝!!
系統時間:2024-05-04 20:30:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!