2016-02-29 47 views
0

我目前發送命令通過SPI如下:傳遞數組作爲函數參數Ç

我想創建一個函數來發送傳遞給它的任何命令。我可以傳遞一個字節數組作爲參數來運行嗎?就像我在下面。

+0

您不能向C中的函數傳遞數組或從C中的函數傳遞數組,但可以將指針傳遞給它的第一個元素。 – Olaf

回答

1

傳遞數組中C.
使用指針通過從T[]的隱式轉換完成,因爲陣列可以衰變到指針T*,我們將指針傳遞給參照陣列的功能。

收件像

void sendCommand(uint8_t* Cmd) { 
    ... 
} 

功能並調用它像

sendCommand(SyncCmd); 

然而,注意:sizeof(Cmd)產生了尺寸指針,而不是整個陣列 ,當在sendCommand內使用時。因此,您需要明確傳遞大小。見Linus Torvalds的this在這件事上聽到一些粗暴的話。


注意,作爲參數使用時uint8_t[]uint8_t*uint8_t[42],和朋友都是等效的。也就是說,這些都是等效的:

void foo1(uint8_t*); 
void foo2(uint8_t[]); 
void foo3(uint8_t[42]); 

感謝@Olaf爲您的網站的貢獻。

+0

'uint8_t cmd []'也很好。更清楚的是,它被用作內部數組 - 自我記錄代碼。 – Olaf

+0

@奧拉夫嗯,那是你的看法。當通過周圍的代碼閱讀時,指針引用數組的事實也應該是顯而易見的。另外,如果某人真的只傳遞了一個元素作爲大小爲1的'cmd'?我更喜歡'uint8_t *'。但是我會提到他們的等同性,是的。 [Linus在這方面和內核方面也有發言權](https://lkml.org/lkml/2015/9/3/499),只有在你感興趣的時候。 – Downvoter

+0

我現在讀了Linus咆哮。我完全同意他說,人們應該學習和認識C.但這意味着他們意識到正式的數組參數轉換。他們已經必須知道實際的數組參數衰減到指針,所以格式參數衰減也應該清楚。如果你依賴於一個特定的數組參數大小,你必須通過這個大小(也許主要問題是'[]'語法)。作爲常數或VLA。函數頭應該記錄參數()和例如。 Doxygen評論。要求閱讀代碼來理解接口是不好的 – Olaf