C中的计时器链接列表

时间:2010-08-03 15:21:51

标签: c timer linked-list

我应该编写一个包含两个函数的程序:

一个函数负责构建一个数据结构,该数据结构由运行中的函数列表(您获得一个函数指针)填充其运行时间(启动给定程序运行几秒钟后)。您应该知道操作该功能,添加器官的数据结构,如何更有效地执行,保存测试,交叉检查等。 第二个函数按顺序运行所有函数。例如,一旦你有两个函数,程序的开始是五个第二个时间段12中的一个,第一个在5秒后运行,另一个在第一个运行后7秒。 (自开始以来共计12个。)

再次必须注意如何做到这一点,即使与第一个功能有关。 运行后一切都已关闭,即功能运行完毕后不再是借口了。所有重新运行的程序都将进入她的新功能。

附件是两个实现:一个是笨拙而不是通过编译(至少对我来说)使用main和一个输出用户,另一个不繁琐但没有主输出和用户。 我需要使用繁琐的输出给用户(当然你也需要main)。有人可以帮我吗?为什么我需要一个函数指针?任何解释或其他文档都可以帮助我更好地了解正在发生的事情。

非常感谢提前

    /*First implemntation: heavy and doesn't compile*/


#ifndef  __MY_TIMER_H__
#define  __MY_TIMER_H__

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

typedef void(*fun_t)(int);
typedef struct timer
{
  int   time;
  fun_t func;
  struct timer *next;
}timers;

void add_timer(int sec, fun_t func,timers *head);

void run_timers(timers *head);

void timer_func(int);

#endif /* __MY_TIMER_H__ */

----------------------------------------------------------------------

#include "my_timer.h"

#undef  DEBUG
#define DEBUG 1

int main()
{
  int time = 1;
  timers *head = NULL;
  fun_t func = timer_func;

  while (time < 1000)
  {
    printf("\nCalling add_timer(time=%d, func=0x%x, head=0x%x)\n", time, func, &head);
    add_timer(time, func,&head);
    time *= 2;
  }

  run_timers(&head);
  return 0;
}

timers *head;

void timer_func(int time)
{
  printf("Called %s at time %d.\n", __FUNCTION__, time);
  return;
}

void add_timer(int sec, fun_t func, timers *head)
{
  timers *curr = head, *prev = NULL;
  timers *new_timer = NULL;

  new_timer = (timers*)malloc(sizeof(timers));
  new_timer->time = sec;
  new_timer->func = func;
  new_timer->next = NULL;

  if (curr == NULL) {
    head = new_timer;
    return;
  }

  while (curr != NULL && curr->time < sec) {
    prev = curr;
    curr = curr->next;
  }

  if (curr == head) {
    new_timer->next = curr;
    head = new_timer;
  }
  else {
    new_timer->next = prev->next;
    prev->next = new_timer;
  }    

  return;
}

void run_timers(timers *head)
{
  int elapsed_time = 0;
  timers *curr = head;
  timers *timer_p = NULL;

  while (curr != NULL) {
    printf("\nGoing to sleep for %d secs\n", curr->time - elapsed_time);
    printf("\ncurr->time = %d elapsed_time = %d\n", curr->time, elapsed_time);
    usleep(curr->time - elapsed_time);
    printf("\nWoke up after %d secs\n", curr->time - elapsed_time);
    elapsed_time = curr->time;
    curr->func(curr->time);
    timer_p = curr;
    curr = curr->next;
    free(timer_p);
    head = curr;
  }

  return;
} 

/*second implemntation: no main and no output for user*/ 

#include <stdio.h> 
#include<conio.h> 
#include <stdlib.h> 
#include <windows.h> 

typedef void(*fun_t)(void); 

typedef struct timer_s{ 
int time; 
fun_t fun; 
struct timer_s* next; 
}timer; 

timer* head=NULL; 

void add_timer(int sec, fun_t fun) 
{ 
    timer* curr,*new_timer; 
    new_timer=(timer*)malloc(sizeof(timer)); 
    new_timer->time=sec; 
    new_timer->fun=fun; 
    new_timer->next=NULL; 
    curr=head; 

    if(curr==NULL) 
    { 
        head=new_timer; 
        return; 
    } 

    while((curr->next!=NULL)&&(curr->next->time<sec)) 
        curr=curr->next; 

    new_timer->next=curr->next; 
    curr->next=new_timer; 

    return; 
} 

void run_timers() 
{ 
    int elapsed=0; 
    timer* tmp; 

    while(head) 
    { 
        Sleep((head->time-elapsed)*1000); 
        elapsed=head->time; 
        head->fun(); 
        tmp=head; 
        head=head->next; 
        free(tmp); 
    } 
    return; 
}

2 个答案:

答案 0 :(得分:2)

在第一次实现时,在main()的末尾,你必须改变它:

  run_timers(&head);
  return 0;
}

通过以下代码!它将编译并运行。你能发现差异吗?

  run_timers(head);
  return 0;
}

好的,你可能会对指针感到困惑,我建议你再研究一下。

所以,只是为了解释为什么你的代码没有编译,如果你还记得run_timers()函数签名,

void run_timers(timers *head);

你会看到它收到指向 timers 结构的指针(或内存地址),并在main()中声明它应该是:

timers *head = NULL;

因此,当您需要调用run_timers()时,必须按原样传递 head 变量:

run_timers(head); //right

发生的事情是你把它称为:

run_timers(&head); //wrong

表示 timers 结构的指针的内存地址,而不是指针本身。

答案 1 :(得分:0)

我想我做到了。任何优化都将受到欢迎。

#include <stdio.h> 
#include<conio.h> 
#include <stdlib.h> 
#include <windows.h> 

typedef void(*fun_t)(int);

typedef struct timer_s{ 
int time; 
fun_t fun; 
struct timer_s* next; 
}timer; 

timer* head=NULL; 
void timer_func(int time);
void run_timers();
void add_timer(int sec, fun_t fun) ;

int main()
{
  int time = 1;
  timer *head = NULL;
  fun_t func = timer_func;

  while (time < 20)
  {
    printf("\nCalling add_timer(time=%d, func=0x%x, head=0x%x)\n", time, func, &head);
    add_timer(time, func);
    time *= 2;
  }

  run_timers();
  return 0;
}

void timer_func(int time)
{
  printf("\nCalled %s before %d seconds.\n", __FUNCTION__, time);
  return;
}

void add_timer(int sec, fun_t fun) 
{ 
    timer* curr,*new_timer; 
    new_timer=(timer*)malloc(sizeof(timer)); 
    new_timer->time=sec; 
    new_timer->fun=fun; 
    new_timer->next=NULL; 
    curr=head; 

    if(curr==NULL) 
    { 
        head=new_timer; 
        return; 
    } 

    while((curr->next!=NULL)&&(curr->next->time<sec)) 
        curr=curr->next; 

    new_timer->next=curr->next; 
    curr->next=new_timer; 

    return; 
} 

void run_timers() 
{ 
    int elapsed=0; 
    timer* tmp; 

    while(head) 
    { 
        Sleep((head->time-elapsed)*1000); 
        elapsed=head->time; 
        head->fun(elapsed);
        tmp=head; 
        head=head->next; 
        free(tmp); 
    } 
    return; 
}