Re: [問題] 請問Function pointer陣列問題

看板Programming作者時間17年前 (2008/04/03 05:32), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/4 (看更多)
※ 引述《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 ──┘   唱片公司授權,音樂盡情下載 --
文章代碼(AID): #17z6lI00 (Programming)
文章代碼(AID): #17z6lI00 (Programming)