2010-10-16 67 views
1

我寫,如果我能做到這樣的事情是可以簡化一個C程序:如何根據char *指定函數指針的地址?

int (*func)(int); 
char* str= "adder"; 
func = str; 
func(2); 

我創建了一個函數指針,一個char *,我嘗試分配功能的名稱通過該char *的指針。在這個例子中,加法器(int)函數存在。

這實際上可行嗎?

我知道做這純粹是FUNC =加法器的標準方法;,但不會解決這個問題。

非常感謝!

Antonio

+1

有些事情讓你接近,但你不能,比如說,有一個字符串和用它來定義按名稱調用哪個函數。如果您告訴我們您真正想要做什麼(核心問題),或許我們可以幫助您找到*正確*解決方案。 – 2010-10-16 22:19:49

+0

你好馬克,我基本上試圖根據傳遞給主函數的參數調用一個函數。我知道我可以用條件結構進行比較和檢查,但我希望能以更有效的方式進行。感謝您的回答:) – abmirayo 2010-10-16 22:33:35

+0

感謝大家回答如此之快。我意識到這不是我能夠輕鬆完成的任務,因爲我提供的代碼片段中,我將嘗試使用R ..所示的映射技術。再次感謝你的幫助!! :) – abmirayo 2010-10-16 22:37:46

回答

3

你讓一個表是這樣的:

static const struct { 
    char *name; 
    int (*func)(int); 
} map[] = { 
    { "adder", adder }, 
    /* ... */ 
    { 0, 0 } 
} 

,然後使用此代碼:

for (i=0; map[i].name && strcmp(map[i].name, str); i++); 
if (map[i].func) y = map[i].func(x); 
else /* ... */ 
+0

非常感謝您的回答,我認爲這會讓我朝着正確的方向發展 – abmirayo 2010-10-16 22:27:32

2

這不會做我認爲你應該做的事。如果您設法將"adder"轉換爲函數指針,您將嘗試將實際文本作爲函數執行,而不是您想要的。你可以保留函數指針的數組,也可以保留文本→函數指針的映射。除此之外,我們需要更多關於你在做什麼的信息。

+0

我其實是試圖調用取決於傳遞給程序的參數的函數,沒有與開關結構檢查不同的可能性 – abmirayo 2010-10-16 22:31:49

2

我所知道的最好的辦法是把你的函數在一個動態庫,並使用dlsym或操作系統的等同於讓你的函數指針。或者,您必須以某種方式從字符串到函數指針設置您自己的映射。

+0

謝謝您的回答,我會考慮你的答案設立地圖 – abmirayo 2010-10-16 22:28:17

1

你可以在windows和getprocaddress函數中使用dll來完成類似這樣的事情,但是你只需要使用具有相同簽名的函數或者保留某種類型的精細映射。然而,你正在嘗試做什麼需要額外的基礎設施。如果你使用C++,你可以使用地圖來存儲字符串和fnptrs之間的關係。

+0

謝謝,但我在純C編程,在UNIX中 – abmirayo 2010-10-16 22:28:58