Как преобразовать целое число в указатель uint8_t? - PullRequest
3 голосов
/ 23 мая 2019

У меня есть функция, определенная как:

void foo(uint8_t *val, int num)
{
    for(int i=0;i<num;i++)
        printf("Buffer[%i]=0x%X \n",i,val[i]);
}

Как глобальная переменная, у меня есть массив, объявленный как:

uint8_t Buffer[4] = {0x01, 0x02, 0x03, 0x04};

Итак, чтобы напечатать буфер, я делаюследующее:

int main()
{
    foo(Buffer,4);
    return 0;
}

Что дает в результате:

Buffer[0]=0x1                                                                                    
Buffer[1]=0x2                                                                                               
Buffer[2]=0x3                                                                                               
Buffer[3]=0x4 

Дело в том, что для конкретного случая мне нужно отправить только один параметр uint8_t этой функции, заменивбуфер, так что я реализовал это как:

int main()
{
    uint8_t READ_VAL[] = {0x01};
    foo(READ_VAL,1);
    return 0;
}

В любом случае, есть ли способ сделать это встроенным?Я пытался сделать это как

foo((uint8_t *)0x01,1);

, но он не работает (дает мне ошибку ошибки сегментации).Есть идеи, как мне это сделать?

1 Ответ

2 голосов
/ 23 мая 2019
foo((uint8_t []) { 0x01 }, 1);

Форма «( type ) { инициализаторы }» представляет собой составной литерал , указанный в C 2018 6.5.2.5.Он создает объект указанного типа со значением, заданным инициализаторами.

(uint8_t []) { 0x01 } создает массив из одного uint8_t со значением 0x01.Как массив, он автоматически преобразуется в указатель на свой первый элемент, который подходит для первого параметра foo.

Составной литерал внутри функции является временным, с продолжительностью автоматического хранения, связанной с егоограждающий блок.Составной литерал вне функции действует для выполнения программы со статической продолжительностью хранения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...