2011-02-28 75 views
3

我正在爲我的課程編寫一個程序,它以非常簡單的方式模擬操作系統處理中斷的方式。我該如何指向C中函數的開始?

在C中,我有我與聲明的陣列INTERRUPT_TABLE[]

typedef void (*FN_TYPE)(); 

extern FN_TYPE INTERRUPT_TABLE[]; 

我想設置它,使得在陣列的點的各位置到在別處包含不同的功能的開始我的程序 - 例如,INTERRUPT_TABLE[0]應該指向函數handle_trap()的開頭。

我以爲我可以簡單地說:INTERRUPT_TABLE[0] = handle_trap;但這不起作用。我收到一個編譯器錯誤,說「kernel.c:134:錯誤:下標值既不是數組也不是指針」。有誰知道我做錯了什麼?

感謝您的幫助。

編輯:想通了!我的INTERRUPT_TABLE在我嘗試呼叫的函數上方,因此它們被自動聲明爲整數

+0

你是什麼意思「這不工作」?究竟是什麼問題?編譯錯誤?鏈接錯誤?運行時錯誤? – 2011-02-28 14:38:37

+0

更具體;有很多方法無法工作。語法錯誤?運行時錯誤? – plinth 2011-02-28 14:38:46

+0

「不工作」的含義? – Erik 2011-02-28 14:39:11

回答

4

定義「不工作」。這應該工作。我懷疑我們錯過了一些背景。您是否試圖通過在頂層的某處說INTERRUPT_TABLE[0] = handle_trap;來初始化INTERRUPT_TABLE?那個特定的語法在那裏不起作用,但是可以在函數體中工作。或者,你可以使用初始化語法:

FN_TYPE INTERRUPT_TABLE[] = { handle_trap, ... }; 
0

當你在其他地方說,我認爲它不在同一個文件。所以,你要麼需要聲明handler_trap(頭文件),或者你必須在你的C文件中使用它之前手動將它聲明:

extern void handler_trap(); 

否則編譯器不知道handler_trap()是一個函數,它看重它返回或期望的參數。

1

爲了詳細說明洛根的回答是:

只有(函數對象)聲明可以出現在「外部」或文件內容。

雖然FN_TYPE INTERRUPT_TABLE[] = { handle_trap, ... };是初始化定義,下面有一個定義,一個賦值操作:

FN_TYPE INTERRUPT_TABLE[]; 
INTERRUPT_TABLE[0] = handle_trap;

這種分配不能出現在頂層和被解釋爲INTERRUPT_TABLE的重新定義。

但是,這與您收到的錯誤消息不匹配。爲什麼它的價值,這個簡單的程序編譯成功:

typedef void (*FN_TYPE)(); 

extern FN_TYPE INTERRUPT_TABLE[]; 

void handle_trap() { 
} 

int main() { 
    INTERRUPT_TABLE[0] = handle_trap; 
}