2016-04-13 79 views
0

我有一个函数(特别是系统调用),它返回需要调用的函数的结果。C函数指针赋值警告

代码看起来像这样

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}; 

因此,当一个程序调用读取时,对应的函数指针被加载到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; 
+1

如何呈现'curr_proc'类型的声明?在不知道实际涉及的类型的情况下清理类型问题是相当困难的。 –

+0

也是'curr_proc-> fds'元素类型的声明。 –

+0

@JohnBollinger更新 –

回答

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; 

,这样你可以只是将它指向你的两个OPS表之一:

curr_proc->fds[fd].operations_pointer = rtc_ops_table; 

,那么你可以使用operations_pointer就好像它是ops_table数组中的一个一样。

0

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

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; 

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