我应该编写一个包含两个函数的程序:
一个函数负责构建一个数据结构,该数据结构由运行中的函数列表(您获得一个函数指针)填充其运行时间(启动给定程序运行几秒钟后)。您应该知道操作该功能,添加器官的数据结构,如何更有效地执行,保存测试,交叉检查等。 第二个函数按顺序运行所有函数。例如,一旦你有两个函数,程序的开始是五个第二个时间段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;
}
答案 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;
}