Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c、 if语句不';我不能正常工作_C_If Statement_Macros - Fatal编程技术网

c、 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

我做了这个简单的程序,但是我的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_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-住在我隔壁的女士也是:-)