Re: [問題] 請問傳入指標問題

看板C_and_CPP作者 (藍影)時間14年前 (2011/07/11 02:31), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/3 (看更多)
※ 引述《liptonbin (wind)》之銘言: 恕刪 : A(u8 *readata) : { : u32 val; : u32 i; : for(i=0;i<10;i++) : { : val=readfun(REG); : memcpy(readata,&val,4) : readata+=4; : } : } 類似的寫法沒在書上看過,實際 code 裡雖很少看到,但還是有機會看到, 先大致推斷這是什麼情形,扣掉 REG 部份我不知道怎來的,可能是硬體, 但推斷,每次在 i loop 變化時,其 REG 之內容會 +4 (即 address += sizeof(u32)) 這部份可能要跟您確認,也可能是我猜錯。 軟體化之程式碼推斷大概長這樣 http://codepad.org/4epWpGEe ----- 簡單的說,我覺得有二個點您可能沒想通,第一個點看下面程式碼 #include <stdio.h> void show_hex(unsigned char* x) { int i; for(i=0; i!=4; ++i) printf("%02hhx ", x[i]); // or , you can write : printf("%02hhx ", *(x+i)); } int main() { unsigned x=0x12345678; show_hex((unsigned char*)&x); return 0; } 我的電腦執行結果是 78 56 34 12 (little endian) 事實上 unsigned x 傳過去後,乃當做 unsigned char 解讀,x[i] --> *(x+i), 以 x 為 base address, 移動 i 個 unsigned char,也就是一次移動 8 bits 所以在主程式裡面是 unsigned int (32bits),副函式裡面可分 4 次顯示、移動 接下來針對你的問題,說明會比較麻煩 ----- void A(u8 *readata) // readata 實際上確實是一個陣列, 也可能是動態產生的 { u32 i, val; for(i=0; i!=10; ++i){ val = readfun(REG); // 估每次讀到的都不同, REG 會指向陣列下個位址 memcpy(readata, &val, 4); // 4 = sizeof(u32) / sizeof(u8); readata+=4; // 將 readata 移動 4 個元素, 也就是移動了一個 u32 大小 } } 注意到,我認為上面提到的二個 4 若用 sizeof(u32)/sizeof(u8) 會更清楚, 重點在於, memcpy(readata, &val, 4); readata+=4; 效果等效於 memcpy(&readata[i], &val, 4); 在這裡的 val 雖是 1 個 32 位元之 u32, 但實際上你是可以看作是 4 個 8 位元之 u8 陣列, 這樣下來看下來,又變成,一次將 4 個元素的陣列,複制給另一個陣列。 會用你那種寫法,可能是在於速度之原故 (一個要取 index, 一個不用取 index), 甚至可能是一些崁入式系統或寫低階硬體,習慣性的寫法,這裡我不確定。 這樣,就清楚很多了, val 是 32 bits 之無號數, 而 readata 每個陣列元素只吃 8bits ,於是想把 val 之值, 每 8bits 逐一放入 readata 裡面,於是,一個 val 需要 4 個 readata 之元素做儲存 ※ 更簡單的說,這個副函式應是做陣列複製的動作,只是一個元素是u8, 一個是 u32 --------- 以上為吾人思緒,供參閱。 過程分析可能有所不當,若有誤,請指正。 -- YouLoveMe() ? LetItBe() : LetMeFree(); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.73.222 ※ 編輯: tropical72 來自: 180.177.73.222 (07/11 02:47)
文章代碼(AID): #1E6U_qOi (C_and_CPP)
文章代碼(AID): #1E6U_qOi (C_and_CPP)