함수 포인터를 사용하는 일반적인 솔루션을 찾는 것처럼 들립니다. 즉, 취할 조치를 결정하는 함수 포인터를 전달하십시오. 예 :
void bit_change (uint8_t* arr,
size_t byte_index,
size_t bit_index,
action_t* action)
{
arr[byte_index] = action(arr[byte_index], bit_index);
}
여기에서 action_t
은 동작을 결정하는 함수 유형입니다. 같은 비트 세트로 이제 구현할 수있는 작업은 비트가 클리어, 토글 비트 등 등 전체 예를 들어, 설정된 모든 비트는
:
#include <stdint.h>
#include <inttypes.h>
#include <stdio.h>
typedef uint8_t action_t (uint8_t data, size_t bit);
uint8_t bit_set (uint8_t data, size_t bit)
{
return (uint8_t) (data | (1u << bit));
}
uint8_t bit_clear (uint8_t data, size_t bit)
{
return (uint8_t) (data & ~(1u << bit));
}
void bit_change (uint8_t* arr,
size_t byte_index,
size_t bit_index,
action_t* action)
{
arr[byte_index] = action(arr[byte_index], bit_index);
}
void print_array (size_t size, const uint8_t array[size])
{
for(size_t i=0; i<size; i++)
{
printf("%.2"PRIu8 " ", array[i]);
}
printf("\n");
}
int main (void)
{
uint8_t array [5] = {0};
bit_change(array, 0, 2, bit_set);
print_array(sizeof(array), array);
bit_change(array, 0, 2, bit_clear);
print_array(sizeof(array), array);
return 0;
}
함수에 foo''의 배열을 사용하여, 당신은 항상 할 수 'my_function (foo * my_foo)'를 호출 한 다음 함수 본문에서'my_foo [x]'를 가져 오거나 설정하십시오. –
비트 배열의 몇 비트입니까? – technosaurus
비트 배열의 개별 "요소"를 전달할 수 없습니다. 정수를 전달할 수 있습니다. 정수보다 더 많은 비트가있는 경우 정수 배열에 대한 포인터를 전달할 수 있습니다. 함수는 비트 ("논리")의 디코딩을 수행해야합니다. –