有没有办法可以在C中以周期性方式递减数组

时间:2012-07-16 21:34:33

标签: c

我正在为一个带领的一个号码写一个代码,每五秒减少一次

目前我的实际代码是

FiveSecDelay+=1;
if (FiveSecDelay ==100)
{
count2--; //decrement count2

for (uint32_t x = 0; x < 4; x++) //split count to to individual digits
{
new_value[x] = count2 % 10;
count2 = count2 / 10;
}

for (uint32_t i = 0; i < 4; i++)
{

Segment_Write(Digit[i],new_value[i]); assign  value to segments
}
FiveSecDelay =0;
}

我使用调度程序每隔几毫秒调用一个函数,理论上这应该可行,因为我使用相同的技术为段分配值, 会发生什么事情,我的起始值为8,它应该得到7,6,5,4等等,直到0,但由于某种原因,它从8变为42并停留在那里

我曾试图解决这个问题但是做得很短。

任何帮助都会很棒

谢谢

4 个答案:

答案 0 :(得分:1)

快速而肮脏的方式:

while(true)
{
    check();
    sleep(5);
}


int values[1];
int check(void)
{
    if (values[0] > 0)
       values[0]--;
}

答案 1 :(得分:1)

如果您有权访问系统时间,则可以存储调用的初始时间,然后每次查询其值时,请检查系统时间以确定正确的调整值,并设置一小段代码价值,如:

// initialize
int check = 142;
unsigned long long time = getMillis();

int get_value(void)
{
    unsigned long long time_factor = ((getMillis() - time) / (unsigned long long) 5);
    if (time_factor > (unsigned long long) check)
        return 0;
    else
        return check - time_factor;
}

void set_value(int v)
{
    check = v;
    time = getMillis();
}

请注意,我不知道如何在c中获得系统时间(虽然我打赌你需要#include <time.h>)所以我编写了一个名为getMillis()的函数返回系统时间为无符号长long(应为64位无符号整数)。实施取决于读者。

值得一提的是,大约6亿年后你将遇到环绕式错误。

答案 2 :(得分:0)

check取一个参数,即数字。然后在程序的主循环中有一个以某个值开始的计数器,并在每次调用check时递减。

我假设您正在做一些比当前check函数更复杂的事情,因为很明显它在提供的表单中没有做任何事情。如果您提供更多信息,我们将能够为您提供更全面,更实用的解决方案。

答案 3 :(得分:0)

void check() {
  static int array[] = {142}; // why are you using an array here?
  (*array)--;
}

int main() {
  while(true)
  {
    check();
    usleep(5000); // approximate
  }
  return 0;
}