2016-04-13 75 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; 

如果他們不這樣做都有相同的簽名,那麼它們必須至少具有相同的返回類型,因爲如果不指定返回類型,則無法表示函數指針。