関数ポインタを使用して汎用ソリューションを探しているようです。つまり、実行するアクションを決定する関数ポインタを渡します。例:
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
は動作を決定する関数タイプです。今、あなたはすべてのビットを設定し、このようなビットセットなどのアクション、ビットはクリア、トグルビット、などなど
全例実装することができます:関数内の `foo`の配列を使用する
#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;
}
を、あなたは常にすることができます'my_function(foo * my_foo)'を呼び出して、関数本体の中で 'my_foo [x]'を取得または設定してください。 –
ビット配列の何ビットですか? – technosaurus
個々の「ビット配列の要素」をビットとして渡すことはできません。整数を渡すことができます。 1つの整数に収まるよりも多くのビットがある場合は、整数配列へのポインタを渡すことができます。この関数は、ビットのデコード( "ロジック")を行う必要があります。 –