2015-03-02 1 views
0

У меня есть эта функция, которая является мультиплексором.Функция мультиплексора C

// Enumerated type for a single bit. 
typedef enum { FALSE=0, TRUE=1 } BIT; 

BIT multi(BIT A, BIT B, BIT C, BIT D, BIT S1, BIT S0) 
{ 
    if(S1== FALSE && S0 ==FALSE) 
     return A; 

    else if(S1==FALSE && S0==TRUE)    
     return B; 

    else if (S1== TRUE && S0== FALSE) 
     return C; 

    else 
     return D; 
} 

Для мультиплексора, S1, S0, как два-битового двоичного числа, индексирование в A, B, C, D, в указанном порядке.

так, как S1 == 0 & S0 == 0 относится к А и S1 == 0 & S0 == 1 относится к B и т.д. и т.п.

Я чувствую мой код близко или далеко, или это исправить мне просто нужно исправить, как я тестирую его в основной, в котором у меня есть ...

assert(multiplexer(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE) == A); 
assert(multiplexer(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE) == D); 
+0

Stylistic комментарий: пространство вокруг операндов '= = 'и после' if' полностью противоречит в коде. Код, написанный в хорошем стиле, безжалостно систематичен по своему расположению; расстояние равномерно. В целом, я бы рекомендовал использовать 'else if (S1 == TRUE && S0 == FALSE)' пространство с любой стороны оператора '==' и пробел после 'if'. –

+1

Мне нравится идея: 'BIT multi (BIT A, BIT B, BIT C, BIT D, BIT S1, BIT S0) {Выбор BIT [] = {A, B, C, D}; выбор возврата [(S1 << 1) | S0]; } 'для компактности. Я не уверен, где он подходит по шкале для скорости, но у него нет никаких условностей, которые обычно считаются хорошими для скорости. –

ответ

3

Они не действительно хорошо разработанные тесты, те два. Давайте посмотрим на первую в качестве примера (изменение фактического функции имени из multi):

assert(multi(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE) == A); 

В этом случае multi() должен возвращать первый аргумент, но, как вы знаете, если он вернулся один из трех других , учитывая, что они все false. Кроме того, я не уверен, доступна ли переменная D вне функции, поэтому я перехожу к более конкретному значению.

Так лучше тестовый набор будет:

assert(multi(FALSE, TRUE, TRUE, TRUE, FALSE, FALSE) == FALSE); 
assert(multi(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE) == TRUE); 

Это для тестирования возвращения A. Для B, C и D просто переместите уникальное значение в правильное положение (2, 3 или 4 соответственно) и измените то, что вы проходите в качестве селектора (позиции 5 и 6).

Аналогично для второго, вам нужно повторно написать тест, так что вы можете сказать разницу между успехом и провалом:

assert(multi(FALSE, FALSE, FALSE, TRUE, TRUE, TRUE) == TRUE); 
assert(multi(TRUE, TRUE, TRUE, FALSE, TRUE, TRUE) == FALSE); 

Как и в сторону, я не уверен из полезность в создании специального перечисления для типа, который C уже отлично обрабатывает сам по себе (логический как int).

Мне кажется, код может быть значительно упрощено до:

int multi (int r0, int r1, int r2, int r3, int s0, int s1) { 
    if (s0) { 
     // Must be r2 or r3, depending on s1. 
     if (s1) return r3; 
     return r2; 
    } 

    // s0 is false, must be r0 or r1, depending on s1. 
    if (s1) return r1; 
    return r0; 
} 

Или, когда вы действительно понимаете C :-)

// Returns rX based on sX: 
// s0 false, s1 false, return r0. 
// s0 false, s1 true, return r1. 
// s0 true, s1 false, return r2. 
// s0 true, s1 true, return r3. 

int multi (int r0, int r1, int r2, int r3, int s0, int s1) { 
    return ((s0) ? ((s1) ? r3 : r2) : ((s1) ? r1 : r0)); 
} 
Смежные вопросы