我有以下代码:
char switch_list[] = {
"PINB >> 7",
"PIND >> 1",
"PINB >> 1",
"PIND >> 0}"
};
void values(void){
uint8_t switch_value = 0;
if (i == 0){
switch_value = (PINB >> 7) & 1;
}
if (i == 1){
switch_value = (PIND >> 1) & 1;
}
if (i == 2){
switch_value = (PINB >> 1) & 1;
}
if (i == 3){
switch_value = (PIND >> 0) & 1;
}
SOME OTHER OPERATIONS GO HERE
}
我需要以某种方式将 switch_list 值解释为无符号整数,但我无法对数组进行任何更改(它需要保留为char数组)。 PINB 和其他人已在库中定义了8位值。我想创建一个看起来像这样的for循环:
uint8_t switch_value = 0;
for (int i = 0, i < sizeof(switch_list)/sizeof(switch_list[0]); i++){
switch_value = **********[i] & 1;
SOME OTHER OPERATIONS GO HERE
}
}
*********与 switch_list 相同,但不是char类型,而是 uint8_t 。任何人都可以提供任何提示吗?
答案 0 :(得分:1)
您可以使用有关数组的知识并创建一个函数,将值从"PINB >> 7"
转换为PINB >> 7
。我做的假设是:
使用它,我可以创建一个convert
函数
unsigned int convert(char * p);
/* PINB and the others have defined 8 bit value in the libraries
so I'm making up their values here for convenience */
unsigned int PINB = 1024;
unsigned int PIND = 2048;
int main(){
// deleted your ending }
// and changed the type of the array
char* switch_list[] = {
"PINB >> 7",
"PIND >> 1",
"PINB >> 1",
"PIND >> 0"
};
unsigned int switch_value;
// , should be ;
// don't compare signed with unsigned
for (unsigned int i = 0; i < sizeof(switch_list)/sizeof(switch_list[0]); i++){
switch_value = convert(switch_list[i]);
printf("%u\n", switch_value);
}
return 0;
}
// assuming string must be exactly long as "PINB >> 7"
unsigned int convert(char * p){
if(!p || strlen(p) != strlen("PINB >> 7")){
printf("error\n");
return (unsigned)-1;
}
unsigned int n;
// use a string compare or, in your case, since only the 4th char is different:
if(p[3] == 'B')
n = PINB;
if(p[3] == 'D')
n = PIND;
// note I'm not handling a case where the 4th letter isn't {'B', 'D'}, according to my assumption (the 1st).
// use your knowledge about the string inside switch_list
return n >> (p[strlen(p) - 1] - '0');
}
答案 1 :(得分:1)
假设PINx
项将评估为PIN_T
类型,您可以这样做:
#include <stdlib.h> /* for size_t */
#include <inttypes.h> /* for uint8_t */
/* other include here */
struct switch_s
{
PIN_T * ppin;
uint8_t offset;
};
struct switch_s switches[] =
{
{&PINB, 7},
{&PIND, 1},
{&PINB, 1},
{&PIND, 0},
/* more here */
};
int main(void)
{
for (size_t i; i < sizeof switches / sizeof *switches; ++i)
{
uint8_t switch_value = (*switches[i].ppin >> switches[i].offset) & 1;
/* Work with switch_value here ... */
}
}