【问题标题】:Why does static variable not allow loop() to run?为什么静态变量不允许 loop() 运行?
【发布时间】:2013-03-13 16:04:31
【问题描述】:

我正在为模仿太阳的灯编写代码(即根据真实的太阳升起和落下)。

我正在尝试在循环中使用静态变量,以计算自 2012 年 1 月 1 日以来的天数(上一个闰年(366 天))

由于某种原因,该程序仅在变量声明为静态时才有效,但我需要计数器在每天的迭代中持续存在。

任何帮助将不胜感激。谢谢。

// Sun Object 

#define REDPIN 5
#define GREENPIN 6
#define BLUEPIN 3

//#define FADESPEED 480// make this higher to slow down
#define FADESPEED 120

void setup() {
  pinMode(REDPIN, OUTPUT);
  pinMode(GREENPIN, OUTPUT);
  pinMode(BLUEPIN, OUTPUT);


}

void loop() {

  // daylengths for 4 year's worth of days starting from jan 1 of Great year (366 days) (1/1/2012)
 int dayLengths[] = {33540000,
33540000,
33600000,
// ....
// hundreds of values omitted here
// ....
33360000,
33420000,
33480000,
33480000};


//2012 = 366 days + day # from jan 1st (in 2013)
//starts on 0th day so subtract 1
//ready to go for march 24st @ sunrise

 // why does it not function when day is static?????

     static int day = 449;


  int r, g, b;




   long start = millis();

   for (r = 0; r <256; r++){
     analogWrite(REDPIN, r);
     delay(FADESPEED);
   }

  //analogWrite(REDPIN, 255);

 for (g = 0; g < 230; g++) { 
    analogWrite(GREENPIN, (g*.4));
    delay(FADESPEED*2);

   }

   long stopped = millis();
   long elapsed = stopped - start;
                                          //approx
   // delays (amount of daylight - ( sunrise/sunset time )
 //  delay(dayLengths[day]- (97200*2));

     delay(dayLengths[day]- (elapsed*2));


   for (g = 230; g > 0; g--) { 
    analogWrite(GREENPIN, (g*.4));
    delay(FADESPEED*2);
   }

   for (r = 256; r >0; r--){
     analogWrite(REDPIN, r);
     delay(FADESPEED);
   }

   analogWrite(REDPIN,0);


   //delays (millis in 1 day) - (length of daylight)
   delay(86400000 - dayLengths[day]);



  // once 4 year cycle is over, resets day to 0
   if (day < sizeof(dayLengths  )){

   day++;
   }

   else
   {
   day = 0;

  } 

}

【问题讨论】:

  • 请告诉我们您遇到了什么错误。运行程序时实际发生了什么,或者是否存在编译器错误。如果是这样,错误是什么?
  • “它不起作用”是一个糟糕的问题描述。
  • 请尝试在一个小例子上复制这个问题。您给了我们 365 多个项目的数组,但没有一个函数定义 - 所以我们无法重现或阅读此代码。
  • 抱歉,这是我的第一篇文章。没有错误,编译上传成功。但是,LED 永远不会亮起。
  • 我不能说你的整个问题是什么,但if (day &lt; sizeof(dayLengths)){ 是错误的,因为sizeof 是字节数,而不是条目数。您需要除以条目的大小:if (day &lt; sizeof(dayLengths)/sizeof(int)){

标签: c variables loops static


【解决方案1】:

听起来您在嵌入式环境中运行,并且本机硬件可能存在一些限制:loop 函数内部的静态使用。

我已经讨厌自己提出这个建议了,但也许您可以尝试使用 globalglobal static (即将day 变量放在loop() 函数之外,无论是否带有static 关键字)。这将使它能够在所有 loop() 调用中生存...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 2017-04-24
    相关资源
    最近更新 更多