可以動態增加某陣列的大小嗎? |
答題得分者是:RaynorPao
|
danielj
初階會員 ![]() ![]() 發表:65 回覆:135 積分:40 註冊:2003-06-11 發送簡訊給我 |
|
arnoyu
中階會員 ![]() ![]() ![]() 發表:73 回覆:88 積分:67 註冊:2003-03-21 發送簡訊給我 |
|
dllee
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
如果是靜態陣列,那大小是不能改的,這是大家都應該知道的。
如果是動態配置的陣列大小,要增大,只能再重新動態配置另一塊更大的記憶體,再將原陣列資料 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 發送簡訊給我 |
引言: 小弟的程式可能要在程式末端才能知道最終的陣列大小,但是在之前此陣列就要一直被填值進去,請問該如何處理比較好呢? 小弟唯一想得到的,就是先開一個夠大的暫存陣列,最後再將資料複製過去。 先感謝大家啦! danielj 你好: (1)你目前所使用的方法(先開一個夠大的暫存陣列),也是一個不錯的選擇,但 是要保證載入的資料大小,不會超過這個暫存陣列的大小,不然就會造成 Access Violation (2)其實要做到動態配置陣列的大小是可以做得到的,而且方法有很多種,我在 這裡列出兩種 (3)這是第一種方法,也是最簡單的方法,當你的陣列資料都是 BYTE 的時候, 其實可以直接用 TMemoryStream 來達到目的,範例程式碼如下-- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
dllee
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
您可以測試一下包大人的範例,不過,建議您作個執行時間的測試,當資料量由 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 發送簡訊給我 |
|
brant
一般會員 ![]() ![]() 發表:1 回覆:64 積分:23 註冊:2003-04-07 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |