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

請問指標可以定義外在變數嗎?

尚未結案
kmp
一般會員


發表:17
回覆:51
積分:13
註冊:2004-07-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-04 17:22:34 IP:211.74.xxx.xxx 未訂閱
hi~各位大人:              您們好,I am a very new novice at programming. 我現在程式有一問題,如下:    int * AA ( int *A , a , b ) {  ... return A ; }    int * BB ( int *B , a , b ) {  ... return B; } 在四個function內都要使用如此的宣告: int * C = new int[x]; C=AA( C, c , d ); int * D = new int[x]; D=BB( D, c , d ); 我想把這指邊宣告為 static extern 變數, 可是比如我手上這本旗標出版,施威銘主編, 變數種類,簡單分成auto和static,如: auto : declaration : stack : It is freed when excution leaves the function. static: definition : memory : They persist for the entire time a program is running. 請問指標可以用static變數嗎? It's scope可以在好幾個function? 指標是存放一個變數的address,並不是變數本身o 請問若不行,依我這樣子的形勢,怎改比較好,比較快?或者都不行要如何? 請不吝惜指教
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-04 18:13:18 IP:211.76.xxx.xxx 未訂閱
kmp 您好:    從您的問題中,不太明白您真正的需求? 如果是要讓所有的函式共用某個陣列,其實如您所描述的,當您把陣列名稱當成參數傳過去時,就已經可以修改該陣列的值了。 還是您有其他的目的或用法?
kmp
一般會員


發表:17
回覆:51
積分:13
註冊:2004-07-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-05 11:08:33 IP:211.74.xxx.xxx 未訂閱
hi~richtop :             您好 <> 從這裡我得到您的肯定,知道我可做到正確的值(我自己都還不是很確定), 但是我想,如我文中所說: <> 在四個> <> 請問我可以只宣告一次,使用 > <> 因為我看書上對於變數的種類有詳敘,但都是變數, 指標或陣列可以用嗎? 因為定義的是一 >
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-05 13:37:24 IP:211.76.xxx.xxx 未訂閱
kmp 您好:    理論上不管是指標或陣列,均是一個變數,只是它們所存的內容不是一般的數值或字元,而是位址。因此當然可以用extern宣告去使用它們。 所謂的extern宣告,就是說在目前的程式檔中,並不存在這個變數,而是存在另外的檔案中,因此如果要在目前的檔案中引用外部的變數,就可以透過extern將要引用的變數在目前檔案中作宣告,當然有一個前提:就是要引用的外部變數,必須能看得到,也就是說它必須是一個global形式的變數,以確保能存取到該變數,等到程式Link時,就能將它們連結起來,相互為用。 底下程式碼,供參考: 程式分別引用File.c與FileCpp.cpp兩外部檔案中的變數與函式,
//---------------------------------------------------------------------------
// File.c
int gCommonC = 6;    int valueC()
{ return 66;
}
//---------------------------------------------------------------------------
//FileCpp.cpp
int gCommonCpp = 9;    int valueCpp()
{ return 99;
}
//---------------------------------------------------------------------------
// Your project, 
extern int gCommonC;    extern "C"  // 如果引入的是.c檔中的函式,要多加此段,引入內容以extern "C" {...}包住,因為C  會自動變更函式的名稱。
{
  extern int valueC(); // C  容許同名函式,但從C引入者要避免函式名稱遭更改
}    extern int gCommonCpp;
extern int valueCpp();    void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
  ShowMessage( gCommonC );
  ShowMessage( valueC() );      ShowMessage( gCommonCpp );
  ShowMessage( valueCpp() );
}
//---------------------------------------------------------------------------
我之所以不解的地方是: int * C = new int[x]; C=AA( C, c , d ); 上面以動態方式宣告了陣列C,而後被當成參數傳入函式AA(.),最後AA(.)的傳回值又改寫了C,這就有可能導致C原先配置的記憶體,無法釋放。 這樣做的目的是我無法理解的原因所在。
kmp
一般會員


