可以在此代码中使用重复结构吗?

时间:2019-07-08 14:05:43

标签: c for-loop repeat

我想要的是优化我的代码的这一部分。它只是重复自身,但我不知道如何使用我使用的定义在这里使用重复结构。

我定义了GPIO_Ports和Pins。 直到SEL8。

if (out & (1 << 0)) {
    GPIO_SetBits(SEL0_GPIO_Port, SEL0_Pin);
} else {
    GPIO_ResetBits(SEL0_GPIO_Port, SEL0_Pin);
}

if (out & (1 << 1)) {
    GPIO_SetBits(SEL1_GPIO_Port, SEL1_Pin);
} else {
    GPIO_ResetBits(SEL1_GPIO_Port, SEL1_Pin);
}

if (out & (1 << 2)) {
    GPIO_SetBits(SEL2_GPIO_Port, SEL2_Pin);
} else {
    GPIO_ResetBits(SEL2_GPIO_Port, SEL2_Pin);
}

1 个答案:

答案 0 :(得分:1)

我们不知道使用的变量类型。该代码可能看起来像这样:

#include <assert.h>

// Indexas valid are from 0 to 8, some 9
#define IDX_MAX 9

typedef /* insert the type of SELx_GPIO_Port here */ gpio_port_type;

static gpio_port_type get_gpio_port_from_idx(size_t idx) {
  const gpio_port_type ports[] = {
    SEL0_GPIO_Port,
    SEL1_GPIO_Port,
    SEL2_GPIO_Port,
    SEL3_GPIO_Port,
    SEL4_GPIO_Port,
    SEL5_GPIO_Port,
    SEL6_GPIO_Port,
    SEL7_GPIO_Port,
    SEL8_GPIO_Port,
  };
  static_assert(IDX_MAX == sizeof(ports)/sizeof(*ports));
  assert(idx < sizeof(ports)/sizeof(*ports));
  return ports[idx];
}

typedef /* insert the type of SELx_Pin here */ pin_type ;

static pin_type get_sel_pin_from_idx(size_t idx) {
  const pin_type pins[] = {
    SEL0_Pin,
    SEL1_Pin,
    SEL2_Pin,
    SEL3_Pin,
    SEL4_Pin,
    SEL5_Pin,
    SEL6_Pin,
    SEL7_Pin,
    SEL8_Pin,
  };
  static_assert(IDX_MAX == sizeof(pins)/sizeof(*pins));
  assert(idx < sizeof(pins)/sizeof(*pins));
  return pins[idx];
}

void set_out(int out) {
   for (size_t i = 0; i < IDX_MAX; ++i) {
        (
           (out & (1 << i)) ? GPIO_SetBits : GPIO_ResetBits
        )(get_gpio_port_from_idx(i), get_gpio_pin_from_idx(i));
    }
}

前两个函数将0到8范围内的静态索引分别映射到SELx_GPIO_Port和SELx_Pin变量。之后,set_out函数检查输入变量int out中的每个位,并根据位是置位还是未置位来调用GPIO_SetBitsGPIO_ResetBits。我使用了三元运算符,如果函数具有不同的原型或宏,则可以:

void set_out(int out) {
   for (size_t i = 0; i < IDX_MAX; ++i) {
        if (out & (1 << i)) {
            GPIO_SetBits(get_gpio_port_from_idx(i), get_gpio_pin_from_idx(i));
        } else {
            GPIO_ResetBits(get_gpio_port_from_idx(i), get_gpio_pin_from_idx(i));
        }
    }
}