gpt4 book ai didi

C 函数指针赋值警告

转载 作者:行者123 更新时间:2023-11-30 15:09:34 24 4
gpt4 key购买 nike

我有一个函数(特别是系统调用),它返回需要调用的函数的结果。

代码看起来像这样

    int32_t (*func_ptr)(int32_t fd, void * buf, int32_t nbytes);
func_ptr = (curr_proc->fds[fd].operations_pointer[READ]);

我们的curr_proc在哪里只是一个结构体。该结构持有文件描述符数组 ( fds ),其中包含指向要运行的相应函数的指针 ( operations_pointer )。有一个数组保存了我们系统中每种类型设备的功能,这个数组如下所示:

uint32_t * rtc_ops_table[4] = {(uint32_t *) rtc_open, (uint32_t *) rtc_read, (uint32_t *) rtc_write, (uint32_t *) rtc_close};
uint32_t * dir_ops_table[4] = {(uint32_t *) dir_open, (uint32_t *) dir_read, (uint32_t *) dir_write, (uint32_t *) dir_close};

这样,当程序调用read时,相应的函数指针就会被加载到func_ptr中。然后返回相应的参数。

我遇到的问题是在我分配 func_ptr 的行中,我从 gcc 收到此警告:

warning: assignment makes pointer from integer without a cast

我尝试过各种类型转换,例如 (uint32_t *) , (uint32_t) , (int32_t)等等。我也尝试过这样分配函数指针:

func_ptr = &(curr_proc->fds[fd].operations_pointer[READ]);

但是没有效果。

我该如何解决这个警告?

编辑:

这是 curr_prc 的结构

typedef struct {
file_array fds[8];
uint8_t file_names[8][32];
uint8_t proc_num;
...
} pcb_t;

以及 fas 的结构:

typedef struct file_array{
uint32_t * operations_pointer;
inode_t * inode;
uint32_t file_position;
uint32_t flags;
} file_array;

最佳答案

尝试这样的方法(当然,将这些行放在代码中应有的位置):

typedef int32_t (*my_func_ptr)(int32_t fd, void * buf, int32_t nbytes);

typedef struct file_array{
my_func_ptr operations_pointer[4];
inode_t * inode;
uint32_t file_position;
uint32_t flags;
} file_array;

my_func_ptr rtc_ops_table[4] = {rtc_open, rtc_read, rtc_write, rtc_close};
my_func_ptr dir_ops_table[4] = {dir_open, dir_read, dir_write, dir_close};

my_func_ptr func_ptr = (curr_proc->fds[fd].operations_pointer[READ]);

在此示例中,my_func_ptr 是一种描述函数指针的类型,并用于包含它们的所有变量。

或者,您可能希望将 Operations_pointer 声明为指针:

 my_func_ptr *operations_pointer;

这样你就可以让它指向两个操作表之一:

curr_proc->fds[fd].operations_pointer = rtc_ops_table;

然后您可以使用操作指针,就好像它是 ops_table 数组之一一样。

关于C 函数指针赋值警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36606409/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com