我有一个函数(特别是系统调用),它返回需要调用的函数的结果。
代码看起来像这样
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;
答案 0 :(得分:1)
尝试这样的事情(当然,将行放在代码中的位置):
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;
然后你可以使用operations_pointer,就好像它是ops_table数组之一。
答案 1 :(得分:0)
答案 2 :(得分:0)
函数指针和对象指针与C不同。除了可以将函数指针转换为类型为void *
的对象指针类型之外,不能直接在它们之间进行转换。
此外,如果file_array.operations_pointer
意图指向动态数组函数指针,那么您需要一个额外的间接级别。
也许你想要这样的东西,而不是:
typedef struct file_array{
int (**operations_pointer)();
inode_t * inode;
uint32_t file_position;
uint32_t flags;
} file_array;
将operations_pointer
声明为指向函数的指针,该函数接受未指定的参数并返回int
。这适用于动态分配的函数指针块。您的C编译器可能会抱怨缺少函数原型,并且理所当然:这种形式不表示指向函数的参数类型,但如果这些函数不是全部,那么它们是合适的。有兼容的签名。
如果您打算存储的所有函数指针都指向具有相同签名的函数,那么最好在类型声明中表示该签名:
typedef struct file_array{
int (**operations_pointer)(int32_t, void *, int32_t);
inode_t * inode;
uint32_t file_position;
uint32_t flags;
} file_array;
如果它们并非都具有相同的签名,那么它们必须至少具有相同的返回类型,因为如果不指定返回类型,则无法表达函数指针。