Re: [問題] 請問傳入指標問題
※ 引述《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)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):