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

代码看起来像这样

    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/

10-11 15:32
查看更多