通过时间延迟增加整数
Increasing an integer through a time delay
我正在用 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循环吗?无论如何,函数本身都会进入 main 中的 while 循环。
C是按值传递。
score_increaser()
如您的问题所示,仅增加传入内容的 copy。
要解决此问题,(主要)有两种选择:
由于score
是全局定义的,所以不要传入任何东西:
void score_increaser(void) {
score++;
_delay_ms( 3000 );
}
这会直接修改全局 score
。
传入score
的地址并在函数内部取消引用
void score_increaser(int * pscore) {
(*pscore)++;
_delay_ms( 3000 );
}
这样称呼它
...
score_increaser(&score);
...
第三种更复杂的方法(假设目标平台支持信号)将
- 设置信号和引用处理程序,然后
- 设置一个定时器,每 N 秒发出一个信号。
- 此信号随后由处理程序处理,后者又
- 增加全局
score
和
- 再次启动计时器。
这可能看起来像:
#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 秒增加一次。
score
是全局值,如果该函数可以访问该全局值,则不需要在函数中传递它 space
void score_increaser() {
score++;
_delay_ms( 3000 );
}
我建议使用定时器中断。将定时器配置为 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例程的实现方式通常是一个循环或者一个up/down计数器。而计时器通常基于对 SysTick 的计数。
中断的另一个主要优点是让处理器一直执行任务,而不是让它阻塞在延迟循环中。
你不需要分数参数,因为它是全局声明的..
//global
int score = 0;
void score_increaser()
{
_delay_ms(3000);
score++;
}
调用就像:score_increaser();
应该完成工作..
我建议你在任何其他 line/function 中检查 score
.. 也许你已经重新声明它或不小心更改了值..
希望这对您有所帮助..
这里有一个处理分数的好方法。
在'start game'函数中,
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
在'end game'函数中
disable the timer counter
disable the timer interrupt
display the 'score' value
我正在用 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循环吗?无论如何,函数本身都会进入 main 中的 while 循环。
C是按值传递。
score_increaser()
如您的问题所示,仅增加传入内容的 copy。
要解决此问题,(主要)有两种选择:
由于
score
是全局定义的,所以不要传入任何东西:void score_increaser(void) { score++; _delay_ms( 3000 ); }
这会直接修改全局
score
。传入
score
的地址并在函数内部取消引用void score_increaser(int * pscore) { (*pscore)++; _delay_ms( 3000 ); }
这样称呼它
... score_increaser(&score); ...
第三种更复杂的方法(假设目标平台支持信号)将
- 设置信号和引用处理程序,然后
- 设置一个定时器,每 N 秒发出一个信号。
- 此信号随后由处理程序处理,后者又
- 增加全局
score
和 - 再次启动计时器。
这可能看起来像:
#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 秒增加一次。
score
是全局值,如果该函数可以访问该全局值,则不需要在函数中传递它 space
void score_increaser() {
score++;
_delay_ms( 3000 );
}
我建议使用定时器中断。将定时器配置为 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例程的实现方式通常是一个循环或者一个up/down计数器。而计时器通常基于对 SysTick 的计数。 中断的另一个主要优点是让处理器一直执行任务,而不是让它阻塞在延迟循环中。
你不需要分数参数,因为它是全局声明的..
//global
int score = 0;
void score_increaser()
{
_delay_ms(3000);
score++;
}
调用就像:score_increaser();
应该完成工作..
我建议你在任何其他 line/function 中检查 score
.. 也许你已经重新声明它或不小心更改了值..
希望这对您有所帮助..
这里有一个处理分数的好方法。
在'start game'函数中,
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
在'end game'函数中
disable the timer counter
disable the timer interrupt
display the 'score' value