討論區快速選單
知識庫快速選單
網路投保旅行平安險 討論區最近新進100則主題 傑米的攝影旅遊筆記
[ 回上頁 ] [ 討論區發言規則 ]
如何傳遞二維的動態陣列到函數中?
更改我的閱讀文章字型大小
作者 : s872001(s872001)
[ 貼文 5 | 人氣 2004 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/4/27 下午 02:13:49
各位前大家好,
小弟有一個動態宣告的二維陣列,
想把它傳到另一個函數中使用,
不知該如何寫
小弟用c寫的。
謝謝各位的幫忙。
作者 : darknessjoker(月夜死神)
[ 貼文 139 | 人氣 9228 | 評價 40 | 評價/貼文 0.29 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/4/28 上午 02:08:55
那本是什麼,就是什麼……
作者 : frankfkc(長長) 程式設計甘苦談卓越專家C++優秀好手貼文超過1000則人氣指數超過50000點
[ 貼文 1148 | 人氣 62194 | 評價 4640 | 評價/貼文 4.04 | 送出評價 108 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/4/28 上午 09:04:26
意思是說,既然是動態產生的二維陣列,原來必定是兩層的指標,那就把這兩層指標傳進去就好了。

void func(int **pp)
{
   ..... // do anything
}

void main()
{
    int **ppi;

    ...... // allocation and initialization
    func(ppi);
}

>那本是什麼,就是什麼……
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/4/28 上午 10:36:19
>意思是說,既然是動態產生的二維陣列,原來必定是兩層的指標,
>那就把這兩層指>標傳進去就好了。
>void func(int **pp)
>{
>..... // do anything
>}

>void main()
>{
>int **ppi;
>
>...... // allocation and initialization
>func(ppi);
>}

那像下面的動態二維也可以呼叫func嗎?
void main()
{
int (*ppi)[20]= new int[10][20];
:::::::::::::::::::::::::::::::::::::
func(ppi);
}

連什麼樣的動態二維都不說明,這本是無厘頭的問題!
作者 : frankfkc(長長) 程式設計甘苦談卓越專家C++優秀好手貼文超過1000則人氣指數超過50000點
[ 貼文 1148 | 人氣 62194 | 評價 4640 | 評價/貼文 4.04 | 送出評價 108 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/4/28 下午 01:56:27
不可以,因為雙層指標和底下的寫法,這兩者的memory layout是不同的。

沒錯啦!題目果然說的不清不楚,但有時候發問的人自己有時候也搞不太懂,就像我初學時也是一樣,很多東西根本就搞不清楚什麼是什麼,呵呵!幸好那時候我師傅很有耐心,也常會試著瞭解我到底在問什麼。我發現很多老師都有這種本事。

>那像下面的動態二維也可以呼叫func嗎?
>void main()
>{
>int (*ppi)[20]= new int[10][20];
>:::::::::::::::::::::::::::::::::::::
>func(ppi);
>}
>
>連什麼樣的動態二維都不說明,這本是無厘頭的問題!
>
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/4/28 下午 11:45:57
>沒錯啦!題目果然說的不清不楚,但有時候發問的人自己有時候也搞
>不太懂,就像我初學時也是一樣,很多東西根本就搞不清楚什麼是什麼,
>呵呵!幸好那時候我師傅很有耐心,也常會試著瞭解我到底在問什麼。
>我發現很多老師都有這種本事。
說的有道理!但世界有耐心的又很會算命的"孔子"不會太多吧,至少在網路
BBS我很少看到。
現實既是如此,學生就只好多多包涵囉 ^^
怎麼包涵呢?以這題來說,提問者至少可以把它的程式貼出來吧?
這對初學者來說一點也不難吧!?copy and past,又不必用手抄!
提問者花一點點功夫就可免去苦等很會算命又有耐心的老師了 ^^

其實有些無厘頭的問題,我也猜得出來十之八九,不回答不是拿翹,
只是覺得這只會使提問者變懶,表達能力變得越來越差...
像本版最近的一個提問:
>程式都是先照打出來的.....
>卻一直出現[ declaration terminated incorrectly ] 這種錯誤....><
>不知該如何是好~~請教各位厲害的高手解答
不知道你的老師能不能"猜"得出來,但coco是投降了!
在怎麼樣的初學,也應知道這樣的提問真的得找算命的才能答。
把程式和編譯錯誤的訊息貼出來真的得要學C/C++很深入才能做得到嗎?

作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/4/28 下午 11:57:17
>我有個問題,我用binary方式讀取file,但是我讀到80H 以後的值全部為0
>不知為什麼,請各位大大幫幫我Thank you

這一題是最近在 VC版的一個提問,考考你的老師 ^_@
作者 : s872001(s872001)
[ 貼文 5 | 人氣 2004 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/4/29 上午 12:05:42
謝謝各位前輩的幫忙,小弟的問題終於解決了
其實小弟的問題就是不知在void fun(??)裡面到底要傳什麼
想不到只要兩個星就解決了。
不好意思,沒把問題說清楚,
在下真的是超新手,非資訊相關科系的跑去念資訊所,
被逼著寫c,希望以後有問題還能跟各位請益。

作者 : compile32(俊志)
[ 貼文 89 | 人氣 818 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/4/29 上午 04:41:34
謝謝各位前輩的幫忙,小弟的問題終於解決了
其實小弟的問題就是不知在void fun(??)裡面到底要傳什麼
想不到只要兩個星就解決了。


請問一下你用 2 個星號確定可以儲存二維陣列的位址嗎???我用過好像不行ㄟ...
作者 : frankfkc(長長) 程式設計甘苦談卓越專家C++優秀好手貼文超過1000則人氣指數超過50000點
[ 貼文 1148 | 人氣 62194 | 評價 4640 | 評價/貼文 4.04 | 送出評價 108 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/4/29 上午 09:09:39
其實這並不是算命,不過一個人在某個領域久了,自然而然能夠猜出相關領域的人的一些想法,特別大家又一樣是初學起來的。

初學者當然要學會發問的技巧,獲得知識的基本訓練之一。
但是有經驗的人試著去猜猜看人家的意思,也是很有意思的,雖然大多時間會猜錯,不過,當成遊戲,人生不是愉快太多嗎?

其實,我知道你的好意。並不是所有的人都有耐心去猜,所以初學的人不能老是想要獲得明師,而是自己要「眼色好」,懂得去發問的技巧,懂得看懂人家回答時的精華所在。

>說的有道理!但世界有耐心的又很會算命的'孔子'不會太多吧,至少在網路
>BBS我很少看到。
>現實既是如此,學生就只好多多包涵囉 ^^
>怎麼包涵呢?以這題來說,提問者至少可以把它的程式貼出來吧?
>這對初學者來說一點也不難吧!?copy and past,又不必用手抄!
>提問者花一點點功夫就可免去苦等很會算命又有耐心的老師了 ^^
>
>其實有些無厘頭的問題,我也猜得出來十之八九,不回答不是拿翹,
>只是覺得這只會使提問者變懶,表達能力變得越來越差...
>像本版最近的一個提問:
>>程式都是先照打出來的.....
>>卻一直出現[ declaration terminated incorrectly ] 這種錯誤....><
>>不知該如何是好~~請教各位厲害的高手解答
>不知道你的老師能不能'猜'得出來,但coco是投降了!
>在怎麼樣的初學,也應知道這樣的提問真的得找算命的才能答。
>把程式和編譯錯誤的訊息貼出來真的得要學C/C++很深入才能做得到嗎?
>
>
作者 : frankfkc(長長) 程式設計甘苦談卓越專家C++優秀好手貼文超過1000則人氣指數超過50000點
[ 貼文 1148 | 人氣 62194 | 評價 4640 | 評價/貼文 4.04 | 送出評價 108 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/4/29 上午 09:11:00
哇!加油!
看閣下的編號,如果是您的學號的話,那,您是第一名考進去的?太厲害了。

>在下真的是超新手,非資訊相關科系的跑去念資訊所,
>被逼著寫c,希望以後有問題還能跟各位請益。
作者 : frankfkc(長長) 程式設計甘苦談卓越專家C++優秀好手貼文超過1000則人氣指數超過50000點
[ 貼文 1148 | 人氣 62194 | 評價 4640 | 評價/貼文 4.04 | 送出評價 108 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/4/29 上午 09:13:33
兩個*號不可以儲存二維陣列。
要傳二維陣列,可用

void func(int a[][100])
{
}

後面那個100一定要寫,但當然不一定是100,看您實際上的維度寫。

>請問一下你用 2 個星號確定可以儲存二維陣列的位址嗎???我用過好像不行ㄟ...
作者 : frankfkc(長長) 程式設計甘苦談卓越專家C++優秀好手貼文超過1000則人氣指數超過50000點
[ 貼文 1148 | 人氣 62194 | 評價 4640 | 評價/貼文 4.04 | 送出評價 108 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/4/29 上午 09:26:03
我師傅已經去矽谷好幾年了,在那兒安家立業。
對了,人家是文化地質系畢業的,可是,那寫程式的功力,真的厲害到太誇張,就算我現在是本科系畢業的,仍然覺得能力還是不如甚多。

舉個例子:
那時他很喜歡玩任天堂,可是因為要工作,沒時間仔細玩,於是就把上面存放遊戲的ROM拔下來,自己寫一個68000的debugger,然後修改無敵版後,再燒回去。我們稱這叫做「逛街」,就是直接把整個遊戲逛完。

那時候跟他學軟體破解,為了破軟碟的保護,除了用debug外,他還作了一個「讀軌器」,把硬碟的訊號接出來,上面一個單晶片把資料顯示在上面的7-segment。這樣,我們就很容易可以知道該軟碟的保護磁區磁軌的所在。

那時候他在一家顯示器的公司寫bios和driver。

他那個人寫程式有潔癖,會盡量要達到完美的要求,所以到現在,他都還是我的目標。他那時候教我的時候,常給我一個觀念,看到人家的程式,首先要先去瞭解人家的妙處,而不是以自己粗淺的知識妄加評斷。這是為什麼人家雖非本科系,但卻讓多本科系的人汗顏。

至於底下的問題,我不好意思去問他,而我才疏學淺,也看不出來為什麼。

>>我有個問題,我用binary方式讀取file,但是我讀到80H 以後的值全部為0
>>不知為什麼,請各位大大幫幫我Thank you
>
>這一題是最近在 VC版的一個提問,考考你的老師 ^_@
>
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/4/29 下午 01:08:02
>我師傅已經去矽谷好幾年了,在那兒安家立業。
>對了,人家是文化地質系畢業的,可是,那寫程式的功力,
>真的厲害到太誇張,就算我現在是本科系畢業的,仍然覺得
>能力還是不如甚多。
偶是機械系的,難怪程式寫到人都老了,還是不能達到"太誇張"的境地!
早知道,偶就去唸文化地質系了,呵呵呵....
純開玩笑的,沒別的意思 ^.@

>初學者當然要學會發問的技巧,獲得知識的基本訓練之一。
>但是有經驗的人試著去猜猜看人家的意思,也是很有意思的,雖然大多時間
>會猜錯,不過,當成遊戲,人生不是愉快太多嗎?
coco已經過了"當成遊戲"的年齡了,不過人生還算過的愉快...

>其實,我知道你的好意。並不是所有的人都有耐心去猜,所以初學的人不能
>老是想要獲得明師,而是自己要「眼色好」,懂得去發問的技巧,懂得看懂
>人家回答時的精華所在。

這是重點!
其實我並不懶,說到"猜"的能力也不會差到那兒。
我要求提問者的,真的也談不上什麼技巧,把自己的程式和錯誤訊息,
copy & past 需要技巧嗎?只是觀念罷了!
但這觀念不只是在幫"回覆"者明白問題,更重要的是在幫自獲得真正的東西!
舉本例來說,你猜了問題意思也給了兩個星的答案,提問者也很高興的說:
"想不到只要兩個星就解決了",但真的解決了嗎?我很懷疑,我想你也不確定
吧!?
使用point to point來模擬二維陣列是可行的,但通常不是初學者會去用的,
如果傳進去的不是一個"準備妥"的point to point模擬二維陣列,而是其它的
東西,那麼程式不出問題也難!
結論呢?提問者至今仍未貼出他的程式碼(或許是國家機密吧^^),但他可能
獲得的不是正確的答案而不自知,下次他還是以為提問時只要隨便說說就可以
得到答案了。這樣的"猜"或許你是好心(也當作遊戲),但幫到了他了嗎?

說了這許多,我不是要回"長長"兄的,其實我是要給常在這兒提問的人看的。
對初學者來說,寫的程式都不會很大,提問時把它貼出來是很重要的,為了
自己好,不是因為回覆者都比較懶!
如果問題需要說明,請也用心的說明,既使因"技巧"的原因,說明不好,只要
用了心,至少我也會"努力"猜測來"報答"你的"用心"。但如果隨便不著
邊際的一兩句話,程式也沒...唉!抱歉了,給有興趣的人去猜了,偶納涼去了!

作者 : frankfkc(長長) 程式設計甘苦談卓越專家C++優秀好手貼文超過1000則人氣指數超過50000點
[ 貼文 1148 | 人氣 62194 | 評價 4640 | 評價/貼文 4.04 | 送出評價 108 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/4/29 下午 01:49:29
>這是重點!
>其實我並不懶,說到'猜'的能力也不會差到那兒。
>我要求提問者的,真的也談不上什麼技巧,把自己的程式和錯誤訊息,
>copy & past 需要技巧嗎?只是觀念罷了!
>但這觀念不只是在幫'回覆'者明白問題,更重要的是在幫自獲得真正的東西!
>舉本例來說,你猜了問題意思也給了兩個星的答案,提問者也很高興的說:
>'想不到只要兩個星就解決了',但真的解決了嗎?我很懷疑,我想你也不確定
>吧!?
>使用point to point來模擬二維陣列是可行的,但通常不是初學者會去用的,
>如果傳進去的不是一個'準備妥'的point to point模擬二維陣列,而是其它的
>東西,那麼程式不出問題也難!
>結論呢?提問者至今仍未貼出他的程式碼(或許是國家機密吧^^),但他可能
>獲得的不是正確的答案而不自知,下次他還是以為提問時只要隨便說說就可以
>得到答案了。這樣的'猜'或許你是好心(也當作遊戲),但幫到了他了嗎?
>

是!我瞭解了。
作者 : s872001(s872001)
[ 貼文 5 | 人氣 2004 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/4/30 上午 12:01:01
真對不住各位前輩,小弟的程式大約一千三百多行,對小弟來說實在是超級複雜的,
因此不知該從那貼起我的程式,小弟試著把遇到的情形盡量呈現出來,還請各位多包函。
先說明一下我要解的問題:從一個m*n的資料檔中讀資料到陣列當中,然後經由分群演算法得出要的答案。因為共有m*n筆資料,所以我最初用
#define raw m
#define col n
來定義資料大小,因此在main當中使用
int array[raw][col];來宣告陣列大小
因為這個陣列的值必需讓另一個函數也能存取的到,
所以我用這樣傳法:
void fun(int array[raw][col])
{
..........
}

void main(void)
{
int array[raw][col];
fun(array);
}
但這樣有個問題,每當我資料大小改變,我就要進到程式中改變m,n的值
因此我想要動態抓資料大小然後丟進動態陣列中
所以我用這樣的寫法
void main(void)
{
int **array;
int a,b; //這兩個變數用來接放資料大小同時用來宣告陣列大小
fun(array);
}
但問題來了在void fun(?)的部分,我試過填 int array[a][b],失敗
int array,失敗,怎麼填都不成功,因此提出這個問題。
雖然問題解決了,不過說真的小弟還是一知半解,由其是指標的應用方面。
再次感謝各位的協助,謝謝。
對了,帳號是我大學的學號,雖然我現在還是1號,不過倒跟名次沒有關系,
我們學校的學號是以居住地由北排到南來定的。


作者 : s852101(古代遺跡) C++優秀好手貼文超過1000則
[ 貼文 1714 | 人氣 1992 | 評價 1270 | 評價/貼文 0.74 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/4/30 上午 12:35:18
point to point 真的很討厭....
建議
1.使用containor
2.自己用class包一包
3.用一維模擬二維
作者 : frankfkc(長長) 程式設計甘苦談卓越專家C++優秀好手貼文超過1000則人氣指數超過50000點
[ 貼文 1148 | 人氣 62194 | 評價 4640 | 評價/貼文 4.04 | 送出評價 108 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/4/30 上午 09:08:36
我懂了,那我告訴你如何作動態陣列。

void func(int **array, int row, int column)
{
    ....
}


void main()
{
  int **aa;
  int r;

  aa = (int**)malloc(sizeof(int*)*ROW); // ROW is known

  for(i=0; i<3; ++i)
    aa[i] = (int*)malloc(sizeof(int)*COLUMN); // COLUMN is known

  func(aa, ROW, COLUMN);
}

如果你是用C++的話,就把malloc改成new就可以了,你試試看,不行,我在告訴你。

我覺得古代遺跡說的沒錯,用container是比較保險而且方便,但是,我還是覺得,自己要懂得語言最基本的東西,如果不知道人家設計的原理,只會用的話,套句侯捷老大說的,「知其然,不知其所以然,不高明」。
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/4/30 下午 03:14:38
>void fun(int array[raw][col])
>{
>..........
>}

>void main(void)
>{
>int array[raw][col];
>fun(array);
>}
>我想要動態抓資料大小然後丟進動態陣列中
>所以我用這樣的寫法
>void main(void)
>{
>int **array;
>int a,b; //這兩個變數用來接放資料大小同時用來宣告陣列大小
>fun(array);
>}
>但問題來了在void fun(?)的部分,我試過填 int array[a][b],失敗
>填int array,失敗,怎麼填都不成功,因此提出這個問題。
這樣提問題就對了,程式太大時只要把相關的程式碼截取貼出來就行。以你的
問題應很容易找出該貼出來的部份,而你這次也做得很好。
正如我猜的,你的問題並不是在fun()中改用兩個星就可解決的。
你會試圖用fun(int array[a][b])來接收 int **array 引數,表示你對二維陣列和
指標的指標並不了解。二者是完全不同資料結構,不能混用。而問題也不是改成
void fun(int **array) 就可解決的。基本的觀念是 int **array 只是"一個指標"
。但由於 C/C++ 對指標提供了如陣列般的語法去存取指標所指位址為開始的一段
記憶區塊,所以就開啟了指標模擬陣列的一道門。這指標在模擬一維陣列時容易,也
很直接,但在二維以上時就不是那麼簡單,你得為第一維的所有元素準備指向第二
維的容器指標。長長兄給了你一個如何備妥用指標的指標模擬二維的例子,可以參考
(有一點點小bug,但參考無仿)。古代兄給你的建議應是較佳的方案,使用STL的
vector 會是正解。我覺得即使學習中,也沒有必要事事都得自己來,學習使用物件
應是今天和明天的潮流。以前有很多開車族,不喜歡開自排車,認為不像自己開車,
上坡無力,但今天連最計較油錢的計程車老大們,也沒人會去開手排了。事實上
C++本身也是一個黑盒子,要真正凡事自己來,應是用組合語言來寫程式。事實上
以前的年代的確有工程式不用高階語言來寫程式的,覺得寫來程式肥肥的,debug
困難!但如今,我想那些工程師若尚堅持至今,應已被淘汰了吧^^
從程式邏輯的學習來看,並不會因你用了vector就會失掉了重要的學習重點。程式邏輯到處都存在的,用什麼來完成你的程式都一樣。
下面的這篇是有關動態二維的文章,你可參考一下,並自己決定用那個方案解決
你的問題:
http://ehome.hifly.to/showthread.php?s=&threadid=357

作者 : s852101(古代遺跡) C++優秀好手貼文超過1000則
[ 貼文 1714 | 人氣 1992 | 評價 1270 | 評價/貼文 0.74 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/4/30 下午 04:36:11
在你的問題中
int array[raw][col];是大小已知的陣列。
所以你可以將靜態陣列用template包裝起來。
下面的例子中,二維陣列arr2d物件可以輕易的傳入函數之中,
下標運算子也還能使用---> arr2d.val[x][y]
並不會受到影響.

簡單的例子:
template<int n,int m,typename T>
class Arr2D{
     public:
     Arr2D(){
     for(int ix=0;ix<4;ix++)
     {
     for(int iy=0;iy<4;iy++)
     {
     arr[ix][iy]=ix*m+iy+1;
     }
     }
     }
     ~Arr2D(){}
     T val[n][m];
};
template<int n,int m,typename T>
void show(const Arr2D<n,m,T>& array)
{
     {
     cout<<"[ ";
     for(int iy=0;iy<m;iy++)
     {
     cout<<array.val[ix][iy]<<" ";
     }
     cout<<"]"<<endl;
     }
    
}
int main()
{
    
    Arr2D<3,3,int> array2;
    show(array2);
    
  return 0;
}
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/4/30 下午 05:21:58
>在你的問題中
>int array[raw][col];是大小已知的陣列。
古代兄,你看太快了,
他最後要的是 大小不定的陣列 ^^
作者 : stevenlien(stevenlien)
[ 貼文 61 | 人氣 1867 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/4/30 下午 06:00:20


> for(i=0; i < 3; ++i)
> aa[i] = (int*)malloc(sizeof(int)*COLUMN); // COLUMN is known

插花一下....
長長兄的這行是不是錯ㄌ??..
應該是
 for(i=0; i < ROW; ++i)
才是...

看到各位的討論...讓我學的很多多
Java用太多次, pointer就忘光了....由其是2D array.......
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/4/30 下午 06:18:07
>> for(i=0; i < 3; ++i)
>> aa[i] = (int*)malloc(sizeof(int)*COLUMN); // COLUMN is known
>插花一下....
>長長兄的這行是不是錯ㄌ??..
這是我說的"小"bug,只是疏忽的小錯,很容易看出來。
作者 : frankfkc(長長) 程式設計甘苦談卓越專家C++優秀好手貼文超過1000則人氣指數超過50000點
[ 貼文 1148 | 人氣 62194 | 評價 4640 | 評價/貼文 4.04 | 送出評價 108 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/4/30 下午 07:08:45
對不起!太混了。

>
>
>> for(i=0; i < 3; ++i)
>> aa[i] = (int*)malloc(sizeof(int)*COLUMN); // COLUMN is known
>
>插花一下....
>長長兄的這行是不是錯ㄌ??..
>應該是
> for(i=0; i < ROW; ++i)
>才是...
>
>看到各位的討論...讓我學的很多多
>Java用太多次, pointer就忘光了....由其是2D array.......
>
作者 : frankfkc(長長) 程式設計甘苦談卓越專家C++優秀好手貼文超過1000則人氣指數超過50000點
[ 貼文 1148 | 人氣 62194 | 評價 4640 | 評價/貼文 4.04 | 送出評價 108 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/1 下午 02:34:49
我比較持不同的看法。

我覺得會開車,跟會開車但又稍微懂一點車體結構的,兩者就是不同。
平時寫程式解決問題時,當然沒有什麼差別,但當出錯了呢?
不懂的STL裡面實作的原理,又能夠應用自如隨心所欲,我認為那是很少的,不然就要累積很大量的實用經驗。

可是如果就本體去瞭解,container、iterator、algorithm三者之間的關係,並且去瞭解allocator為了提升STL效率時所做的努力,那我相信在寫程式時,心中就是會多了那一份篤定。而在有必要時,也可以自己設計container,甚至針對自己的需求來設計allocator。

我當然不是提倡一切都要用最基本的方式來作,但是學習跟做事本來就是兩面的東西。沒錯,這次這樣學習會花比較多時間,但是因為都具備了這些基本的東西,下次在學習新東西時,很有機會會比較快就能學會,而不是每次都從頭來一次。

從我之前開始使用MFC和STL就是如此,很多東西書上要不隨便提一下,要不根本不提,可是在使用時就是會有奇怪的問題出現,若不是這些都有了source code,不曉得要花多少時間才可能瞭解。可是當我trace進去後,就會瞭解原來如此。

很多東西就是這樣,如果不曾有過「原來如此」的領悟,就無法更上一層樓。很多大大在此都曾經經歷過。不然,如何能瞭解那個雙層指標模擬二維動態指標的意義所在呢?難道瞭解這個比懂得用vector更不重要嗎?更何況動態二維陣列用雙層指標是比較浪費記憶體空間的,我們也可以應用資料結構裡面教的方式,用一維陣列來模擬,那是更接近compiler幫我們處理掉的作法。

就算用vector來說好了,使用vector時,vector::iterator是會失效的,為什麼?因為vector是可以動態增長的,但vector有reallocate過,那之前指向的iterator就會失效,可是list就不會,理由很簡單,相信大家都懂。如果不瞭解這個運作機制,可能就要大罵特罵STL的vector爛吧!

懂得用,和懂得為什麼要這麼用,層次就是不一樣,而且由於累積的經驗多了,也不見得學習起來就比別人慢,特別由於建立了這些基本功,反而使得未來在看到新東西時,更容易有「原來如此,也沒什麼,原理就是這樣」的體會吧!

我想,「頓悟」是由於一連串的「漸修」才能得到的。可是我們不應該在頓悟了以後卻否認過去漸修的功勞吧!如果沒有之前建立的深厚基礎,那能在後來使用現成物件時能得心應手呢?能夠明白物件使用上的限制所在以及原理呢?

瞭解基本運作原理,不是提倡要用老古董的方式來寫程式,而是希望能在使用那些高階工具時,因為瞭解而心中更加篤定。

BUG的產生不在於使用了所謂的「危險的programming style」,而是來自於「不瞭解」。

例如,最好使用virtual的dtor(),可是STL就很多地方不用。
例如,用C++最好不用malloc和free而要用new和delete,可是STL就是盡可能要用malloc和free,而不用new和delete。

為什麼?所以為什麼會有trait的東西出來。

想想看,Effective C++這類的書,不就是因為瞭解和經驗所累積出來的嗎?而STL不也如此嗎?

>我覺得即使學習中,也沒有必要事事都得自己來,學習使用物件
>應是今天和明天的潮流。以前有很多開車族,不喜歡開自排車,認為不像自己開車,
>上坡無力,但今天連最計較油錢的計程車老大們,也沒人會去開手排了。事實上
>C++本身也是一個黑盒子,要真正凡事自己來,應是用組合語言來寫程式。事實上
>以前的年代的確有工程式不用高階語言來寫程式的,覺得寫來程式肥肥的,debug
>困難!但如今,我想那些工程師若尚堅持至今,應已被淘汰了吧^^
>從程式邏輯的學習來看,並不會因你用了vector就會失掉了重要的學習重點。程式邏輯到處都存在的,用什麼來完成你的程式都一樣。
>下面的這篇是有關動態二維的文章,你可參考一下,並自己決定用那個方案解決
>你的問題:
>http://ehome.hifly.to/showthread.php?s=&threadid=357
>
>
作者 : frankfkc(長長) 程式設計甘苦談卓越專家C++優秀好手貼文超過1000則人氣指數超過50000點
[ 貼文 1148 | 人氣 62194 | 評價 4640 | 評價/貼文 4.04 | 送出評價 108 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/1 下午 03:05:02
謝謝!

這邊我很想知道,您如何包一個class,可以支援如下語法的?

class Array2D
{
 ...
};

Array2D ar;
element e; // 假設該二維陣列裡面的元素是element,可以假設是int。

e = ar[i][j];

如果寫成
e = ar(i, j);

是不合格的。

另外,用vector如何模擬一個二維陣列?

謝謝您的回答。

>point to point 真的很討厭....
>建議
>1.使用containor
>2.自己用class包一包
>3.用一維模擬二維
作者 : fzr(FZR)
[ 貼文 19 | 人氣 2586 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/1 下午 03:55:42
那三維的也是這樣的寫法嗎?
作者 : s852101(古代遺跡) C++優秀好手貼文超過1000則
[ 貼文 1714 | 人氣 1992 | 評價 1270 | 評價/貼文 0.74 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/1 下午 05:27:45
>這邊我很想知道,您如何包一個class,可以支援如下語法的?
>class Array2D
>{
>...
>};
>
>Array2D ar;
>element e; // 假設該二維陣列裡面的元素是element,可以假設是int。
> e= ar[i][j];
>如果寫成
> e= ar(i, j);
>是不合格的。

如果是二維陣列的話,用下標運算子是比較直觀的,大多看到的作業題只是單
純的二維陣列處理資料。並不要求複雜功能....
以這為前提的話,上面的Array2D物件取值的部分應為

e=ar.val[i][j]; 而非 e= ar[i][j];
要有e= ar(i, j);功能的話....實作operator()吧!! :P

>另外,用vector如何模擬一個二維陣列?

vector< vector<int> > v2d()
初始化的部分可以參考
http://ehome.hifly.to/showthread.php?s=796575c9e641b2092825f3f2b80c5b80&threadid=357



作者 : s852101(古代遺跡) C++優秀好手貼文超過1000則
[ 貼文 1714 | 人氣 1992 | 評價 1270 | 評價/貼文 0.74 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/1 下午 05:29:28
>那三維的也是這樣的寫法嗎?

都是一樣的把戲....

對於真正可用的metrix而言,可以參考MTL的文件....
裡面非常複雜...
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/1 下午 11:44:26
>我比較持不同的看法。
>我覺得會開車,跟會開車但又稍微懂一點車體結構的,兩者就是不同。
>平時寫程式解決問題時,當然沒有什麼差別,但當出錯了呢?
>不懂的STL裡面實作的原理,又能夠應用自如隨心所欲,我認為那是很少
>的,不然就要累積很大量的實用經驗。
>
>可是如果就本體去瞭解,container、iterator、algorithm三者之間的關係,
>並且去瞭解allocator為了提升STL效率時所做的努力,那我相信在寫程式
>時,心中就是會多了那一份篤定。而在有必要時,也可以自己設計
>container,甚至針對自己的需求來設計allocator。
我不是說做學問追根究底不好,而是做事有時得懂得妥協.。
提問者不是說了嗎?他的程式有一千三百多行!這已足說明他的job的重點
已不是在"動態二維"的技術上,雖然他會用到"動態二維"。
這時候的正解應就是vector。如果他作的程式目的是為了了解指標的指標,
並用它來模擬二維陣列,那麼就不應該用vector了。
至於是不是要懂的"STL實作的原理"才能去用vector。理想是這樣吧!
但我想程式師麼多!絕大部份的人對"STL實作的原理"大概都很模糊吧!
(就我所知),但若要這些不能用STL...我想也太苛了點 ^^
vector <int> Array1D(m);
可以模擬一維陣列 int Array1D[m];
使用 vector<vector<int> > Array2D(m, vector<int>(n));
則可以模擬 二維陣列 int Array2D[m][n],當然若是"時間"許可好好把它了解透澈是最好了,就算STL不是很熟,看到這例子,也可以模仿應用的!
基本上我覺得手上有一本"C++ 標準程式庫"就可以用程式館的函式和STL
來寫程式了。特別我要在聲明,對於自己所用的"程式館工具"越能了解當然越好!
若是要做的程式是有關資料結構課程的,自己設計container是應該的;
但若是要做的程式是有關應用的,只要知道怎麼用,就大膽去用STL的
container!不要回頭去設計自己的container,否則可能你的project卡在
debug container 上而無法在時間內完成。這是我說的妥協的意思。

作者 : frankfkc(長長) 程式設計甘苦談卓越專家C++優秀好手貼文超過1000則人氣指數超過50000點
[ 貼文 1148 | 人氣 62194 | 評價 4640 | 評價/貼文 4.04 | 送出評價 108 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/2 上午 09:04:46
謝謝您的指教。
但是現在我無聊的執著又開始了,實在很想用ar[i][j]而不是其他的替代方案。
用ar(i, j)太簡單了,一般會C++的都會,但是跟C++對二維陣列的寫程式習慣不一致。
而用ar.val[i][j]就更簡單了,一般初學者都會,但是違反了資料封裝的原則。

>如果是二維陣列的話,用下標運算子是比較直觀的,大多看到的作業題只是單
>純的二維陣列處理資料。並不要求複雜功能....
>以這為前提的話,上面的Array2D物件取值的部分應為
>
>e=ar.val[i][j]; 而非 e= ar[i][j];
>要有e= ar(i, j);功能的話....實作operator()吧!! :P
>
>>另外,用vector如何模擬一個二維陣列?
>
>vector< vector<int> > v2d()
>初始化的部分可以參考
>http://ehome.hifly.to/showthread.php?s=796575c9e641b2092825f3f2b80c5b80&threadid=357
>
>
>
>
作者 : frankfkc(長長) 程式設計甘苦談卓越專家C++優秀好手貼文超過1000則人氣指數超過50000點
[ 貼文 1148 | 人氣 62194 | 評價 4640 | 評價/貼文 4.04 | 送出評價 108 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/2 上午 09:18:41
我瞭解您的意思,也十分贊同。
但是,我覺得在使用一種新東西時,如果老是在妥協,那BUG永遠解不完的。

我剛開始用STL的時候,就是相信可以很方便的用STL而不用去瞭解,結果是,光是vector就把我搞的頭昏眼花,很多我碰到的問題,查書查on-line help都找不到類似的說明,最後只好trace進去,才瞭解,原來如此。

我那個程式是一個scheduling tool,我為了偷懶,不想用指標,而用vector來表示一個dependency graph,寫了大約幾千行吧!後來我進去把STL多看懂一些後,就很順利的寫完。

我開始用MFC也是相同的,幸好MS開放MFC的source code。

我們自己都做過project,也都寫過document,相信也很有感覺,當一個東西開發完畢後,要寫document時,總是會覺得還是沒有把自己想要寫出來的東西寫完。而一個那麼大的lbrary,相信更難。

後來侯捷老師出了「STL源碼剖析」,我就趕快去買來看,真的太佩服他了。而我看了以後,對我工作更是加快了很多的速度。

因為我很喜歡把這些細節搞懂,事實上,我是很少加班的人,因為寫下去的每行程式心中都十分篤定會有什麼結果,因此debug的時間相對就減少了,也因此多出了很多時間來學習更多的東西。我覺得這是一種良性循環。固然一開始會累一些,但後來會慢慢漸入佳境。如果老是在妥協,每個新的project來,又要妥協,隨著年資的增加,薪水越高,工作量必然也越來越多,到時候要妥協的東西就更多了。

這是為什麼我強迫我自己,不要陷入一般人的思維邏輯,為了趕project,做出一個自己心裡也覺得毛毛的東西,沒發現bug就謝天謝地,發現了,就熬夜。這不是我喜歡的工作模式。

很多書,我都是在上廁所,睡覺前,每天一點一滴看完的,把這些所謂的技術書,當成小說來看,等到真要用時再去翻。

>我不是說做學問追根究底不好,而是做事有時得懂得妥協.。
>提問者不是說了嗎?他的程式有一千三百多行!這已足說明他的job的重點
>已不是在'動態二維'的技術上,雖然他會用到'動態二維'。
>這時候的正解應就是vector。如果他作的程式目的是為了了解指標的指標,
>並用它來模擬二維陣列,那麼就不應該用vector了。
>至於是不是要懂的'STL實作的原理'才能去用vector。理想是這樣吧!
>但我想程式師麼多!絕大部份的人對'STL實作的原理'大概都很模糊吧!
>(就我所知),但若要這些不能用STL...我想也太苛了點 ^^
>vector <int> Array1D(m);
>可以模擬一維陣列 int Array1D[m];
>使用 vector<vector<int> > Array2D(m, vector<int>(n));
>則可以模擬 二維陣列 int Array2D[m][n],當然若是'時間'許可好好把它了解透澈是最好了,就算STL不是很熟,看到這例子,也可以模仿應用的!
>基本上我覺得手上有一本'C++ 標準程式庫'就可以用程式館的函式和STL
>來寫程式了。特別我要在聲明,對於自己所用的'程式館工具'越能了解當然越好!
>若是要做的程式是有關資料結構課程的,自己設計container是應該的;
>但若是要做的程式是有關應用的,只要知道怎麼用,就大膽去用STL的
>container!不要回頭去設計自己的container,否則可能你的project卡在
>debug container 上而無法在時間內完成。這是我說的妥協的意思。
>
>
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/2 下午 01:56:49
>謝謝您的指教。
>但是現在我無聊的執著又開始了,實在很想用ar[i][j]而不是其他的替代方案。
>用ar(i, j)太簡單了,一般會C++的都會,但是跟C++對二維陣列的寫程式習慣
>不一致。
>而用ar.val[i][j]就更簡單了,一般初學者都會,但是違反了資料封裝的原則。

做二層 operator [] 就可達到使用 ar[i][j] 的目的。
 
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/2 下午 02:51:26
>但是,我覺得在使用一種新東西時,如果老是在妥協,那BUG永遠解不完的。
該妥協時妥協,不是"老是在妥協"!

>我剛開始用STL的時候,就是相信可以很方便的用STL而不用去瞭解,結果是,
>光是vector就把我搞的頭昏眼花,很多我碰到的問題,查書查on-line help都找
>不到類似的說明,最後只好trace進去,才瞭解,原來如此。
STL 是使用 template 做出來的,不得不給你 source code。
不是所有程式館都有 source code 的,那怎麼辦?
trace source code 是好方法之一,但不要拘於非得有source code 否則我沒
辦法用的泥淖。

>我開始用MFC也是相同的,幸好MS開放MFC的source code。
可不是全部開放喔!

>我們自己都做過project,也都寫過document,相信也很有感覺,當一個東西開發
>完畢後,要寫document時,總是會覺得還是沒有把自己想要寫出來的東西寫完。
>而一個那麼大的lbrary,相信更難。
你大概都是寫很高階的程式吧!一般程式看看library's document都是夠用的。

>後來侯捷老師出了「STL源碼剖析」,我就趕快去買來看,真的太佩服他了。
>而我看了以後,對我工作更是加快了很多的速度。
翻譯的吧!?但還是該佩服的 ^^

>因為我很喜歡把這些細節搞懂,事實上,我是很少加班的人,因為寫下去的每行
>程式心中都十分篤定會有什麼結果,因此debug的時間相對就減少了,也因此多
>出了很多時間來學習更多的東西。我覺得這是一種良性循環。固然一開始會累一
>些,但後來會慢慢漸入佳境。如果老是在妥協,每個新的project來,又要妥協,
>隨著年資的增加,薪水越高,工作量必然也越來越多,到時候要妥協的東西就更多
>了。
像你這樣的人,學對東西擺對位置,會很有前途!
不是這樣的人,學對東西擺對位置,也不見得沒有前途!
以前公司有一個 project 需要在dos下自做一個text mode的windows系統。
所以需要細微的控制 key board。負責的工程師是屬於凡事要自己來的一型
(也是很聰明的一型),keyboard driver 從 scan code 字元轉換全部自己動手。
開發時間不說,最後產品上市了,常有key input的問題改不完(如key board該
亮的燈不亮,該熄的時候不熄)。直到該工程師轉到別的部門,接手的人還繼續在
改。後來產品賣到歐洲,客戶反應一些歐洲字元無法顯示!接手的工程師研究的結
果說要大動手術!當下我做了一個決定,把改了近兩年的keyboard拋棄,使用
hook的方法和PC原來的driver(可能不同字集的driver)掛勾,只做必要的過瀘和
控制,其它的送到原來的driver處理。工程師只花了一天工夫就完成了,該程式
有關keyboard的部份再也沒有問題反應回來。
這樣的例子不足以說明所有的case,有的問題確需要平時鑽研仔細的人才能解決。
還是那句話,該妥協時就要妥協(不是老是妥協)。

>這是為什麼我強迫我自己,不要陷入一般人的思維邏輯,為了趕project,
>做出一個自己心裡也覺得毛毛的東西,沒發現bug就謝天謝地,發現了,就熬夜。
>這不是我喜歡的工作模式。
"為了趕project,做出一個自己心裡也覺得毛毛的東西"並不是"思維邏輯";
使用程式館函式但不了解函式運做的細節,並不表示就會寫出一個會覺得毛毛
的東西。
很多初學C++的人都會用 cout<< 和 cin>>
但有幾個人知道它們運作的細節?不知道就不能用?太苛了!
還是用吧!當然有機會是要慢慢去消化理解 cout/cin 的運作,至於
trace istream/ostream 的程式?能去trace istream/ostream 是很好,
沒有也沒什麼大不了的。


作者 : duncan_macleod(洋將) Java卓越專家貼文超過1000則
[ 貼文 1121 | 人氣 921 | 評價 2490 | 評價/貼文 2.22 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/2 下午 02:58:11

>謝謝您的指教。
>但是現在我無聊的執著又開始了,實在很想用ar[i][j]而不是其他的替代方案。
>用ar(i, j)太簡單了,一般會C++的都會,但是跟C++對二維陣列的寫程式習慣不一致。
>而用ar.val[i][j]就更簡單了,一般初學者都會,但是違反了資料封裝的原則。

如果 Array2D 是把 vector 包裝起來, 那麼要做到 ar[i][j] 根本是 piece of cake.

如果是把動態配置的記憶體包裝在 Array2D 裡, 而 ar[i][j] 是唯讀, 那麼只要 oerload operator[] 傳回一個 pointer 即可, 完整一點的做法是把一維 Array 也包裝起來並提供 operator[] 複載, 這樣就可以做到:
data = ar[i][j];
ar[i][j] = data;

這種慣用寫法.
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/2 下午 03:58:40
>如果是把動態配置的記憶體包裝在 Array2D 裡, 而 ar[i][j] 是唯讀, 那麼只要
>oerload operator[] 傳回一個 pointer 即可

洋將也受不了這場口水而出面了 ^^

作者 : duncan_macleod(洋將) Java卓越專家貼文超過1000則
[ 貼文 1121 | 人氣 921 | 評價 2490 | 評價/貼文 2.22 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/2 下午 05:03:50
>洋將也受不了這場口水而出面了 ^^
>
>

最近工程師的家比較冷清, post 的機會也減少, 只好找機會插插花囉!

我隨手寫了一個很陽春的 2d array wrapper, 沒有 boundary checking(本來 C compiler 就沒有), 大家本本用. 或是有空把它改的更方便一點.

最好是直接用 vector 啦.

// array.h
#ifndef __ARRAY_H__
#define __ARRAY_H__

template<class T>
class Array
{
public:
Array() : len(0), dataP(0){}
Array(int m, T val = 0);
Array(int m, T* bufP);
virtual ~Array();

Array<T>& attach(int m, T* buf)
{
if (need_clean_up) cleanUp();
len = m;
dataP = buf;
return *this;
}

T operator[](int n) const;
T& operator[](int n);

operator T*()
{
return dataP;
}

int length() const
{
return len;
}

protected:
int len;
T* dataP;

private:
bool need_clean_up;
void cleanUp();
};

template<class T>
Array<T>::Array(int m, T val) : len(m), need_clean_up(true)
{
dataP = new T[len];
for (int i = 0; i < len; ++i)
dataP[i] = val;
}

template<class T>
Array<T>::Array(int m, T* bufP) : len(m), need_clean_up(false)
{
dataP = bufP;
}

template<class T>
Array<T>::~Array()
{
if (need_clean_up)
cleanUp();
}

template<class T>
T Array<T>::operator[](int n) const
{
return dataP[n];
}

template<class T>
T& Array<T>::operator[](int n)
{
return dataP[n];
}

template<class T>
void Array<T>::cleanUp()
{
delete[] dataP;
}

#endif // __ARRAY_H__
作者 : duncan_macleod(洋將) Java卓越專家貼文超過1000則
[ 貼文 1121 | 人氣 921 | 評價 2490 | 評價/貼文 2.22 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/2 下午 05:05:13
// array2d.h
#ifndef __ARRAY2D_H__
#define __ARRAY2D_H__

#include <iostream>
#include "array.h"

template<class T>
class Array2D
{
public:
    Array2D(int m, int n, T val = 0);
    virtual ~Array2D();
    
    Array<T> operator[](int n) const
    {
     return Array<T>(dim2, dataP[n]);
    }
    
    Array<T>& operator[](int n)
    {
     return proxy[n].attach(dim2, dataP[n]);
    }
    
    void dump() const;

protected:
    int dim1, dim2;
    T** dataP;

private:
    Array<T>* proxy;
};

template<class T>
Array2D<T>::Array2D(int m, int n, T val) : dim1(m), dim2(n)
{
    dataP = new T*[dim1];
    dataP[0] = new T[dim1 * dim2];
    for (int i = 0; i < dim1* dim2; ++i)
     dataP[0][i] = val;

    for (int i = 1; i < dim1; ++i)
     dataP[i] = dataP[i-1] + dim2;

    proxy = new Array<T>[dim1];
}

template<class T>
Array2D<T>::~Array2D()
{
    delete[] dataP[0];
    delete[] dataP;
    delete[] proxy;
}

template<class T>
void Array2D<T>::dump() const
{
    for (int i = 0; i < dim1; ++i){
     for (int j = 0; j < dim2; ++j)
     cout << dataP[i][j] << " ";
     cout << endl;
    }
}

#endif // __ARRAY2D_H__
作者 : frankfkc(長長) 程式設計甘苦談卓越專家C++優秀好手貼文超過1000則人氣指數超過50000點
[ 貼文 1148 | 人氣 62194 | 評價 4640 | 評價/貼文 4.04 | 送出評價 108 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/2 下午 08:41:04
>不是所有程式館都有 source code 的,那怎麼辦?

我並不是主張要去trace source code,而是學習的時候,能瞭解多細,就盡量多細。學會用vector當然很好,但是學會用**來模擬動態二維陣列為何是比較不好的方法呢?

>翻譯的吧!?但還是該佩服的 ^^

呵呵!那本書,他是作者。

>以前公司有一個 project 需要在dos下自做一個text mode的windows系統。
>這樣的例子不足以說明所有的case,有的問題確需要平時鑽研仔細的人才能解決。
>還是那句話,該妥協時就要妥協(不是老是妥協)。

我卻也不是說在寫程式時一定要凡事自己來,我超級喜歡用STL,也比較喜歡用MFC而不是基本的windows programming的方式,但是,我的想法是瞭解windows的運作原理,不但不妨礙MFC的運用,反而會有很大的幫助。
瞭解了int**模擬動態二維陣列的話,對瞭解vector< vector<int> >一樣會有很大的幫助的,不是嗎?但是在應用上,或許用vector會方便很多。

>'為了趕project,做出一個自己心裡也覺得毛毛的東西'並不是'思維邏輯';
>使用程式館函式但不了解函式運做的細節,並不表示就會寫出一個會覺得毛毛
>的東西。
>很多初學C++的人都會用 cout<< 和 cin>>
>但有幾個人知道它們運作的細節?不知道就不能用?太苛了!
>還是用吧!當然有機會是要慢慢去消化理解 cout/cin 的運作,至於
>trace istream/ostream 的程式?能去trace istream/ostream 是很好,
>沒有也沒什麼大不了的。

我不是說要去trace,只是要盡可能去瞭解,不過不瞞您說,我還真的去trace過fstream的source code,也稍微瞭解了運作模式。至於manipulator,我更是將那種技巧已經應用在我的project裡面。

盡可能去瞭解,除了能有source code去trace外,還有很多方法,從所學的知識去推論、從書上獲得、從on-line help、從網路、請教人等等,都行,但是能懂多少就盡量懂多少。每次這個少知道一些,那個不懂一點,累積起來不足的地方就慢慢會變多。反之,累積起來的東西就很可觀。

這是我的淺見。
作者 : frankfkc(長長) 程式設計甘苦談卓越專家C++優秀好手貼文超過1000則人氣指數超過50000點
[ 貼文 1148 | 人氣 62194 | 評價 4640 | 評價/貼文 4.04 | 送出評價 108 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/2 下午 08:49:03
題外話

我不知道我是不是擺對位置。

我工作上是寫很高階的演算法,要設計application framework的。
但是我也接過case是寫單晶片程式的,從我不會到寫完整個程式,也不過2個月,而且是利用下班時間寫的。
而後來要在driver裡面加東西,我當時也不會,所以就定一個月做完,但後來兩週就做完。
學弟寫assembler寫了一個月,我寫了三天就寫完,在花三天又改一個C版本給driver用。這個東西我覺得架構設計的很美,但是給driver用就顯得performance不夠,但後來沒有繼續改進,是一個敗筆。

對了,原則上,是不加班的。

我覺得就是這樣,不管什麼工作,反正只要不要離我專長(軟體)太遠,不管高階低階,我都接,只要時間不要太苛。這種自由自在、從心所欲的感覺真的很棒,而且時間又多,當然,這些多出來的時間,又可以拿來學習、思考,然後又讓工作更順利,然後時間又更多出來。這是一種良性循環。

或許是我運氣好吧!都遇到好老闆,好上司。

>像你這樣的人,學對東西擺對位置,會很有前途!
>不是這樣的人,學對東西擺對位置,也不見得沒有前途!
作者 : frankfkc(長長) 程式設計甘苦談卓越專家C++優秀好手貼文超過1000則人氣指數超過50000點
[ 貼文 1148 | 人氣 62194 | 評價 4640 | 評價/貼文 4.04 | 送出評價 108 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/2 下午 08:59:22
謝謝,我看了閣下之後兩篇的文章,果然是有料的,蠻精彩的,心裡很佩服,不是隨口說說簡單,卻又作不出所以然的那種人。

這個問題在More Effective C++裡面已經有提到了。而在一般介紹Design Pattern的書裡面關於Proxy也常用這個作範例。Proxy就是閣下裡面的Array那個class。

謝謝您!

以後如果閣下有空看到我胡說八道,還請多多指教,不要罵我這個人,但就請言論的本身,多多提出您的看法!

謝謝!

心得:
有時候設計一個東西,不是會動就好,而是要符合某些條件或習慣,當然有些問題是無解的,但有些則只有部分解。這就是很好的例子。

>如果 Array2D 是把 vector 包裝起來, 那麼要做到 ar[i][j] 根本是 piece of cake.
>
>如果是把動態配置的記憶體包裝在 Array2D 裡, 而 ar[i][j] 是唯讀, 那麼只要 oerload operator[] 傳回一個 pointer 即可, 完整一點的做法是把一維 Array 也包裝起來並提供 operator[] 複載, 這樣就可以做到:
>data = ar[i][j];
>ar[i][j] = data;
>
>這種慣用寫法.
作者 : frankfkc(長長) 程式設計甘苦談卓越專家C++優秀好手貼文超過1000則人氣指數超過50000點
[ 貼文 1148 | 人氣 62194 | 評價 4640 | 評價/貼文 4.04 | 送出評價 108 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/2 下午 09:01:21
我卻不認為這是口水戰。

本來討論就是希望能互相交換心得,或者能達成共識,或者還是各持己見,但在討論過程中,卻也獲得不少的心得與經驗。

>洋將也受不了這場口水而出面了 ^^
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/2 下午 11:55:45
>我卻不認為這是口水戰。
>本來討論就是希望能互相交換心得,或者能達成共識,
>或者還是各持己見,但在討論過程中,卻也獲得不少的心得與經驗。
唉呀!開個玩笑而已啦!
何況我可沒說那個"戰"字 ,
就算討論也總有口水吧 ^^

其實"討論"是有點失焦了!
我的原意是:
指標是指標,並不是陣列,拿指標來模擬一維陣列,無可厚非,但
指標的指標用在程式有其非陣列原始意義,用它來模擬二維陣列真是
難為它了!在C語言,或有其不得不的苦衷。到了C++若繼續延用苦
哈哈的point to pointer 有點像窮人家變富了後住高級住宅卻捨不得丟掉
舊家俱,每天還是穿著破爛的衣服一樣!
在C++使用class和operator overload 是較佳的動態二維解決方案。
若你想在C++學習如何製作動態二維陣列,就自製吧!
但若只是某個應用需要用到動態二維陣列,就直接用vector吧!
這是我的原意!
若非需要(因為學習或不合用),自製程式館原有提供的東西並不值得鼓勵!
除了浪費時間外,通常就算沒有捅出bug來也總是比程式館寫的差些!
畢竟程式館都是專家中的專家做的,也經千錘百鍊過的東西。
像長長兄自製的這段雙星模擬二維:
int **aa;
aa = (int**)malloc(sizeof(int*)*ROW); // ROW is known
for(i=0; i< ROW; ++i)
aa[i] = (int*)malloc(sizeof(int)*COLUMN); // COLUMN is known
在ROW變得很大或高頻率使用時,會不斷的配置記憶體導致系統記憶體
碎片化,是一個並不成熟的模擬。但就是自製嘛,誰想那麼多?大部份
的人,包括我寫出這樣的程式並不意外,也無可厚非。
像洋將兄寫的 Array/Array2D:
其實只要用一個一維的class加上二層的operator [] 就可以模擬二維陣列
了。但"信手寫來",那來閒功夫做得那麼精緻?正如洋將說明在先的:
"最好是直接用 vector 啦"(自製是純好玩^^)


作者 : frankfkc(長長) 程式設計甘苦談卓越專家C++優秀好手貼文超過1000則人氣指數超過50000點
[ 貼文 1148 | 人氣 62194 | 評價 4640 | 評價/貼文 4.04 | 送出評價 108 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/5 上午 09:32:31
對不起!沒看清楚。

>唉呀!開個玩笑而已啦!
>何況我可沒說那個'戰'字 ,
>就算討論也總有口水吧 ^^

>指標是指標,並不是陣列,拿指標來模擬一維陣列,無可厚非,但
>指標的指標用在程式有其非陣列原始意義,用它來模擬二維陣列真是
>難為它了!在C語言,或有其不得不的苦衷。到了C++若繼續延用苦
>哈哈的point to pointer 有點像窮人家變富了後住高級住宅卻捨不得丟掉
>舊家俱,每天還是穿著破爛的衣服一樣!
>在C++使用class和operator overload 是較佳的動態二維解決方案。
>若你想在C++學習如何製作動態二維陣列,就自製吧!
>但若只是某個應用需要用到動態二維陣列,就直接用vector吧!
>這是我的原意!
>若非需要(因為學習或不合用),自製程式館原有提供的東西並不值得鼓勵!
>除了浪費時間外,通常就算沒有捅出bug來也總是比程式館寫的差些!
>畢竟程式館都是專家中的專家做的,也經千錘百鍊過的東西。
>像長長兄自製的這段雙星模擬二維:
>int **aa;
>aa = (int**)malloc(sizeof(int*)*ROW); // ROW is known
>for(i=0; i< ROW; ++i)
>aa[i] = (int*)malloc(sizeof(int)*COLUMN); // COLUMN is known
>在ROW變得很大或高頻率使用時,會不斷的配置記憶體導致系統記憶體
>碎片化,是一個並不成熟的模擬。但就是自製嘛,誰想那麼多?大部份
>的人,包括我寫出這樣的程式並不意外,也無可厚非。

我同意不斷地allocate/free並不是一個好辦法。
我同意使用現有的library一般來說是比較好的選擇。

但,請問您知道使用vector的優缺點在哪嗎?

還有,使用vector of vector本質上就跟使用pointer to pointer有著某種程度的相似,您瞭解嗎?

其實,真正最佳解,我個人覺得是用一維陣列,然後自己根據(row, column)來計算index,這樣最不麻煩,記憶體最省,而且維護容易,但是語法上就無法跟c/c++對於二維陣列存取的語法相同,這是美中不足之處。

我想用什麼方法最重要的還是在於用的人瞭解多少,有些問題的解法只是取捨的而已。明白各種解法(自己設計的或現成的)的優缺點以及成本,我認為這或許可以作為「程式設計師」與「程式匠」的一個區別吧!
作者 : frankfkc(長長) 程式設計甘苦談卓越專家C++優秀好手貼文超過1000則人氣指數超過50000點
[ 貼文 1148 | 人氣 62194 | 評價 4640 | 評價/貼文 4.04 | 送出評價 108 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/5 上午 09:36:03
>不是隨口說說簡單,卻又作不出所以然的那種人。

我要為這兩句話,致上最深刻的歉意。
這兩句話純粹出於我卑劣個性的小人心態。
希望被我傷害到的大大,能夠大人不計小人過。
或許由於您寬宏大量的心胸,並沒有感覺被傷害,但是我一定要為我這不恰當的言論致上最深的歉意!

對不起!

作者 : s852101(古代遺跡) C++優秀好手貼文超過1000則
[ 貼文 1714 | 人氣 1992 | 評價 1270 | 評價/貼文 0.74 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/5 上午 10:59:37
>但,請問您知道使用vector的優缺點在哪嗎?
>還有,使用vector of vector本質上就跟使用pointer to pointer有著某種程度的
>相似,您瞭解嗎?
>其實,真正最佳解,我個人覺得是用一維陣列,然後自己根據(row, column)來計
>算index,這樣最不麻煩,記憶體最省,而且維護容易,但是語法上就無法跟c/c++
>對於二維陣列存取的語法相同,這是美中不足之處。

vector的關鍵,一般來說是大小的配置,和重新配置時的行為。
使用上對於記憶體的耗損會比使用malloc來得浪費空間。
空間溢滿時,重新配置新的記憶體以及資料搬移會影響使用上的效率。
這在vector的內容物是物件時尤其明顯。
粗淺的看,指標本身在vector是擔負iterator的功能(之一)
所以你說某程度的類似並不為過,只是缺少了功能性、檢查的動作...等。

[其實應該你是知道了.....算我對其他人囉唆好了]

二維陣列方面,一維陣列是不是最佳解?我不知道!!(這種事我不能亂說:P)
但是就看過的Metrix template Library的參考文件之後,至少我個人不
是這麼認為就是了........

vector的記憶體配置應是配置連續的記憶體區塊才是,不過在
"Small Memory Software"又看過其他記憶體使用的策略....~_~
針對"效率"實作的vector並不會多困難.不過我實在太懶了.沒有多深入研究
資訊僅供參考....Let's all.
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/5 下午 02:32:25
>但,請問您知道使用vector的優缺點在哪嗎?
>還有,使用vector of vector本質上就跟使用pointer to pointer有著某種程度
>的相似,您瞭解嗎?
只了解一點點,但不要叫我不能用vector...太殘忍了說 ^^

>其實,真正最佳解,我個人覺得是用一維陣列,然後自己根據(row, column)來
>計算index,這樣最不麻煩,記憶體最省,而且維護容易,但是語法上就無法跟
>c/c++對於二維陣列存取的語法相同,這是美中不足之處。
int i;
int **Array, *pData;
Array= (int **)malloc(m*sizeof(void *));
pData= (int *)malloc(m*n*sizeof(int));
for (i=0; i<m; i++, pData+=n)
    Array[i]=pData;
這樣子Array就可以使用二維下標來存取資料,兩個malloc也還可以併成一個,取
決於計不計較多一個malloc。
正如你所言vector of vector本質上就跟使用pointer to pointer有著某種程度
的相似,在column變得太大時,也會有memory fragment的問題。
但上面 Array 所用的方法一樣可以用一層的vector來模擬二維。
這是我前面說的,程式邏輯到處都存在和相通的!不一定用了vector就沒機會學到
pointer to pointer 的技巧。

>我想用什麼方法最重要的還是在於用的人瞭解多少,有些問題的解法只是取捨的而
>已。明白各種解法(自己設計的或現成的)的優缺點以及成本,我認為這或許可以作
>為「程式設計師」與「程式匠」的一個區別吧!
發明家和工程師各有其貢獻;「程式設計師」與「程式匠」應也都有其發揮的地方吧!
否則coco一定早餓死了 。
純"逗"嘴(不是鬥嘴哦)而已,不要理我這一句話 ^^

>>不是隨口說說簡單,卻又作不出所以然的那種人。
>我要為這兩句話,致上最深刻的歉意。
寫在那兒?之前沒看到說...
不過寫進我的心坎裡了...
自招了!我就是個"作不出所以然"的老頭子 ^^
只愛在網路上"秀逗";
最怕別人一句:"不然你寫個程式來瞧瞧"!
只要寫超過十行程式,我就掛了 ^_@

>我工作上是寫很高階的演算法,要設計application framework的。
>但是我也接過case是寫單晶片程式的,從我不會到寫完整個程式,也不過2個月,
>而且是利用下班時間寫的。
>而後來要在driver裡面加東西,我當時也不會,所以就定一個月做完,但後來兩週
>就做完。
>學弟寫assembler寫了一個月,我寫了三天就寫完,在花三天又改一個C版本給
>driver用。這個東西我覺得架構設計的很美,但是給driver用就顯得performance
>不夠,但後來沒有繼續改進,是一個敗筆。
喔喔喔...誤會了!
我說你大概是寫"高階"程式,指的是"高深"不是高階語言 ^^
僅此致歉!

>>翻譯的吧!?但還是該佩服的 ^^
>呵呵!那本書,他是作者。
很給他對不起了!我不太愛看書,所以雖然有那一本書,但沒看過 。
去check了一下,果然是候傑"著"!
我也要為這句話,致上最深刻的歉意。
好加在coco還是寫了"佩服"兩個字!

>盡可能去瞭解,除了能有source code去trace外,還有很多方法,從所學的知識
>去推論、從書上獲得、從on-line help、從網路、請教人等等,都行,但是能懂多
>少就盡量懂多少。每次這個少知道一些,那個不懂一點,累積起來不足的地方就
>慢慢會變多。反之,累積起來的東西就很可觀。
從頭同意到腳!









作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/5 下午 02:54:45
>vector的關鍵,一般來說是大小的配置,和重新配置時的行為。
>使用上對於記憶體的耗損會比使用malloc來得浪費空間。
>空間溢滿時,重新配置新的記憶體以及資料搬移會影響使用上的效率。
從原始提問看,需求是動態配置,但不會resize。
就這個規格來說,使用vector也不會造成重新配置的問題。
若考慮到陣列會resize,那麼使用 pointer to pointer 的方法來模擬
可resize的二維陣列就不是那麼簡單了。結果也還是有資料搬移,這時候
我的淺見是,更不應考慮"自製"。
[其實應該你是知道了.....算我對其他人囉唆好了] (co自古大之名言)^^

>vector的記憶體配置應是配置連續的記憶體區塊才是
對一維來說!否則便不能達到任一元素存取是時間常數了。

>針對"效率"實作的vector並不會多困難.不過我實在太懶了.沒有多深入研究
>資訊僅供參考....Let's all.
替換掉預設的 alloctor 即可(標準的知易行難)。

作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/5 下午 03:18:18
>我並不是主張要去trace source code,而是學習的時候,能瞭解多細,
>就盡量多細。學會用vector當然很好,但是學會用**來模擬動態二維陣列
>為何是比較不好的方法呢?
只是個人淺見!指標的指標並不是天生設計來模擬二維陣列的,指標本來的意義就
不是陣列,同樣指標的指標也和二維陣列不等義。在C中用指標的指標來模擬動態二維陣列,可說是不得不的苦衷。但C++已提供了overload [] 的解決方案,不用豈不
可惜?"學習"用**來模擬動態二維陣列沒什麼不好!只就應用層面來說,C++有
更好的解決就不必再用pointer to pointer。但若程式的目的是學習用**來模擬動
態二維陣列是另當別論的。

註:我從沒說"用**來模擬動態二維陣列"不重要,不必學習!基本上這是一個指標
的進階應用,當然該好好的學習。
作者 : frankfkc(長長) 程式設計甘苦談卓越專家C++優秀好手貼文超過1000則人氣指數超過50000點
[ 貼文 1148 | 人氣 62194 | 評價 4640 | 評價/貼文 4.04 | 送出評價 108 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/5 下午 08:10:06
嗯!謝謝!你說的極是!
我十分贊同。

我認為一維陣列來模擬多維陣列是最佳解的情況是在沒有那些範圍檢查之類的額外的安全維護裝置時,由於沒有額外的工作,當然效率比較好。可是,使用指標或直接用陣列,真的比較危險。

而對於vector的成本,您的分析我很贊同。

還有,是matrix還是metrix?兩者意義差很多喔。

>vector的關鍵,一般來說是大小的配置,和重新配置時的行為。
>使用上對於記憶體的耗損會比使用malloc來得浪費空間。
>空間溢滿時,重新配置新的記憶體以及資料搬移會影響使用上的效率。
>這在vector的內容物是物件時尤其明顯。
>粗淺的看,指標本身在vector是擔負iterator的功能(之一)
>所以你說某程度的類似並不為過,只是缺少了功能性、檢查的動作...等。
>
>二維陣列方面,一維陣列是不是最佳解?我不知道!!(這種事我不能亂說:P)
>但是就看過的Metrix template Library的參考文件之後,至少我個人不
>是這麼認為就是了........
>
>vector的記憶體配置應是配置連續的記憶體區塊才是,不過在
>'Small Memory Software'又看過其他記憶體使用的策略....~_~
>針對'效率'實作的vector並不會多困難.不過我實在太懶了.沒有多深入研究
>資訊僅供參考....Let''s all.
作者 : frankfkc(長長) 程式設計甘苦談卓越專家C++優秀好手貼文超過1000則人氣指數超過50000點
[ 貼文 1148 | 人氣 62194 | 評價 4640 | 評價/貼文 4.04 | 送出評價 108 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/5 下午 08:22:04
不是叫你不用,只是不是所有的情況用vector都是最好的選擇。
至於理由,古代遺跡大大已經說明。

>只了解一點點,但不要叫我不能用vector...太殘忍了說 ^^

底下的寫法比我之前的寫法好很多喔!果然是高手。

>int i;
>int **Array, *pData;
>Array= (int **)malloc(m*sizeof(void *));
>pData= (int *)malloc(m*n*sizeof(int));
>for (i=0; i<m; i++, pData+=n)
> Array[i]=pData;
>這樣子Array就可以使用二維下標來存取資料,兩個malloc也還可以併成一個,取
>決於計不計較多一個malloc。

其實如果陣列宣告後還會變動的話,vector的realloction會產生更多您說的那種狀況。

>正如你所言vector of vector本質上就跟使用pointer to pointer有著某種程度
>的相似,在column變得太大時,也會有memory fragment的問題。
>但上面 Array 所用的方法一樣可以用一層的vector來模擬二維。
>這是我前面說的,程式邏輯到處都存在和相通的!不一定用了vector就沒機會學到
>pointer to pointer 的技巧。
>

不,閣下實力很強的,還要跟你學習鬥嘴的地方多得是。

>寫在那兒?之前沒看到說...
>不過寫進我的心坎裡了...
>自招了!我就是個'作不出所以然'的老頭子 ^^
>只愛在網路上'秀逗';
>最怕別人一句:'不然你寫個程式來瞧瞧'!
>只要寫超過十行程式,我就掛了 ^_@

您客氣了
不是高深,真的是高階,都用C++的。

>喔喔喔...誤會了!
>我說你大概是寫'高階'程式,指的是'高深'不是高階語言 ^^
>僅此致歉!
>

作者 : frankfkc(長長) 程式設計甘苦談卓越專家C++優秀好手貼文超過1000則人氣指數超過50000點
[ 貼文 1148 | 人氣 62194 | 評價 4640 | 評價/貼文 4.04 | 送出評價 108 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/6 上午 08:55:33
嗯!所以,用vector或是用**或是用一維陣列則是看狀況來決定何者比較適合,而不是用vector是比較好的方式。

其實,我只是想表達這個意思而已。

>只是個人淺見!指標的指標並不是天生設計來模擬二維陣列的,指標本來的意義就
>不是陣列,同樣指標的指標也和二維陣列不等義。在C中用指標的指標來模擬動態二維陣列,可說是不得不的苦衷。但C++已提供了overload [] 的解決方案,不用豈不
>可惜?'學習'用**來模擬動態二維陣列沒什麼不好!只就應用層面來說,C++有
>更好的解決就不必再用pointer to pointer。但若程式的目的是學習用**來模擬動
>態二維陣列是另當別論的。
>
>註:我從沒說'用**來模擬動態二維陣列'不重要,不必學習!基本上這是一個指標
>的進階應用,當然該好好的學習。
>
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/5/6 下午 12:18:43
>嗯!所以,用vector或是用**或是用一維陣列則是看狀況來決定何者比較適合,
>而不是用vector是比較好的方式。
當然囉,天生我"材"必有用!任何的材料都有其適用的地方。
在真的很介意那一點點的效率時,**還是比較快的。用inline 的 [] operator
 overload,嗯...也不會慢到那裡去。隨便囉!有人愛吃甜有人愛吃鹹 ^^
 板主 : simula
 > C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
C++
1 Raymond 13050 
2 青衫 4760 
3 simula 4690 
4 coco 4030 
5 白老鼠(Gary) 3670 
6 ozzy 2540 
7 Ben 2250 
8 Anderson 1960 
9 windblown 1650 
10 Kenny 1560 
C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.3598633