2016-02-29 2 views
0

В настоящее время я посылаю команды через spi следующим образом:передающий массив как аргумент функции c

Я хочу создать функцию для отправки любой переданной ей команды. Могу ли я передать массив байтов в качестве аргумента функции? Как у меня внизу.

+0

Вы не можете передать массив в/из функции в C. Но вы можете передать указатель на свой первый элемент. – Olaf

ответ

1

Попутный массивов осуществляется с помощью указателей в C.
Так как массивы могут распада к указателю через неявное преобразование из T[] в T*, мы передаем указатель на функцию со ссылкой на массив.

Написать функцию, как

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

и назвать его как

sendCommand(SyncCmd); 

Однако, берегитесь: sizeof(Cmd) дает размер указателя, а не весь массив , при использовании в пределах sendCommand. Поэтому вам нужно явно передать размер. См. 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

@ Олаф Хм, хорошо, это ваше восприятие. Тот факт, что указатель ссылается на массив, должен также проявляться при чтении окружающего кода. Кроме того, что, если кто-то действительно передал только один элемент как 'cmd' с размером 1? Я предпочитаю 'uint8_t *'. Но я упомянул об их эквивалентности, да. [Линус также говорит об этом и ядре] (https://lkml.org/lkml/2015/9/3/499), только если вам интересно. – Downvoter

+0

Теперь я читал указ Линуса. Я полностью согласен с ним в том, что люди должны учиться и знать C. Но это означает, что они знают о формальном преобразовании аргументов массива. Они уже должны знать, что фактический аргумент аргумента массива для указателя, поэтому аргумент форматирования также должен быть ясным. Если вы полагаетесь на определенный размер для аргумента массива, вы должны передать этот размер (возможно, главной проблемой является синтаксис '[]'). Либо как константа, либо VLA. Заголовок функции должен документировать несоответствие аргументов(), например. Doxygen комментирует. Требование чтения кода для понимания интерфейса просто плохо – Olaf

Смежные вопросы