2017-02-10 19 views
0

ビット配列の要素をC言語の関数に渡す方法を知りたいと思います。私はこの "論理"信号によって機能の実行を制御したいと思う。 私の考えは、一部の関数がビット配列の専用要素を設定またはクリアし、この動作が関数の動作を変更することですが、関数プロトタイプの宣言方法はわかりません(関数が期待するコンパイラ彼の議論の1つとしてのビット配列要素)。 C言語関数で個々のビット配列要素を使用する方法は常に存在しますか? ありがとうございます。ビット配列の要素をC言語の関数に渡す方法

+0

を、あなたは常にすることができます'my_function(foo * my_foo)'を呼び出して、関数本体の中で 'my_foo [x]'を取得または設定してください。 –

+0

ビット配列の何ビットですか? – technosaurus

+1

個々の「ビット配列の要素」をビットとして渡すことはできません。整数を渡すことができます。 1つの整数に収まるよりも多くのビットがある場合は、整数配列へのポインタを渡すことができます。この関数は、ビットのデコード( "ロジック")を行う必要があります。 –

答えて

0

関数ポインタを使用して汎用ソリューションを探しているようです。つまり、実行するアクションを決定する関数ポインタを渡します。例:

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; 
} 
関連する問題