2014-11-14 43 views
0

在C中,我想一個uint16_t數組傳遞到該需要uint8_t的函數:通行證uint16_t數組函數,它uint8_t *

bool fctn(uint8_t *data, size_t length); 

我有這樣的陣列,該陣列是一個結構內:

typedef struct sStruct sStruct; 
struct sStruct{ 
    uint16_t d[10]; 
} 
sStruct myStruct; 

所以我做的:

void test(sStruct structData) { 
    fctn((uint8_t*)structData->d[0], 10*sizeof(uint16_t)); 
} 

長度不是問題在這裏,它傳遞數組。如果這個數組不是指針已經 我收到「錯誤:從不同大小的整數轉換爲指針」,我怎麼能讓它看起來像一個uint8_t數組?就這個函數而言,一個uint16_t數組看起來就像一個長度爲uint8_t的雙精度數組,但我不知道如何告訴編譯器這個......當輸入已經是一個指針時。

如果數組「d」不是一個結構裏面,但剛一說全球性的,我只是做

fctn((uint8_t*)d, 10*sizeof(uint16_t)); 

怎樣做功能通過一個傳遞結構裏的數組的正確方法?

+2

d [0]是'uint16_t',而不是'uint16_t *'。通過'(uint8_t *)d' –

+0

謝謝,這清除了這個問題。我已經修改了第二個問題的問題。 –

+0

' - >'運算符只適用於指針。你可以像'd''一樣使用'structData.d',它沒有區別。 –

回答

1

當你說uint16_t d[10];,你正在定義一個數組d。當您說d[0]時,您訪問該陣列的第一個元素,該元素的類型爲uint16_t。該函數需要一個指針,所以你應該投的一個指針數組,而不是元素在裏面:

fctn((uint8_t*)d, 10*sizeof(uint16_t)); 

當你做到這一點,duint16_t[10]類型uint16_t*腐爛,然後轉換爲uint8_t*是前傳遞給fctn

順便說一句,你還可以使用sizeof(d)簡化您的長度計算:

fctn((uint8_t*)d, sizeof(d)); 

注意,如果d這隻能被聲明爲一個數組(堆棧上)。

+0

謝謝,這很有道理。我也嘗試過傳遞(uint8_t)&d [0],我認爲它只是從數組起始地址開始讀取數據,並將其轉換爲uint8_t,我不知道爲什麼這樣做不起作用。我最終會有更深入的關於結構傳遞的問題,但是在我能夠進行編輯之前,你們都快速回答:) –