2017-02-10 1 views
0

비트 배열의 요소를 C 언어의 함수에 전달하는 방법을 알고 싶습니다. 이 "논리"신호로 함수 실행을 제어하려고합니다. 제 아이디어는 일부 함수가 비트 배열의 전용 요소를 설정하거나 지우고이 함수가 내 함수의 동작을 변경하지만 함수 프로토 타입을 선언하는 방법을 알지 못합니다 (함수가 기대하는 컴파일러를 말하는 방법이 없습니다. 비트 배열 요소를 그의 주장 중 하나). C 언어 함수에서 개별 비트 배열 요소를 사용하는 방법에 대한 트릭이 있습니까? 제안 해 주셔서 감사합니다.비트 배열의 요소를 C 언어의 함수로 전달하는 방법

+0

함수에 foo''의 배열을 사용하여, 당신은 항상 할 수 'my_function (foo * my_foo)'를 호출 한 다음 함수 본문에서'my_foo [x]'를 가져 오거나 설정하십시오. –

+0

비트 배열의 몇 비트입니까? – technosaurus

+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은 동작을 결정하는 함수 유형입니다. 같은 비트 세트로 이제 구현할 수있는 작업은 비트가 클리어, 토글 비트 등 등 전체 예를 들어, 설정된 모든 비트는

:

#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; 
} 
관련 문제