查看完整版本: 請問在c是否有把變數字串拿來當函式的方法
頁: [1]

baepi 發表於 2015-11-18 04:20 PM

請問在c是否有把變數字串拿來當函式的方法

今天我的同事問我這個問題...我沒多想的提供了以下方法
#define play(a , b) aa_ ## a(b)
void aa_1(int c)
{
        cout<<c<<endl;
}
void main()
{
        play(1 , 147);
}結果沒多久他又來跟我抱怨說...他期望的是...以下
void main()
{
int b= 1; //或是char b = "1";
play(b , 147);
}所以才上來問問~c真有能把變數拿來當成函式的方法嗎?
<div></div>

johnwanz 發表於 2015-11-19 08:59 AM

C語言不支持...好像某些直譯程式可以, 印象中php可以吧.

他要的是動態時期的變化, 你給的是編譯時期就指定.
在C裡面, 你只能用function pointer來模擬此功能, 似乎得要自己處理這一塊.

問問其使用時機, 以及原因, 或許可以找到其他的解決方案.

baepi 發表於 2015-11-19 09:55 AM

johnwanz 發表於 2015-11-19 08:59 AM static/image/common/back.gif
C語言不支持...好像某些直譯程式可以, 印象中php可以吧.

他要的是動態時期的變化, 你給的是編譯時期就指定 ...

確實php可以做到...而且更方便~只是身處在c呀

至於大大提供的意見~在此先在這做個感謝~只是大大提供的方法與我之前提供的方法類似~都無法直接將字串拿來直接利用....畢竟指標指向就是函式...不可能指向字串然後解讀成函式{:38:}...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

snowflying 發表於 2015-11-19 11:12 PM

Windows 底下,函式若是在 DLL 內,應該可以
利用 LoadLibrary + GetProcAddress
GetProcAddress 裡面有一個參數可以傳入 function name

johnwanz 發表於 2015-11-20 09:03 AM

語言本身不支持的話, 就要靠其他來輔助. 例如:透過Windows的API.

在純C語言的話, 類似通訊協議建表處理模式,
1. 自行建立function name(string)以及function (address)的對照表
2. 將變數經過比對name, 透過function pointer呼叫對應的函式functionmap[]{
{"FuncA", FuncA},
{"FuncB", FuncB},
{"FuncC", FuncC}
};其實跟一般通訊協議的建表方法一樣, 只是處理的不是指令比較, 是字串比對.<br><br><br><br><br><div></div>

cockroachrun 發表於 2015-11-20 05:42 PM

個人寫了超過20年的C/C++ 程式. 也很少碰到有這樣的需求.
印相中. 只有用在 run time 時 user input 的計算式. 如 user input "1+power(1,2)" 的字串時用到.

所以.. 請想想. 用別的方法解決這個問題. 也許跟本不須要如此使用. 必盡作function point string map 也是要消耗很多很多運算的.

baepi 發表於 2015-11-21 08:58 PM

cockroachrun 發表於 2015-11-20 05:42 PM static/image/common/back.gif
個人寫了超過20年的C/C++ 程式. 也很少碰到有這樣的需求.
印相中. 只有用在 run time 時 user input 的計算 ...

其實...我也只有在寫PHP時才會有這需求~因為這對PHP來說是很基本的功能
然而在C時...老實說function pointe這方法是我在這聽聞二樓大大提到後我才去google爬文了解的...不然一般我也都是用我在最開始時的範例在處理各類資訊
只是因為同事提及~也才讓我跟著好奇C是否也有與PHP同樣的便利方式...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

chevylin0802 發表於 2015-11-22 08:34 AM

baepi 發表於 2015-11-21 08:58 PM
其實...我也只有在寫PHP時才會有這需求~因為這對PHP來說是很基本的功能
然而在C時...老實說function poin ...

只要是屬於編譯成機器碼的程式語言
都不會提供這樣的功能
除非是改造作業系統核心
或者你可以自行做一個雜湊表
但是如果是需要直譯器的程式語言
那末就有可能辦得到

thebestjavauser 發表於 2015-12-8 07:43 PM

如果你要的是"把字串拿來執行"的話,你可以去找找看 LuaPlus (C++ only)
它可以做到這樣:#include <iostream>
#include <LuaPlus.h>

void AddAndPrint(int a, int b)
{
 std::cout << a + b << std::endl;
}

int main(void)
{
 LuaStateOwner l;

 l->getGlobals().RegisterDirect("AddAndPrint", AddAndPrint);

 l->DoString("AddAndPrint(5, 6)");

 return 0;
}

Ateach 發表於 2015-12-25 10:04 PM

thebestjavauser 發表於 2015-12-8 07:43 PM static/image/common/back.gif
如果你要的是"把字串拿來執行"的話,你可以去找找看 LuaPlus (C++ only)
它可以做到這樣: ...

lua的行為就是function pointer string map了
記憶體用量跟速度都比樓主寫的差太了

不過如果鐵了心就是要用字串來動態選擇函式的話
我也推薦用lua實現...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><br><br><br><br><br><div></div>

NTUKing 發表於 2016-1-4 03:23 AM

本帖最後由 NTUKing 於 2016-1-4 03:24 AM 編輯

應該可以用callback
使用方法大概是先定義一個callback point
然後用callback宣告一個陣列

接下來就是傳值就可以執行了

caoh 發表於 2016-1-12 12:58 PM

這跟哪個語言無關,你要動態,就是一個查找函數位址的功能
不管你用手動 search、map、reflection 都是一樣道理
要靜態就不太可能了,要呼叫函數就要知道它的位址
平常是 C 在編譯的時候幫你把 symbol 與 address 關聯起來
你不在編譯期作,就是改成執行期自己關聯,關聯就是搜尋過程
如此而已
  
  
  
頁: [1]