1. 程式人生 > >(*fun_hangld[buf[0]])(); 通過指標陣列函式來呼叫放在數組裡面的函式

(*fun_hangld[buf[0]])(); 通過指標陣列函式來呼叫放在數組裡面的函式

定義陣列函式集合:

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;
}

編譯執行結果: