gpt4 book ai didi

c - 是否可以在此代码中使用重复结构?

转载 作者:行者123 更新时间:2023-11-30 14:37:57 25 4
gpt4 key购买 nike

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

我定义了 GPIO_端口和引脚。这一直持续到 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);
}

最佳答案

我们不知道所使用的变量的类型。代码可能如下所示:

#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该位已设置或未设置。我使用了三元运算符,如果函数有不同的原型(prototype),或者是宏,您可以:

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));
}
}
}

关于c - 是否可以在此代码中使用重复结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56936693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com