【发布时间】:2016-04-13 18:16:56
【问题描述】:
我有一个函数(特别是系统调用),它返回需要调用的函数的结果。
代码是这样的
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;
【问题讨论】:
-
提交
curr_proc的类型声明怎么样?在不知道实际涉及的类型是什么的情况下,很难解决类型问题。 -
也是
curr_proc->fds的元素类型的声明。 -
@JohnBollinger 更新
-
operations_pointer 只是指向 uint32_t 的指针,而不是指向函数的指针。我认为这就是错误所在。 Operations_pointer 应该与 func_ptr 具有相同的类型。那些 ops_table 数组可能还应该有一个函数指针类型——你需要强制转换为 uint32_t 指针数组的数组。
标签: c function-pointers