(*fun_hangld[buf[0]])(); 通過指標陣列函式來呼叫放在數組裡面的函式
阿新 • • 發佈:2018-12-21
定義陣列函式集合:
void (*fun_hangld[])()={ //函式的存放集合 Fun1, Fun2, Fun3, Fun4 };
通過while(1){(*fun_hangld[buf[0]])();}一直讀取buf[0]的值,來確定是進行那個函式。這種思想在進行模組化時很好用,比如按鍵來控制螢幕之間的對應關係,一個按鍵值,代表不同介面的顯示內容,把要顯示的每一頁面內容分為一個個函式來對應,buf[]的值就代表按鍵要選擇的頁面,可以實現高效簡潔迴圈顯示。
#include<stdio.h> #include<unistd.h> #include<pthread.h> #include<stdlib.h> #include <string.h> #include <errno.h> pthread_t pthread; pthread_t pthread1; typedef struct pipe{ int list; int pipes[2]; }pipeobj,*Ppipe; Ppipe pipe_create(); void fun(void); Ppipe PIPE; int LIST; void Fun1(void); void Fun2(void); void Fun3(void); void Fun4(void); void (*fun_hangld[])()={ //函式的存放集合 Fun1, Fun2, Fun3, Fun4 }; void Fun1(void){ printf("in Fun1 \n"); return; } void Fun2(void){ printf("in Fun2 \n"); return; } void Fun3(void){ printf("in Fun3 \n"); return; } void Fun4(void){ printf("in Fun4 \n"); return; } Ppipe pipe_create() { Ppipe h_pipe; h_pipe=calloc(1,sizeof(pipeobj)); if(NULL==h_pipe){ perror("h_pipe"); return NULL; } if(pipe(h_pipe->pipes)<0){ free(h_pipe); return NULL; } return h_pipe; } void fun_write(void) { int buf[10]; if(NULL==PIPE){ perror("PIPE"); exit(-1); } while(1) { bzero(buf,sizeof(buf)); //fgets(buf,sizeof(buf),stdin); scanf("%d",&buf[0]); //通過buf[0]的值來呼叫想要呼叫的函式 write(PIPE->pipes[1],buf,sizeof(buf)); } return; } void fun_read(void) { int buf[10]; while(1) { int count=0; bzero(buf,sizeof(buf)); count=read(PIPE->pipes[0],buf,sizeof(buf)); if(count<0) { continue; } printf("read buf的內容是:%d\n",buf[0]); (*fun_hangld[buf[0]])(); //不斷讀取buf[0]的值,來決定呼叫哪個函式 } printf("6\n"); return; } int main(void) { PIPE=pipe_create(); pthread_create(&pthread,NULL,(void *)&fun_write,NULL); pthread_create(&pthread1,NULL,(void *)&fun_read,NULL); printf("after main\n"); while(1){ sleep(1); } return 0; }
編譯執行結果: