全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:7179
推到 Plurk!
推到 Facebook!

可以動態增加某陣列的大小嗎?

答題得分者是:RaynorPao
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-10 18:40:31 IP:61.220.xxx.xxx 未訂閱
小弟的程式可能要在程式末端才能知道最終的陣列大小,但是在之前此陣列就要一直被填值進去,請問該如何處理比較好呢? 小弟唯一想得到的,就是先開一個夠大的暫存陣列,最後再將資料複製過去。 先感謝大家啦!
arnoyu
中階會員


發表:73
回覆:88
積分:67
註冊:2003-03-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-10 19:08:23 IP:61.56.xxx.xxx 未訂閱
 
霹靂副站長 jackkcg有貼過一篇:【推薦】中文C  FAQ 
文章中間有提到..
Q41:C   能不能做到在執行時期才指定陣列的長度?
http://delphi.ktop.com.tw/topic.php?topic_Id=21158    要用霹靂的眼光去看它,才能見到文章的真義喔~~
     ===三人行必有我師焉===
        
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-10 22:10:33 IP:61.224.xxx.xxx 未訂閱
如果是靜態陣列,那大小是不能改的,這是大家都應該知道的。 如果是動態配置的陣列大小,要增大,只能再重新動態配置另一塊更大的記憶體,再將原陣列資料 COPY 過去,就可以刪掉舊陣列,改操作新配置到的陣列。 不過,依您的應用,如果您可以得知夠大的暫存陣列大小,那建議,先直接開一個夠大的暫存陣列,處理完再一次 COPY 到目標陣列,這樣速度比較快。這是以空間換取時間的最好方法。 如果,您要動態改變陣列來完成,也是可以的,不過,您可以想想,多次的重配置、COPY 的時間,是很可怕的喔。 如果您有用過 MATLAB 有類似的東西,可以讓您任意動態改變陣列大小的,當陣列小時,不會有什麼感覺,但是當陣列愈來愈大時,同樣的運算,時間確會變長,有時會慢到受不了...還是學生時,因為上課的老師只懂 MATLAB,要求我們用 MATLAB 作影像處理,那時的電腦大約是 MMX-233 左右,許多同學都反應處理影像 256x256 灰階影像,都要很久,但我卻不會,原因只是大部分都是直接利用 MATLAB 會自動幫您陣列動態變大的特性去寫程式,而我則是先配置要陣列的大小再處理,如此可以省去不必要的記憶體重配置時間。    沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-10 22:59:56 IP:61.221.xxx.xxx 未訂閱
引言: 小弟的程式可能要在程式末端才能知道最終的陣列大小,但是在之前此陣列就要一直被填值進去,請問該如何處理比較好呢? 小弟唯一想得到的,就是先開一個夠大的暫存陣列,最後再將資料複製過去。 先感謝大家啦!
danielj 你好:
(1)你目前所使用的方法(先開一個夠大的暫存陣列),也是一個不錯的選擇,但
   是要保證載入的資料大小,不會超過這個暫存陣列的大小,不然就會造成
   Access Violation
(2)其實要做到動態配置陣列的大小是可以做得到的,而且方法有很多種,我在
   這裡列出兩種
(3)這是第一種方法,也是最簡單的方法,當你的陣列資料都是 BYTE 的時候,
   其實可以直接用 TMemoryStream 來達到目的,範例程式碼如下
>>>>> >
#>>>>>
< class="code">
備註:
(1)有關 TMemoryStream 的使用方法,建議你多參考 BCB Help 中的說明,或者
   是搜尋站內發表過的相關文章
(2)有關 Win32 API CoTaskMemAlloc, CoTaskMemRealloc, CoTaskMemFree 的詳
   細使用方法,請參考 M$DN 中的說明
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/htm/cmf_a2c_9bj7.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/htm/cmf_a2c_3lpf.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/htm/cmf_a2c_63l1.asp
-- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-11 09:18:38 IP:61.224.xxx.xxx 未訂閱
您可以測試一下包大人的範例,不過,建議您作個執行時間的測試,當資料量由 256 變 2560 變 25600 變 256000 變 2560000 變 25600000 時,所需時間,可不是 10 倍 10 倍的增加喔... 關於這點,是許多程式設計者沒有考慮到的。之前的 CASE 是我向一家法國的軟體公司買一套元件(不含 SOURCE),該元件在資料量少(500筆)時,操作一切正常處理轉換時間很短,而當資料大於 2000 筆時,每次該元件在作資料轉換的時間就造成我的系統掉當,經過反應,對方確認是他們的問題... 如果真的要動態改變,要參考 TList 這類元件的作法,多一個 Capacity 的屬性,可以知道目前的容量是多少,當要存的資料大於這個容量時,一次增加 N 個空間,而不是只增加 1 個空間,這樣可以減少記憶體重新配置的 overhead。 這都是我的切身之痛...    沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-11 09:44:56 IP:61.220.xxx.xxx 未訂閱
多謝dllee 的回應,小弟有時間會試看看的!
brant
一般會員


發表:1
回覆:64
積分:23
註冊:2003-04-07

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-11 14:30:16 IP:210.243.xxx.xxx 未訂閱
引言: 多謝dllee 的回應,小弟有時間會試看看的!
C standard library 裡有個 class 叫 vector 也可以試試。
系統時間:2024-08-02 0:23:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!