Копировать значения из одного массива в другой, не используя арифметику указателей - PullRequest
1 голос
/ 25 марта 2020

Я использую эту функцию для копирования некоторых значений из одного массива в другой массив:

void *copy_array(const void *src, void *dest, uint8 pos, uint8 len, uint8 elemsize)
{
   const unsigned char *csrc = src;

   memcpy(dest, csrc + (pos * elemsize), len * elemsize);
}

Есть ли подобный способ сделать это без использования арифметики указателей c? MISRA предлагает избежать арифметических указателей c.

1 Ответ

1 голос
/ 26 марта 2020

Для соответствия требованиям MISRA просто выполните memcpy(dest, &csrc[pos * elemsize], len * elemsize);.

Хотя я не совсем понимаю, зачем вам нужна функция для этого, вместо того, чтобы просто вызывать memcpy напрямую. Как упоминалось в комментариях, MISRA не одобряет использование пустых указателей с помощью консультативных правил, поскольку критически важное программное обеспечение должно определяться c, а не generic c.

Кроме того, len * elemsize довольно сомнительно, так как это ограничит функцию массивами максимум из 255 байт.

Вы можете избежать многих проблем MISRA, преобразовав функцию в функциональный макрос. Не обязательно улучшение читаемости, но, насколько я помню, это должно быть MISRA-совместимым:

#define copy_array(src, dst, pos, len, elemsize) \
  memcpy((dst), &(src)[(pos)*(elemsize)], (len)*(elemsize))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...