C函数指针赋值警告

时间:2016-04-13 18:16:56

标签: c function-pointers

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

代码看起来像这样

    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;

3 个答案:

答案 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)

file_array中的operations_pointer应该是一个functoin指针类型(func_ptr),它是uint32_t指针!

答案 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;

如果它们并非都具有相同的签名,那么它们必须至少具有相同的返回类型,因为如果不指定返回类型,则无法表达函数指针。