c、 if语句不';我不能正常工作
我做了这个简单的程序,但是我的if语句不能正常工作。 这是我的代码:c、 if语句不';我不能正常工作,c,if-statement,macros,C,If Statement,Macros,我做了这个简单的程序,但是我的if语句不能正常工作。 这是我的代码: void SCRIVI_RUOTA(int s, int i, int c) { _CONFIG_DRIVE_PORT_OUTPUT_VALUE(C, (segK|segL|segM), 0, (PORT_SRE_SLOW | PORT_DSE_HIGH)); // this switch off all my LEDS s=0; i=0; c=0; if(s==1) _CONFIG_DR
void SCRIVI_RUOTA(int s, int i, int c)
{
_CONFIG_DRIVE_PORT_OUTPUT_VALUE(C, (segK|segL|segM), 0, (PORT_SRE_SLOW | PORT_DSE_HIGH)); // this switch off all my LEDS
s=0;
i=0;
c=0;
if(s==1)
_CONFIG_DRIVE_PORT_OUTPUT_VALUE(C, (segK), (segK), (PORT_SRE_SLOW | PORT_DSE_HIGH)); // this switch on my LED N° 1
if(i==1)
_CONFIG_DRIVE_PORT_OUTPUT_VALUE(C, (segM), (segM), (PORT_SRE_SLOW | PORT_DSE_HIGH)); // this switch on my LED N° 2
if(c==1)
_CONFIG_DRIVE_PORT_OUTPUT_VALUE(C, (segL), (segL), (PORT_SRE_SLOW | PORT_DSE_HIGH)); // this switch on my LED N° 3
}
我可以把s,I,c等于0或1,但是if语句总是执行的,我的LED灯在任何情况下都会亮起
如果我删除if语句中的switch-on命令,则LED不会亮起(这意味着没有其他函数会导致冲突,迫使LED亮起)。
如果在关闭LED的if语句后加上else,则所有LED都会关闭。听起来好像if和else语句不存在,而LED上的最后一个命令是execute。
是否可能存在忽略if语句的函数、宏或其他内容 您的宏可能会扩展为多个语句,并且没有使用
do.包装。。而(0)
在if
语句中用{}
环绕宏
if(s==1) {
_CONFIG_DRIVE_PORT_OUTPUT_VALUE(...);
}
//...
如注释中所述,可以认为原始宏已损坏,应予以修复
假设宏的定义如下:
#define _CONFIG_DRIVE_PORT_OUTPUT_VALUE(ref, pins, value, chars) \
GPIO##ref##_PIDR &= ~(pins); \
GPIO##ref##_PDOR = ((GPIO##ref##_PDOR & ~(pins)) | (value)); \
GPIO##ref##_PDDR |= (pins);
应改为:
#define _CONFIG_DRIVE_PORT_OUTPUT_VALUE(ref, pins, value, chars) \
do { \
GPIO##ref##_PIDR &= ~(pins); \
GPIO##ref##_PDOR = ((GPIO##ref##_PDOR & ~(pins)) | (value)); \
GPIO##ref##_PDDR |= (pins); \
} while(0)
如果宏是固定的,那么您的原始代码就可以不经修改地工作。您的宏可能会扩展为多个语句,并且没有使用
do包装。。而(0)
在if
语句中用{}
环绕宏
if(s==1) {
_CONFIG_DRIVE_PORT_OUTPUT_VALUE(...);
}
//...
如注释中所述,可以认为原始宏已损坏,应予以修复
假设宏的定义如下:
#define _CONFIG_DRIVE_PORT_OUTPUT_VALUE(ref, pins, value, chars) \
GPIO##ref##_PIDR &= ~(pins); \
GPIO##ref##_PDOR = ((GPIO##ref##_PDOR & ~(pins)) | (value)); \
GPIO##ref##_PDDR |= (pins);
应改为:
#define _CONFIG_DRIVE_PORT_OUTPUT_VALUE(ref, pins, value, chars) \
do { \
GPIO##ref##_PIDR &= ~(pins); \
GPIO##ref##_PDOR = ((GPIO##ref##_PDOR & ~(pins)) | (value)); \
GPIO##ref##_PDDR |= (pins); \
} while(0)
如果宏是固定的,那么您的原始代码就可以不经修改地工作。您可以设置s,i,c=0。所以忽略传入的所有值。你为什么要这样做?这只是一个测试,在实际程序中,我没有把s,I,c=0放在这里,但是变量是由函数传递的,如果(s==1){u CONFIG…},试着这样做。Ie环绕条件语句{}。该宏可能正在执行某些操作,并且您确定有s==1而不是s=1。此外,请在命名宏时不使用前导下划线。带有下划线和大写字母的标识符保留供设置为s,i,c=0的实现使用。所以忽略传入的所有值。你为什么要这样做?这只是一个测试,在实际程序中,我没有把s,I,c=0放在这里,但是变量是由函数传递的,如果(s==1){u CONFIG…},试着这样做。Ie环绕条件语句{}。该宏可能正在执行某些操作,并且您确定有s==1而不是s=1。此外,请在命名宏时不使用前导下划线。带有下划线和大写字母的标识符保留供实现使用。。。。或者将宏更改为在
do{…}while(0)
中包装所有内容。请参阅@Peter:我怀疑询问者编写了宏,但是的,应该包装多语句宏。@jxh-我不排除她编写宏的可能性。我的评论更接近于她可以向《宏》作者报告的缺陷。@JeffLearman-住在我隔壁的女士也是:-)。。。。或者将宏更改为在do{…}while(0)
中包装所有内容。请参阅@Peter:我怀疑询问者编写了宏,但是的,应该包装多语句宏。@jxh-我不排除她编写宏的可能性。我的评论更接近于她可以向《宏》作者报告的缺陷。@JeffLearman-住在我隔壁的女士也是:-)