通过时间延迟增加整数

时间:2015-05-16 06:50:56

标签: c teensy

我正在微处理器上用C制作游戏。得分取决于你能活多久;分数每3秒增加1。得分是一个全局声明的整数,但是从函数中显示。

int score = 0;//globally declared

void draw_score(int score_d)
{
    char score_draw[99];
    sprintf(score_draw,"%d", score_d);
    draw_string(score_draw, 9, 0);
}

我正在考虑一个功能,只是将分数增加一分钟,但是没有效果。

void score_increaser(int score)
{
    score++;
    _delay_ms( 3000 );
}

是否需要在while循环中?无论如何,函数本身都将进入主循环。

5 个答案:

答案 0 :(得分:2)

C是按值传递的。

score_increaser()如您的问题所示只会增加传入内容的副本

要解决这个问题,主要有两个选择:

  1. 由于score是全局定义的,所以不要传递任何内容:

    void score_increaser(void) {
      score++;
      _delay_ms( 3000 );
    }
    

    这会直接修改全局score

  2. 传递score的地址并在函数

    中取消引用它
    void score_increaser(int * pscore) {
      (*pscore)++;
      _delay_ms( 3000 );
    }
    

    像这样称呼

    ...
    score_increaser(&score);
    ...
    
  3. 第三种,更复杂的方法(假设目标平台支持信号)

    1. 设置信号和引荐处理程序,然后
    2. 设置一个计时器,每隔N秒发出一次信号。
    3. 此信号由处理程序处理,而处理程序又
    4. 增加全局score
    5. 再次启动计时器。
    6. 这可能如下所示:

      #include <signal.h> /* for signal() and sig_atomic_t */
      #include <unistd.h> /* for alarm() */
      
      
      #define DURATION (3) /* Increase score every 3 seconds. */
      
      sig_atomic_t score = 0;
      
      
      void set_alarm(unsigned);
      
      void handler_alarm(int sig)
      {
        ++score;
        set_alarm(DURATION);
      }
      
      void set_alarm(unsigned duration)
      {
        signal(SIGALRM, handler_alarm);
        alarm(duration);
      }
      
      
      int main(void)
      {
        set_alarm(DURATION);
      
        ... /* The game's codes here. */
      }
      

      后一种方法的优势在于您的游戏代码无需关注增加score。只要程序运行,score每3秒就会增加一次。

答案 1 :(得分:1)

我建议使用定时器中断。将计时器配置为3秒。

volatile int score = 0; //global

void Intr_Init(peripheral_t per)
{
    //Initialize the timer interrupt
}

void draw_score(int score_d)
{
    char score_draw[99];
    sprintf(score_draw,"%d", score_d);
    draw_string(score_draw, 9, 0);
}

int main(void)
{
    Intr_Init(TIMER);
    while(1)
    {
        //Code that makes your game run
        draw_score(score);
    }
}

ISR (TIMER1_COMPA_vect)
{
    //clear disable interrupt
    score++;
    //enable interrupt
}

在嵌入式设备中,您应该依靠计时器来获得更好的时间关键任务和准确性。 Delay例程的实现方式通常是循环或向上/向下计数器。而计时器通常基于SysTicks的计数。 Interrupts的另一个主要优点是让处理器一直完成任务,而不是让它在延迟循环中阻塞。

答案 2 :(得分:0)

score是全局值,如果该函数可以访问该全局空间,则不需要在函数中传递它

void score_increaser() {
score++;
_delay_ms( 3000 );
}

答案 3 :(得分:0)

你不需要得分参数,因为它是全局声明的。

//global 
int score = 0;

void score_increaser()
{
   _delay_ms(3000);
   score++;
}

调用就像:score_increaser();应该做的工作.. 我建议您检查任何其他行/函数中的score ..也许您已重新声明它或意外更改了值..

希望这有帮助..

答案 4 :(得分:0)

这是处理分数的好方法。

在“开始游戏”功能中,

$event = new Event(['date_of_donation' => '2015-05-16', 'date_of_last_donation_letter_sent' => '']);

在定时器中断处理函数

clear 'score' to 0
setup a timer: 
--to expire once each 3 seconds 
--enable the automatic reload feature, 
--enable the timer interrupt
--enable the timer counter

在'结束游戏'功能中

--increment 'score'
--clear the timer interrupt pending flag