如何从结构体使用函数指针调用函数?

  • 本文关键字:函数 指针 调用 结构体 c
  • 更新时间 :
  • 英文 :


我正在尝试学习c,但我被这个问题卡住了。我想用这个结构创建一个链表。我正在尝试使用不同类型的数据(包括不同的led_blinking功能)列出一个列表。问题是我无法将函数指针添加到列表中的结构中调用函数。有人可以帮助我解决这个问题吗?我做错了什么?

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <tm4c123gh6pm.h>
#include <sysctl.h>
#include <gpio.h>
void ledRedTask(){
GPIO_PORTF_DATA_R = RED;
delay();
}
void ledGreenTask(){
GPIO_PORTF_DATA_R = GREEN;
delay();
}
void ledBlueTask(){
GPIO_PORTF_DATA_R = BLUE;
delay();
}
void ledYellowTask(){
GPIO_PORTF_DATA_R = YELLOW;
delay();
}
void ledPinkTask(){
GPIO_PORTF_DATA_R = PINK;
delay();
}
void ledAquaTask(){
GPIO_PORTF_DATA_R = AQUA;
delay();
}
struct taskStruct{
int taskNumber;
int taskTime;
void (*functionTask)(void *);
struct taskStruct *next;
};
struct taskStruct *head = NULL;
struct taskStruct *curr = NULL;
struct taskStruct* create_list(int taskNumber, void(led_task)(), int delay)
{
struct taskStruct* ptr = (struct taskStruct*)malloc(sizeof(struct                                                           taskStruct));
if(NULL == ptr)
{
return NULL;
}
ptr->taskNumber = taskNumber;
ptr->taskTime = delay;
ptr->functionTask = led_task;
ptr->next = NULL;
head = curr = ptr;
return ptr;
}
struct taskStruct* add_to_list(int taskNumber, bool add_to_end, void(ledTask)(), int ticks_delay)
{
//If list is not created yet, create list
if(NULL == head)
{
return (create_list(taskNumber, ledTask, ticks_delay));
}
struct taskStruct *ptr = (struct taskStruct*)malloc(sizeof(struct taskStruct));
ptr->taskNumber = taskNumber;
ptr->taskTime = ticks_delay;
ptr->functionTask = ledTask;
ptr->next = NULL;
if(add_to_end)
{
curr->next = ptr;
curr = ptr;
}
else
{
ptr->next = head;
head = ptr;
}
return ptr;
}
void printTaskList(void)
{
struct taskStruct *ptr = head;
while(ptr != NULL)
{
ptr = ptr->next;
}
return;
}
struct taskStruct* search_in_list(int taskNumber, struct taskStruct **prev)
{
struct taskStruct *ptr = head;
struct taskStruct *tmp = NULL;
bool found = false;
while(ptr != NULL)
{
if(ptr->taskNumber == taskNumber)
{
found = true;
break;
}
else
{
tmp = ptr;
ptr = ptr->next;
}
}
if(true == found)
{
if(prev)
*prev = tmp;
return ptr;
}
else
{
return NULL;
}
}
void main(){
initSystem();
struct taskStruct* ptr = NULL;
printTaskList();
//add new tasks with tasknumber, adding to end of list?, which color should be used?, for how long?
add_to_list(0, true, ledRedTask, 100);
add_to_list(1, true, ledRedTask, 100);
add_to_list(2, true, ledRedTask, 100);
//add_to_list(2, true, green, 20);
//add_to_list(3, true, blue, 5000);
printTaskList();
while(1){
ptr = search_in_list(1, NULL);

__asm(" WFI");
}
}

该代码是为Tiva TI Lauchpad开发的。请帮忙。

您需要函数指针的声明来匹配将为其分配的函数的原型。您可以通过以下修改来处理此问题。

像这样更改函数原型:

void ledRedTask(void) { ... }
void ledGreenTask(void) { ... }
etc...

然后,以匹配这些函数的原型的方式声明函数指针:

void (*functionTask)(void); // <-- NOT void (*functionTask)(void *);

您可以设置指针,即

ptr->functionTask = ledTask;

你可以像这样调用它:

ptr->functionTask();

最新更新