Re: [問題] 另一種方式的動態配置二維陣列…
看到上面一篇討論二維動態陣列的文章回文
我也連過來看這篇了
針對這篇最後面的論點我想補充一下
這是我在嵌入式系統方面的一點小經驗
將二維(或多維)動態陣列一次宣告完成
再自己配置每一層的指標和所擁有的空間
有一個好處就是溝通的時候方便
我所謂溝通可以是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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):