SOGO論壇
  登入   註冊   找回密碼
查看: 715|回覆: 0
列印 上一主題 下一主題

[技術文章] 函數指標陣列 [複製連結]

Rank: 3Rank: 3

狀態︰ 離線
跳轉到指定樓層
1
發表於 2012-7-23 08:46:54 |只看該作者 |倒序瀏覽
如果 計算 圖形面積 的函數 均有相同的架構如:

      int LineArea(struct linesegment *L);
      int TriangleArea(struct triangle *T);
      int RectArea(struct rectangle *R);
      int EllipseArea(struct ellipse *E);
      int DiskArea(struct circle *C);
      int PolygonArea(struct polygon *P);

我們可 設計 一函數 指標陣列 如下:
      int (*fparray[FIGURESIZE])( void *);

註:
假設 FIGURESIZE 為 6。
由 int (*fp)( void *) 知 fp 為一函數指標,
因此, int( *fparray[6])( void *); 其中 fparray[6] 為 一陣列含 6 個分量, 每個 分量 都是 一函數 指標, 其 型態 即 為 fp 函數指標 的型態。
再由第 7.5 節的 Figure 與 node 的 資料型態,設 nodeList 表一 node 指向一平面 圖形, 今欲 計算 這些 圖形總面積, 我們可利用 下列 方法來計算。 令
        fparray[0] = LineArea;
        fparray[1] = TriangleArea;
        fparray[2] = RectArea;
        fparray[3] = DiskArea;
        fparray[4] = EllipseArea;
        fparray[5] = PolygonArea;

定義一 變數 pNode 及 totalArea 為
        struct node *pNode;
        int totalArea=0

再以 迴圈的方式 traverse 整個 linked-list nodeList,分別 取得圖形 並 呼叫 ComputeArea 以 取得 其面積。
        pNode=nodeList;

        while ( pNode != NULL)
        {   totalArea = totalArea +
               ComputeArea(&(pNode->aLine), fparray[ pNode->figure]);
            pNode=pNode->next;
        }           

註 1: 由 pNode->figure 而知 圖形的 種類, 至於是 pNode->aLine 或是 pNode->aTriangle 或是其他, 我們只要取得其地址即可, 因此,由 &(pNode->aLine) 統一取其地址即可。 (Why?)
註 2: 由呼叫 函數 ComputeArea 傳 函數參數 TriangleArea 等, 主要是要避免使用 switch 指令, 或許 程式可以變短, 但可能變得 較難懂。
喜歡嗎?分享這篇文章給親朋好友︰
               感謝作者     

請注意︰利用多帳號發表自問自答的業配文置入性行銷廣告者,將直接禁訪或刪除帳號及全部文章!
您需要登錄後才可以回覆 登入 | 註冊


本論壇為非營利自由討論平台,所有個人言論不代表本站立場。文章內容如有涉及侵權,請通知管理人員,將立即刪除相關文章資料。侵權申訴或移除要求:abuse@oursogo.com

GMT+8, 2025-2-11 23:08

© 2004-2025 SOGO論壇 OURSOGO.COM
回頂部