2016-02-29 41 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