【问题标题】:Called function that loops depending on the argument根据参数循环调用的函数
【发布时间】:2020-09-15 03:04:08
【问题描述】:

我有一个函数LED_MAIN(),它的工作是通过调用另一个私有函数LED_MAIN_LINE() 来点亮LED,这意味着当我测试代码时我只会调用LED_MAIN()

void LED_MAIN (void)            //main function (public) to light all LEDs
{
    int i;
    int LED_NO_UP = 10 ;                 //number of LEDs on line going up
    int LED_NO_DOWN = 10;            //number of LEDs on line coming down
    void LED_MAIN_LINE ( int no );   //private function to light LEDs on either side i.e on line going up and on line coming down


    for (i=0 ; 1<20 ; i++)              //first eliminate any errors in all 20 LEDs
    {
        LED_ERROR [i] = 0;
    }

    for ( i=0 ; i<LED_NO_UP ; i++ )     //light LEDs on one side. MAX 10 LEDs. LEDs #1-10
    {
        LED_MAIN_LINE (i);
    }

    for ( i=0 ; i<LED_NO_DOWN ; i++ )   //light LEDs on the other side. LEDs #11-20
    {
        LED_MAIN_LINE (i+10);
    }
}

void LED_MAIN_LINE ( int no )   //definition of the actual LED lighting function (private to void LED_MAIN (void))
{
   //currently no reference to argument int no in this function 

    for (i = 10 ; i > 0 ; i++)
        {
            led_status [no][i] = led_status [no] [i-1]
        }
        // continued......
}

LED_MAIN_LINE() 应该为每个 LED 执行。如果任一行有 10 个 LED,它将循环 20 次 (10x2)。如果有 5 个 LED,它只会执行 5 次,依此类推。参数是 LED 的数量。但是,它被 void LED_MAIN() 调用,这就是循环发生的地方。

但是,看看我对 void LED_MAIN_LINE() 的定义,我没有传递 LED 数量的参数。我在LED_MAIN() 中完成了这项工作。我想知道,这个定义是否正确?我应该在哪里传递预计使LED_MAIN_LINE() 循环的 LED 数量?使用当前代码,我的测试结果不如预期。

【问题讨论】:

    标签: c function loops arguments


    【解决方案1】:

    LED_NO_UP 和 LED_NO_DOWN 为 0。因此代码中的 for 循环永远不会执行,因为 i &lt; 0i = 0 时是不可能的。

    您在第一个 for 循环中还有 1&lt;20

    【讨论】:

    • 感谢您的观察。不过,我应该将 LED 编号初始化为 10。我正在纠正它。谢谢。
    • 我错过了你原来的问题。我建议将LED_MAIN_LINE 的定义从LED_MAIN 带到外部,并将其放在文件顶部附近,您可以在其中定义一些全局常量和变量。
    • 感谢您的意见。但是 LED_MAIN_LINE 的定义完全在 LED_MAIN 的区域之外,如其上方的右大括号 } 所示,以及语句“void LED_MAIN_LINE (int no)”的定位(无缩进)。
    • 对不起,我的意思是函数声明。如果你不希望这个函数暴露给其他 C 文件,你也可以将它声明为一个静态的。