Re: [問題] 另一種方式的動態配置二維陣列…

看板C_and_CPP作者 (阿水~*)時間16年前 (2009/10/18 05:53), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/3 (看更多)
看到上面一篇討論二維動態陣列的文章回文 我也連過來看這篇了 針對這篇最後面的論點我想補充一下 這是我在嵌入式系統方面的一點小經驗 將二維(或多維)動態陣列一次宣告完成 再自己配置每一層的指標和所擁有的空間 有一個好處就是溝通的時候方便 我所謂溝通可以是arm跟dsp溝通 也可以是平行處理的時候多個thread之間的溝通 指標方面arm跟dsp看的分別是虛擬跟實體位置,所以溝通上會用一個特定方式傳 以TI6446來說就是inDesc跟inArgs,inDesc結構有三個變數 char ** 一個陣列用來存每個空間指標 (每個空間指標可能是一張圖或更多維的空間) int * 一個陣列用來存每個空間的大小 int 共有幾個空間指標 傳送時會把所有的虛擬位置轉實體位置 多個執行緒彼此溝通可能也要用API發布共用空間 share memory 這時候二維三維就麻煩了 要用for loop去發布 但一維就只要malloc的時候,一次發布 要出門了 @@先走 PS1.我只是研究生所以嵌入式也是一知半解,有錯誤歡迎糾正 PS2.我回應的這篇文章,原本的推文中有人說結構沒辦法,但其實可以唷,指標算清楚就可以了 ※ 引述《VictorTom (鬼翼&娃娃魚)》之銘言: : ※ 引述《ychch (GG)》之銘言: : : → ychch:感謝你的解釋…雖然看不太懂…但我會在想看看@@ 06/22 22:32 : 唉~~小弟我不太擅長在BBS上畫圖, 本來實在很懶得回的....Orz : 傳統new一個二維陣列的作法大概如下.... : int W = 16, H = 16; : char **p = new char*[H]; : for(int i=0; i<H; ++i) : p[i] = new char[W]; : for(int i=0; i<H; ++i) : delete []p[i]; : delete []p; : 這樣做的問題是, 你的p[][]陣列有可能是不連續的.... : 連不連續依運用未必是要考慮的問題, 我只是先提一個可能性.... : 下面用一張簡圖表示, 因為小弟實在不擅長BBS畫圖.... : p: |---- ---- ---- ----| : | | | +---> p[3]: |---- ----| : | | +---> p[2]: |---- ----| : | +---> p[1]: |---- ----| : +---> p[0]: |---- ----| : 用一個一維陣列模擬二維陣列的作法大概如下.... : char **p = new char*[H]; : char *raw = new char[W*H]; : for(int i=0; i<H; ++i) : p[i] = &raw[i*W]; : delete []p; : delete []raw; : 這樣做, 至少可以保證你的p[][]也就是raw[]是連續的.... : 還方便一點, 不需要空間關係的循序操作您可以對raw[]直接做.... : 而它的記憶體分布情形大概簡圖如下.... : p: |---- ---- ---- ----| : | | | | : | | | +--------------+ : | | | | : | | +---------+ | : | | | | : | +----+ | | : | | | | : raw:|---- ---- ---- ---- ---- ---- ---- ----| : 而您找到的那種寫法, 恕小弟不再貼code了.... : 它的簡圖大概像這樣, 我畫一畫意思有到就行了.... : 因為有交叉太麻煩畫了, 請您自己試著連連看吧.... : 連完您就知道理論上沒有空間被浪費掉的.... : p: | (這一段放p[i]) (這一段相當於上面的raw) | : |---- ---- ---- ----|---- ---- ---- ---- ---- ---- ---- ----| : | | : 最後一個寫法比前一個稍微好一點的地方是.... : 它只需要new/delete一次, 所有空間都是連續的.... : 想用二維陣列的操作模式就直接用p[i][j].... : 想用一維模式就存取p[H]以後的範圍, 當然可能要加個轉型.... : 或者乾脆另外用一個變數 char *P = (char*)p[H]; 這樣:) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.136.155.2
文章代碼(AID): #1Asgr1c4 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1Asgr1c4 (C_and_CPP)