Re: [問題] 請問Function pointer陣列問題
※ 引述《mingtai1.bbs@ptt.cc (綠豆嘉義人)》之銘言:
> 小弟有個關於指標陣列的疑問
> 書上說指標陣列常拿來做選單系統, 不同的選項會呼叫不同的function
> 今天如果code如下
> // prototype
> void fun1 (int);
> void fun2 (int);
> void fun3 (int);
> // function pointer array
> void (*f[3]) (int) = {fun1, fun2, fun3};
> 這樣是OK的
> 但是如果把fun2改成 void fun2 (int, int)
> 就會出現compile error (cannot convert from xxxxx)
> 也很明顯的是函式的signature不合
> 所以我的疑問是
> 難道要用function pointer做到選單功能
> 每個選單功能的回傳和接收的參數數目難道都要一樣嗎?
當然!
我問你,你的程式難道不會寫成下面的樣子?
scanf("%d", &op1);
scanf("%d", &op2);
scanf("%d", &opr);
res1=f[opr](op1, op2);
寫成函數指標,就是希望evaluate敘述只要寫一次,可以達到跟多條一樣的
效果,所以每次傳進去的參數都會一樣。
而如果有一條以上的evaluate敘述
res1=f[opr](op1, op2);
resn=f[opr](op1);
那為何不分組,unioperand的函數歸一個陣列,bioperand的函數另歸一個陣列?
enum { uni, bi };
float (*opu[3])(float);
float (*opb[4])(float, float);
opu[0]=invert; opu[1]=sqrt; opu[2]=exp;
opb[0]=plus; opb[1]=minus; opb[2]=mul; opb[3]=div;
while (...) {
...
res = optype(opt) ? opu(op1) : opb(op1, op2);
...
}
一個selective evaluation就解決了。
> 這樣一點也不彈性
鹿「彈性」變成馬 ==> 馬鹿
> 所以我想問, 請問有沒有什麼辦法可以解這個問題?
> 讓陣列裡面每個pointer都指到一個函式
> 而且那些函式也可以有不同的回傳和接收參數數目
我必須要稱讚你的想法真是無聊,給自己製造太多便利,增加發生錯誤的風險
不過當然是有辦法可以解。(不然IOCCC要怎麼比?)
1: 使用 "..." function-list argument 實作變數。
2: 給每個unioperand的函數加虛參數,該參數沒有用處,執行中也會忽略。
---
老話一句,抱怨某個feature以前,你真的用這個feature寫過程式嗎?你是
不是把鹿當馬騎呢?
--
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
For the country must we secure all the advantages, but after the party!
ˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍ
─ journeyman ─
SCA v2
--
┌─────◆KKCITY◆─────┐ ◢ ◤ 動態歌詞 讓你成為K歌之王!
│ bbs.kkcity.com.tw │ \^_^ / ★ http://www.kkbox.com.tw ★
└──《From:59.115.215.116 》──┘ ◤ 唱片公司授權,音樂盡情下載
--
討論串 (同標題文章)
完整討論串 (本文為第 2 之 4 篇):