C 跳躍表/轉換表

來源:互聯網
上載者:User

個人實現例子:

 

#include <stdio.h><br />#include <string.h><br />#define M 4<br />int add(int a, int b);<br />int sub(int a, int b);<br />int mul(int a, int b);<br />int div(int a, int b);<br />int (*oper_func[])(int, int) = {<br />add, sub, mul, div<br />};<br />char oper_sequence[M][10] = {<br />"add", "sub", "mul", "div"<br />};<br />int main()<br />{<br />char oper[10];<br />int seq;<br />int a,b;<br />int result;<br />int i;<br />printf("Operator:");<br />scanf("%s",oper);<br />printf("a:");<br />scanf("%d",&a);<br />printf("b:");<br />scanf("%d",&b);<br />for(i=0; i<M; i++)<br />{<br />if(strncmp(oper_sequence[i], oper, 3) == 0)<br />seq = i;<br />}<br />result = oper_func[seq](a, b);<br />printf("result is %d/n", result);<br />return 0;<br />}<br />int add(int a, int b)<br />{<br />return a+b;<br />}<br />int sub(int a, int b)<br />{<br />return a-b;<br />}<br />int mul(int a, int b)<br />{<br />return a*b;<br />}<br />int div(int a, int b)<br />{<br />return a/b;<br />}</p><p> 

 

<<C和指標>>原文:

轉換表(jump table)
 跳躍表最好用個例子來解釋。下面的程式碼片段取自一個程式,它用於實現一個袖珍式計算機。程式的其他部分已經讀入兩個數(op1和op2)和一個操作符(oper)。下面的代碼對操作符進行測試,最後決定調用哪個函數。
switch(oper)
{
  case ADD:   result=add(op1,op2);break;
  case SUB:    result=sub(op1,op2);break;
  case MUL:    result=mul(op1,op2);break;
  case DIV:     result=div(op1,op2);break;
  ......
}

      對於一個新奇的具有上百個操作符的計算機,這條switch語句將會非常之長。為什麼要調用函數來執行這些操作呢?把具體操作和選擇操作的代碼分開是一種 良好的設計方案。更為複雜的操作將肯定以獨立的函數來實現,因為它們的長度可能很長。但即使是簡單的操作也可能具有副作用,例如儲存一個常量值用於以後的 操作。
為了使用switch語句,表示操作符的代碼必須是整數。如果它們是從零開始連續的整數,我們可以使用轉換表來實現相同的任務。轉換表就是一個函數指標數組。
建立一個轉換表需要兩個步驟。首先,聲明並初始化一個函數指標數組。唯一需要留心之處就是確保這些函數的原型出現在這個數組的聲明之前。

double add(double,double);
double sub(double,double);
double mul(double,double);
double div(double,double);

double (*oper_func[])(double,double)={add,sub,mul,div,...};

      初始化列表中各個函數名的正確順序取決於程式中用於表示每個操作符的整型代碼。這個例子假定ADD是0,SUB是1,MUL是2,接下去以此類推。
      第二個步驟是用下面這條語句替換前面整條switch語句!
result=oper_func[oper](op1,op2);
oper從數組中選擇正確的函數指標,而函數叫用作業符將執行這個函數。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.