發表:17
回覆:51
積分:13
註冊:2004-07-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-05 23:04:08 IP:211.74.xxx.xxx 未訂閱
引言: 我之所以不解的地方是: int * C = new int[x]; C=AA( C, c , d ); 上面以動態方式宣告了陣列C,而後被當成參數傳入函式AA(.),最後AA(.)的傳回值又改寫了C,這就有可能導致C原先配置的記憶體,無法釋放。 這樣做的目的是我無法理解的原因所在。 發表人 - >< face="Verdana, Arial, Helvetica"> hi~richtop: 您好,謝謝您用心的解答, 我先回答您這一問題,因為這可能是我寫錯,因為我怎想, 但我不會寫程式,寫出來是錯的,若有錯請您糾正 > <> 我是想,> <> 我不知您懂我的意思嗎?我也不知這可不可用,因為其實它可以改寫 成一 > >
ENIX007
高階會員


發表:28
回覆:274
積分:185
註冊:2003-11-27

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-09-06 12:03:56 IP:203.70.xxx.xxx 未訂閱
冒昧插個花 如果說 > 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-09-06 14:41:00 IP:211.76.xxx.xxx 未訂閱
kmp 您好:    如果您是希望將陣列傳入函式計算,並能取回原陣列的話(我還是一直覺得您是要這樣做?), 我個人是傾向於建議將陣列以參數的方式傳入,並附加上該陣列的大小。 當陣列以參數傳遞時,僅是傳該陣列的起址位址,我們無從判斷該陣列的大小, 但所有對陣列的修改都直接反應在該陣列上,因為我們真的到該陣列所在記憶體中去修改其內容, 這也就是我為何不用傳回原陣列位址的原因。 底下有程式碼,請參考:
// file1.cpp    void outsideSub(int *ary, int len, int value)
{ for (int k=0; kextern outsideSub(int*, int, int); // call external function defined in outside .cpp.    void showArray(int *ary, int len)
{ AnsiString result="";      for (int k=0; k
RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-09-06 14:54:45 IP:211.76.xxx.xxx 未訂閱
ENIX007 您好:    我之所以不解與不鼓勵這種寫法的原因如下之說明,請參考。 除非這函式的目的就是傳回一個資料的位址(指標)。我的意思就是這樣。 < class="code"> int * AA ( int *A , a , b ) { ... return A ; } int * C = new int[x]; // C指向一塊系統配置的記憶體 C=AA( C, c , d ); // 回傳值會改變C的值,如果仍與原先的值相同,那似乎就不必多此一舉;如果不是,C原先指到的記憶體區塊就漏失掉了。
引言: 如果說new出來的int陣列在同一個scope做delete的話,應該是不會造成記憶體 流失才對,因為函式傳入時是指標型態,回傳也是指標,更動的都是同一個記憶體 區塊,int *A仍然指向同一個位址...(不曉得richtop大大您指的是哪種情形呢?)
RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
ENIX007
高階會員


發表:28
回覆:274
積分:185
註冊:2003-11-27

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-09-06 16:44:39 IP:203.70.xxx.xxx 未訂閱
嗯... 如同richtop大大所述,按照kmp大大您的用法  
引言: int * AA ( int *A , a , b ) { ... return A ; } int * C = new int[x]; C=AA( C, c , d );
AA函式只需要這樣就夠了 void AA ( int *A , a , b ) { ... } 不需要傳入re_A,因為當主程式(假設)呼叫AA函式後,回到主程式時C陣列就已經 改變了... 謝謝richtop大大的解說 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
kmp
一般會員


發表:17
回覆:51
積分:13
註冊:2004-07-24

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-09-07 12:39:46 IP:211.74.xxx.xxx 未訂閱
hi~richtop : 您好,謝謝您出一作業給我,如下 > 及請不吝惜指教 ^^" > > > > >> > > } //--------------------------------------------------------------------------- result="">請問這cat_printf ,如我可以寫一function: 但是使用這函數呼叫方式好像跟您不一樣,您那樣是好像是寫成一 structure的member,是可以為函數,但是您沒宣告structureㄚ?? 我可能問的問題很好笑,請多包含o void dog_printf(int s) { printf("hi~\n"); printf("This is my % hw!",s); } ShowMessage(result); } 請問這一程式我可以看出傳指標和傳一array給一空間有什不同優點嗎? 原諒我的不敏,我也不知那extern outsideSub(int*, int, int); 是因為outsideSub(int*, int, int);宣告在不同file, 要用的有點像#include嗎? 若寫在同一file就不用如此宣告嗎? 以及,我之前有一錯,void AA ( int *A , a , b , *re_A ),*re_A忘記寫型別, 應該如 int *re_A ,extern outsideSub(int*, int, int);是不是也少了type? 從前文討論,這是有點像 function是在使用記錄 返回位址,和 macro是把作的程 式碼塞入原主程式,增加空間,但速度快,有沒有異曲同工?? > 發表人 -
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-09-07 13:54:56 IP:211.76.xxx.xxx 未訂閱
kmp 您好:    原想將所有問題以此範例一併說明,因此引東論西,不料最後竟演變成畫蛇添足的結果。在此致歉! <>< face="Verdana, Arial, Helvetica">引言: hi~richtop : 您好,謝謝您出一作業給我,如下 > 及請不吝惜指教 ^^" > > > ><>//此部分就是> >><>//說明同上。 > ><>//說明同上。 } //--------------------------------------------------------------------------- result="">請問這cat_printf ,如我可以寫一function: 但是使用這函數呼叫方式好像跟您不一樣,您那樣是好像是寫成一 structure的member,是可以為函數,但是您沒宣告structureㄚ?? 我可能問的問題很好笑,請多包含o result是個AnsiString的一個物件,而cat_printf 是其成員函式,用法與C中的printf(.)相同,只是其結果會附加在result後面,我是為了顯示結果偷懶用它,但忘了說明,以致造成困擾。 > > > 請問這一程式我可以看出傳指標和傳一>廣義的說,> 原諒我的不敏,我也不知那<>>是的! 以及,我之前有一錯,> <>> 從前文討論,這是有點像 > <>好像有點不一樣。 使用> > 發表人 - >< face="Verdana, Arial, Helvetica"> RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
kmp
一般會員


發表:17
回覆:51
積分:13
註冊:2004-07-24

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-09-07 15:23:16 IP:211.74.xxx.xxx 未訂閱
hi~ENIX007:               ,您好 很高興您幫我看及解答問題,因為我不太會寫程式,邊寫在看書, 我看您寫的去翻書,晚一點回應,請見諒,有錯也請指教,謝謝>< face="Verdana, Arial, Helvetica">引言: 冒昧插個花 如果說> 我不知有什好書,(若有也懇請介紹)是有書就看,我翻一本,> >我剛來到此版時是為寫功課,看到五顆星,四顆星還有很多像我這樣沒有 > 您 > 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~ < face="Verdana, Arial, Helvetica">
kmp
一般會員


發表:17
回覆:51
積分:13
註冊:2004-07-24

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-09-07 15:41:13 IP:211.74.xxx.xxx 未訂閱
hi~ENIX007 : 您好,很高興及謝謝>< face="Verdana, Arial, Helvetica">引言: AA函式只需要這樣就夠了 void AA ( int *A , a , b ) { ... } 不需要傳入re_A,因為當主程式(假設)呼叫AA函式後,回到主程式時C陣列就已經 改變了... ㄣ,我同意您的想法,可能是我舉的例子不當,謝謝您的指教o 但因我現在要 寫的程式,要有兩個array,一個是input,一個是output, 所以函數裡面的參數,就好像是窗口,可能進,可能出,若我要一進一出, 宣告void必要有兩參數,若我宣告成函數指標或是可傳回值,則需要再多 一變數去接收它,傳給函數值也一樣,我不知我的想法對不對,以及有沒 誤會兩位大人的意思o Thanks & Regards kmp 謝謝richtop大大的解說 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~ < face="Verdana, Arial, Helvetica">
ENIX007
高階會員


發表:28
回覆:274
積分:185
註冊:2003-11-27

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-09-07 16:31:42 IP:203.70.xxx.xxx 未訂閱
kmp大大您好  
引言: 我不知有什好書,(若有也懇請介紹)是有書就看,我翻一本,C 程式設計與應用- 張耀仁 著,我想對指標的動態記憶體配置有點了解, 它說,"delete這敘述並沒有 將指標一起清除,只回收它指向的記憶體空間o 指標本身佔用的記憶體空間為 unsigned int,雖然無法回收也無所謂" 我想您的意思是不是這樣??
1.C&C 完美經典 江義華編著 金禾發行 2.C 聖經(I),C 聖經(II) Robert Lafore著,許建發譯 松格發行 C 聖經不確定買不買的到...小弟個人覺得不錯的書籍...
引言: 如果說new出來的int陣列在同一個scope做delete的話,應該是不會造成記憶體 流失才對,因為函式傳入時是指標型態,回傳也是指標,更動的都是同一個記憶體 區塊,int *A仍然指向同一個位址...(不曉得richtop大大您指的是哪種情形呢?)
上述其實也是小弟的疑問,只是藉機請教richtop大大會有何種情形 造成記憶體流失...不過依照您的用法 C=AA( C, c , d ); 只要在AA()函式內不更動到C所指的位址的話,即使回傳也不會造成 錯誤的,只是如同richtop大大所說,"多此一舉" 也就是說記憶體是否會流失是因為在更動C指標指向的位址之前是否有 釋放記憶體(也就是delete [] C)有關,而與函式是否有回傳值無關 小弟只是想釐清這一點... 好像把問題複雜化了,真抱歉 小弟的經驗尚淺,也請多多包涵 <>< face="Verdana, Arial, Helvetica">引言: 但因我現在要 寫的程式,要有兩個array,一個是input,一個是output, 所以函數裡面的參數,就好像是窗口,可能進,可能出,若我要一進一出, 宣告void必要有兩參數,若我宣告成函數指標或是可傳回值,則需要再多 一變數去接收它,傳給函數值也一樣,我不知我的想法對不對,以及有沒 誤會兩位大人的意思o 喔...小弟是誤解成re_A只是回傳您所謂的input,那就與回傳值一樣是多此一舉了, 若是需要另一個output,那當然必須傳入2個參數...
引言: 我剛來到此版時是為寫功課,看到五顆星,四顆星還有很多像我這樣沒有 stars的,都好可愛,有的都拿小時後照片,漫畫,心裡想,我媽也把我小時候生的 很古錐,我也要,...還沒,所以,這多勵害的版上大人都是小孩子,我這...不敢同 言語,若有,還在媽媽肚子裡,我..,在下,小的是小小o 我有很多不會,不懂,理解力記憶力都不行, richtop 大人解答都會出考題, 我open book好久還是不會,小的請您下次稱呼在下kmp 就好,謝謝o
我想網路上的基本禮儀,便是"相互尊重"... 只要發言,就必定十分注意說話的語氣與用詞... 只要是說話有禮(有理)的,都是"大大"... 否則,我可以選擇不發言... 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
kmp
一般會員


發表:17
回覆:51
積分:13
註冊:2004-07-24

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-09-07 23:09:14 IP:211.74.xxx.xxx 未訂閱
hi~ENIX007 :              您好,很感謝您用心的回答,我本來也想少回應一篇,一合為一, 因為已經不小心超過十,再多一或少一可能沒差,沒想到您做到了o                 以下是我對您認真的回覆有話想說 <>< face="Verdana, Arial, Helvetica">引言: 1.C&C 完美經典 江義華編著 金禾發行 2.C 聖經(I),C 聖經(II) Robert Lafore著,許建發譯 松格發行 C 聖經不確定買不買的到...小弟個人覺得不錯的書籍... 謝謝,我覺一本好的工具書也很重要o 以下這段您特別用紅色,我有特別再看一次,有比較清楚,十分謝謝o C=AA( C, c , d ); 只要在AA()函式內不更動到C所指的位址的話,即使回傳也不會造成 錯誤的,只是如同richtop大大所說,"多此一舉" 也就是說記憶體是否會流失是因為在更動C指標指向的位址之前是否有 釋放記憶體(也就是delete [] C)有關,而與函式是否有回傳值無關 小弟只是想釐清這一點... 好像把問題複雜化了,真抱歉 小弟的經驗尚淺,也請多多包涵< > <> 我其實很高興,可能我寫的程式是因我的 > 喔...小弟是誤解成> 關於這,是我的表達能力不太好,造成大家有點不清楚,> 我想網路上的基本禮儀,便是"相互尊重"... 只要發言,就必定十分注意說話的語氣與用詞... 只要是說話有禮(有理)的,都是"大大"... 否則,我可以選擇不發言...< > <> 了解,第一次和 >
kmp
一般會員


發表:17
回覆:51
積分:13
註冊:2004-07-24

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-09-08 00:46:00 IP:211.74.xxx.xxx 未訂閱
hi~richtop :              您好,很高興遇到這麼好的老師般,謝謝o
引言: kmp 您好: 原想將所有問題以此範例一併說明,因此引東論西,不料最後竟演變成畫蛇添足的結果。在此致歉! <> 我還覺得很高興,因為我在寫程式的時後都是閉門造車,如我剛跟> > <> 謝謝您讓我多學一點,願聞其詳> >哈哈< > < > ㄣ 我們要保護動物.... < face="Verdana, Arial, Helvetica">
系統時間:2024-11-25 15:49:51
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!