我有一个函数(特别是系统调用),该函数返回需要调用的函数的结果。
代码看起来像这样
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;
这样您就可以将其指向两个ops表之一:
curr_proc->fds[fd].operations_pointer = rtc_ops_table;
那么您可以像使用ops_table数组之一一样使用Operations_pointer。
关于c - C函数指针分配警告,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36606409/