문제

나이(다)큰 진실이블/주 하는 컴퓨터를 구현해야에서 내 코드(embedded C).내가 예상 동작 사양의 상태계 변경에 미래,그리고 나는 다음과 같이 쉽게 수정할 수 있다.

나의 진리 테이블에는 4 개의 입력과 출력 4 개.나는 모두에서 Excel 스프레드시트,그리고 내가 할 수있는 경우에 붙이는 것으로 나의 코드 작은 서식하는 것이 이상적입니다.

나는 생각 나는 것처럼 액세스 진리는 테이블처럼 그렇:

u8 newState[] = decisionTable[input1][input2][input3][input4];

그리고 나서 액세스할 수 있는 출력 값:

setOutputPin( LINE_0, newState[0] );
setOutputPin( LINE_1, newState[1] );
setOutputPin( LINE_2, newState[2] );
setOutputPin( LINE_3, newState[3] );

그러나를 얻기 위해서는,생각해야 할 것이 상당히 복잡는 테이블처럼 그렇:

static u8 decisionTable[][][][][] =
 {{{{ 0, 0, 0, 0 },
    { 0, 0, 0, 0 }},
   {{ 0, 0, 0, 0 },
    { 0, 0, 0, 0 }}},
  {{{ 0, 0, 1, 1 },
    { 0, 1, 1, 1 }},
   {{ 0, 1, 0, 1 },
    { 1, 1, 1, 1 }}}},
 {{{{ 0, 1, 0, 1 },
    { 1, 1, 1, 1 }},
   {{ 0, 1, 0, 1 },
    { 1, 1, 1, 1 }}},
  {{{ 0, 1, 1, 1 },
    { 0, 1, 1, 1 }},
   {{ 0, 1, 0, 1 },
    { 1, 1, 1, 1 }}}};

그 중첩된 대괄호 다소 복잡할 수 있습--지지 않는 더 나은 생각을 유지할 수 있는 방법을 꽤 찾는 테이블에서 내 코드는?

감사합니다!

편집 기반으로 HUAGHAGUAH 의 대답:

의 융합을 사용하여 모든 사람의 입력(감사--나는"동의"3 개 또는 4 개의 이러한 답변),생각하는 데 도움이 될 것입니다.으로 두 개의 차원 배열입니다.내가 지수로 나열을 사용하는 작은 비트 시프트 macro:

#define SM_INPUTS( in0, in1, in2, in3 ) ((in0 << 0) | (in1 << 1) | (in2 << 2) | (in3 << 3))

와는 나의 진리 테이블에 배열과 같습니다:

static u8 decisionTable[][] = {
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 1, 1 },
{ 0, 1, 1, 1 },
{ 0, 1, 0, 1 },
{ 1, 1, 1, 1 },
{ 0, 1, 0, 1 },
{ 1, 1, 1, 1 },
{ 0, 1, 0, 1 },
{ 1, 1, 1, 1 },
{ 0, 1, 1, 1 },
{ 0, 1, 1, 1 },
{ 0, 1, 0, 1 },
{ 1, 1, 1, 1 }};

고 난 다음에 액세스 할 수 있습니다 내가 진리는 테이블처럼 그렇:

decisionTable[ SM_INPUTS( line1, line2, line3, line4 ) ]

주는 촬영 방법을 참조하십시오 밖으로 작동합니다.가 교체하는 0 과 1 의 더 많은 도움이 되#정의한다는 표현이 무엇 각 상단과 함께,/**/댓글을 설명하는 입력한 각 라인의 출력이 있습니다.도움을 주셔서 감사합니다,모든 사람들!

도움이 되었습니까?

해결책

다차원 테이블이 필요하지 않습니다. 4 비트 => 4 비트 매핑을 사용하면 출력에 대한 단일 U8 [16] 배열 매핑 입력을 가질 수 있습니다. 상태 조회는 훨씬 저렴하며 시프트 앤 마스크 작전으로 개별 비트를 추출 할 수 있습니다.

행을 채우는 알고리즘을 체계화하기 쉽다면 #Define을 인덱스 번호별로 채우도록 각 행을 채울 수 있습니다.

다른 팁

(우선 접근법을 먼저 선호하는 접근법) 중 하나를 제안합니다.

  • 매크로를 사용하여 각 "행"을 강화하십시오. 이렇게하면 매크로 호출 내의 교정기가 숨겨집니다.
  • 주석을 사용하여 행을 분해하십시오.
  • 이 시작 함수를 사용하여 컨텍스트를 명시 적으로 초기화합니다. 아마도 함수를 사용하여 각 섹션을 초기화하십시오. 이는 위의 첫 번째 옵션과 유사하지만 상태 머신을 사용하기 전에 INT 함수를 호출해야한다는 단점이 있습니다.

개인적으로 구성 파일에서 읽었습니다. CSV는 아마도 Excel에서 쉽게 내보낼 수 있습니다. 또는 Excel에서 Plain Text로 복사하여 붙여 넣을 수 있으므로 공간 분리 된 값을 제공하여 가져 오기가 쉽습니다.

이것은 또한 C와 협력하고 있다는 점에서 의사 결정 테이블이 변경 될 때마다 코드를 다시 컴파일 할 필요가 없다는 것을 의미합니다.

진실 테이블이 모두 부울 인 경우 쌍 목록으로 붕괴 할 수 있습니다.

1111,0000
1110,0110
...

데이터 압축의 경우 값을 바이트 (2 개의 nybbles)로 표시합니다.

특정 임베디드 시스템 구성에서 소프트 코딩을 위해 저장하는 방법/방법에 대해서만 말할 수 있습니다 ;-)

진실 테이블이 실제로 4x4x4x4라면 매크로를 사용할 것입니다. 그 과거에 성장할 것이라면 나는 ragel. 가능성은 당신보다 더 작고 빠른 C 코드를 만들 것입니다.

보이지 않는데 참조하여 현재 상태를 얻기 위해 출력 상태에 있습니다.이것이 의미하지 않는 상태 기계,하지만 진리는 테이블.있는 네 개의 입력,그래서 거기에 만 16 가능한 입력합니다.그래서,테이블 16 위치한 해야 그것을 할 수 있습니다.

일반적으로 이와 같은 문제가 있으면 간단한 부울 공식으로 줄이려고합니다. 왜 그것이 가장 좋은 접근법이 아닌지 모르겠습니다. 훨씬 더 작고 읽기 쉬운 것일 수 있으며, 더 빠를 가능성이 높습니다 (소수의 ands와 ors가 조회 테이블 접근법에 필요한 곱셈/이동 + 메모리 액세스 수집보다 더 빨리 실행될 것이라고 생각합니다). 이 테이블을 부울 공식으로 줄이는 가장 쉬운 방법은 K-Map.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top