SOGO論壇

標題: 函數指標陣列 [列印本頁]

作者: 108    時間: 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 指令, 或許 程式可以變短, 但可能變得 較難懂。





歡迎光臨 SOGO論壇 (https://oursogo.com/) Powered by OURSOGO.COM