Re: [問題] 巨集格式疑問

看板C_and_CPP作者 (卡卡獸)時間11年前 (2014/03/22 17:16), 編輯推噓10(1001)
留言11則, 10人參與, 最新討論串2/2 (看更多)
※ 引述《abcxxxx (撐過就是神)》之銘言: : 各位好, : 我的程度無法解析這段程式碼,第一次看到... : 所以也無法預期它的結果是如何(無奈) : #define BANK_BASE(i) (((unsigned long : [CFI_MAX_FLASH_BANKS])CFG_FLASH_BANKS_LIST)[i]) : 如果覺得太難看我有po在codepad上 : http://codepad.org/KFLZto8O : 已經有在網路上找到解釋,但是不知道這段的思路是怎走的 : http://ppt.cc/dpA3 : 拜託各位了 : 餵入的資料(Input): : 預期的正確結果(Expected Output): : 錯誤結果(Wrong Output): : 程式碼(Code):(請善用置底文網頁, 記得排版) : 補充說明(Supplement): 為了慶祝我總算看懂了,所以我決定 reply .... 關鍵只有一個:這是個 no-name 陣列,然後請見諒,我不知道它的正式名稱是不是 叫 no-name array, 這是我亂叫的。 我們舉個比較簡單的例子,假設要設一個 no-name array ,資料型態是 int, 有兩個元素,可以這麼宣告。 int [2] ; // 它是 no-name array, 但這麼做根本沒用 但這種方式沒辦法給初值,所以應該是非法,具小弟所知, no-name 東西必須要給值 (比較常見的 no-name struct 大概就讓人有印象了..) (int [2]) { 123 , 456 } ; // no-name array 給初值 到目前為止,其實這一整個步驟,就是上篇版友 carylorrk 所說的, 將 {123,456} 強制轉形成兩個元素的整數陣列,我想他的說法應是比較正確的。 再來是,如果要取得這個 no-name array 的第零個索引值,也就是 [0] 裡面的 123 的 話,就變成了 ( (int [2]) { 123 , 456} ) [0] ; // 取得 no-name array[0] 最後再由於它裡定義成了 macro ,所以最外圍會被加上大括號。 上面這行我在 gcc (code::blocks 12.11) 裡面 printf 出來真的會輸出 123 , 附 code http://codepad.org/otdaPtgt 然後知道上面之後,下面沒興趣看的話請按個讚後就可以略過不看了.. --------------------- 你給的網頁裡的說明資訊其實是針對只有一個元素的陣列情況, 原型 #define BANK_BASE(i) (( (unsigned long [CFI_MAX_FLASH_BANKS])CFG_FLASH_BANKS_LIST)[i]) 先追 CFI_MAX_FLASH_BANKS #define CFI_MAX_FLASH_BANKS CONFIG_SYS_MAX_FLASH_BANKS #define CONFIG_SYS_MAX_FLASH_BANKS 1 查到是 1 ,變成下面這樣 #define BANK_BASE(i) (( (unsigned long [1])CFG_FLASH_BANKS_LIST)[i]) 換句話說它是一個 unsigned long no-name array, 只有一個元素。 然後再查 CFG_FLASH_BANKS_LIST, #define CONFIG_SYS_FLASH_BASE 0x10000000 #define CONFIG_SYS_FLASH_BANKS_LIST { CONFIG_SYS_FLASH_BASE} 所以原式又變成了 #define BANK_BASE(i) (( (unsigned long [1]){0x10000000})[i]) 換句話說,它是一個 no-name array, 裡面只有一個元素,放的是 0x10000000, 然後你輸入的 i 也只能是 0 而已。 那如果今天 FLASH 想要支援兩個 bank 以上呢?? 嗯,我看你給的網頁其實覺得他寫的沒很清楚,上網找其他的 #define 果然有找到類 似的東西,不過要把關鍵字一直丟進去 google ,我懶得一個一個做對應, 直接把我找到得資訊 po 了。 1. 想要支援 2 個 banks 時怎麼改 http://ppt.cc/TxOt , 裡面的 -#define 應該指的是把原始碼的 #define 去掉 +#define 應是在原始碼裡面加上該 #define。然後重要的 #define 我列出來, 你要代入再自己慢慢代 #define CONFIG_SYS_MAX_FLASH_BANKS 2 // 這跟剛剛不一樣了唷 #define CFG_FLASH_BASE 0 #define CFG_FLASH_BANKS_LIST { CFG_FLASH_BASE, CFG_FLASH_BASE+flash_info[0].size } 等效 #define CFG_FLASH_BANKS_LIST { 0 , 0+flash_info[0].size} 2. flash_info[0].size 明顯是 struct,再 google 查一下。 http://ppt.cc/nHiQ 大致上可以推出,它是計算一個 BANK 有多大。 3. 小結 總結如果是兩個 banks 的話, macro 展開就如下 #define BANK_BASE(i) ( ( ( (unsigned long) [2] ) { 0 , 0x10000000} ) [i] ) 然後那個 0x10000000 , 是我假設 flash_info[0].size 大小是 0x10000000, 簡單的說這個 macro 是取得第 i 片 CFI (快閃記憶體介面) 的起始位置值無誤。 -- ~ 這輩子與神手無緣 我只好當神獸了 ~ 卡卡獸 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.73.224 ※ 編輯: EdisonX 來自: 180.177.73.224 (03/23 01:23)

03/23 01:55, , 1F
好像是叫 compound literals, C99 支援 http://ppt.cc/0lCs
03/23 01:55, 1F

03/23 02:20, , 2F
謝謝...這種用法真的很罕見 我剛看到時整個傻眼不知從何下
03/23 02:20, 2F

03/23 02:21, , 3F
手..也只能google跟EdisonX大講解的一樣 謝謝謝謝謝......
03/23 02:21, 3F

03/23 14:46, , 4F
03/23 14:46, 4F

03/23 18:13, , 5F
推詳細解釋
03/23 18:13, 5F

03/23 22:24, , 6F
詳細推
03/23 22:24, 6F

03/23 23:56, , 7F
03/23 23:56, 7F

03/24 01:22, , 8F
推 像在挖寶一樣XD
03/24 01:22, 8F

03/24 18:18, , 9F
謝謝
03/24 18:18, 9F

03/25 00:49, , 10F
謝謝,不過是用在什麼地方呢 超好奇
03/25 00:49, 10F

04/15 23:53, , 11F
04/15 23:53, 11F
文章代碼(AID): #1JBSLjRm (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
問題
1
3
完整討論串 (本文為第 2 之 2 篇):
問題
1
3
文章代碼(AID): #1JBSLjRm (C_and_CPP)