請問有關外部變數使用的問題 |
答題得分者是:aftcast
|
chang1981
一般會員 發表:31 回覆:28 積分:11 註冊:2008-09-18 發送簡訊給我 |
各位前輩好 小弟最近在寫一個小工具軟體時碰到了共用全域變數的問題
首先簡述一下我想要達成的目標 目標: 我想要宣告一個程式處理當中會參考到的臨界值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 發送簡訊給我 |
在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 發送簡訊給我 |
看你的定義與宣告非常的有問題!
你說 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 發送簡訊給我 |
|
chang1981
一般會員 發表:31 回覆:28 積分:11 註冊:2008-09-18 發送簡訊給我 |
感謝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 發送簡訊給我 |
看了你的圖,我想問題應該是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 |
chang1981
一般會員 發表:31 回覆:28 積分:11 註冊:2008-09-18 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |