Я использую эту функцию для копирования некоторых значений из одного массива в другой массив:
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);
}
Есть ли аналогичный способ сделать это без использования арифметики указателя? MISRA предлагает избегать арифметики указателей.
1 ответ
Для соответствия требованиям MISRA просто выполните memcpy(dest, &csrc[pos * elemsize], len * elemsize);
.
Хотя я не совсем понимаю, зачем вам нужна функция для этого, вместо того, чтобы просто вызывать memcpy
напрямую. Как упоминалось в комментариях, MISRA не одобряет использование пустых указателей через рекомендательные правила, поскольку критически важное программное обеспечение должно быть детерминированным, а не общим.
Кроме того, len * elemsize
довольно сомнительна, так как это ограничило бы функцию массивами размером не более 255 байт.
Потенциально вы могли бы избежать многих проблем MISRA, преобразовав функцию в макрос, похожий на функцию. Не обязательно улучшение читабельности, но, насколько я помню, это должно соответствовать требованиям MISRA:
#define copy_array(src, dst, pos, len, elemsize) \
memcpy((dst), &(src)[(pos)*(elemsize)], (len)*(elemsize))
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.
void*
, если это возможно.const uint8 (*x)[elemsize] = src; memcpy(dest, &x[pos], len * sizeof *x);
.