/*********************************************************/
function:General function TECHNOLOGY ARTICLE on C lanague
file ::General_c_function.txt
author :chinayaosir QQ:44633197
Tools :code::blocks 10.05(gcc)
date :10/02/2013
blog :http://blog.csdn.net/chinayaosir
note :其它网站转载此文章请保留作者的原始签名
/*********************************************************/
先后使用纯C实现两个通用函数
void gswap(void *pv1,void *pv2,int size)
这个交换函数可以直接交换多种数据类型的变量(int,char,struct,function...)
void* gsearch(void* key, void* base,int n, int elemSize, int (*cmpfn)(void*,void*) )
这个查询函数可以直接查找多种数据类型的变量(int,char,double..)
C语言通用函数编程(linux,mysql大量使用的技术)
主要实现技术是活用空指针(void *)和sizeof(),
从而实现C++模板函数相同的功能
-----------------------------------------------------------------------------------------------------
filename=c-gswap.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void gswap(void *pv1,void *pv2,int size)
{
void * buffer=malloc(size) ;
memcpy(buffer,pv1,size);
memcpy(pv1,pv2,size);
memcpy(pv2,buffer,size);
free(buffer);
}
struct person
{
char * name;
int age;
};
char* cfun1()
{
return "cfun1()";
}
char* cfun2()
{
return "cfun2()";
}
int isub(int *a,int *b)
{
printf("\n call isub(a+b)\n");
return (*a)+(*b);
}
int imul(int *a,int *b)
{
printf("\n call imul(a*b)\n");
return (*a) * (*b);
}
int main()
{
printf("General function gswap() call demo!\n");
int ix=11,iy=22;
printf("call gswap() before ix=%d,iy=%d\n",ix,iy);
gswap(&ix,&iy,sizeof(int));
printf("call gswap() after ix=%d,iy=%d\n",ix,iy);
struct person p1,p2;
p1.name="china";
p1.age=5000;
p2.name="usa";
p2.age=200;
printf("call gswap() before p1.name=%s,p2.name=%s\n",p1.name,p2.name);
printf("call gswap() before p1.age=%d,p2.age=%d\n",p1.age,p2.age);
gswap(& p1,&p2,sizeof(struct person));
printf("call gswap() after p1.name=%s,p2.name=%s\n",p1.name,p2.name);
printf("call gswap() after p1.age=%d,p2.age=%d\n",p1.age,p2.age);
char *cx="shanghai";
char *cy="guangzhou";
printf("call gswap() before cx=%s,cy=%s\n",cx,cy);
gswap(&cx,&cy,sizeof(char*));
printf("call gswap() after cx=%s,cy=%s\n",cx,cy);
char* (*funp1)()=&cfun1;
char* (*funp2)()=&cfun2;
printf("call gswap() before funp1=%s,funp2=%s\n",(*funp1)(),(*funp2)());
gswap(&funp1,&funp2,sizeof((*funp1)()));
printf("call gswap() after funp1=%s,funp2=%s\n",(*funp1)(),(*funp2)());
int (*funip1)()=&isub;
int (*funip2)()=&imul;
int a1=3;
int b1=4;
printf("call gswap() before funip1(3,4)=%d\n",(*funip1)(&a1,&b1));
printf("call gswap() before funip2(3,4)=%d\n",(*funip2)(&a1,&b1));
gswap(&funip1,&funip2,sizeof((*funip1)()));
printf("call gswap() after funip1(3,4)=%d\n",(*funip1)(&a1,&b1));
printf("call gswap() after funip2(3,4)=%d\n",(*funip2)(&a1,&b1));
return 0;
}
run value see below
----------------------------------
General function gswap() call demo!
call gswap() before ix=11,iy=22
call gswap() after ix=22,iy=11
call gswap() before p1.name=china,p2.name=usa
call gswap() before p1.age=5000,p2.age=200
call gswap() after p1.name=usa,p2.name=china
call gswap() after p1.age=200,p2.age=5000
call gswap() before cx=shanghai,cy=guangzhou
call gswap() after cx=guangzhou,cy=shanghai
call gswap() before funp1=cfun1(),funp2=cfun2()
call gswap() after funp1=cfun2(),funp2=cfun1()
call isub(a+b)
call gswap() before funip1(3,4)=7
call imul(a*b)
call gswap() before funip2(3,4)=12
call imul(a*b)
call gswap() after funip1(3,4)=12
call isub(a+b)
call gswap() after funip2(3,4)=7
-------------------------------------------------------------------------------------------------------------------
filename=gsearch.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void* gsearch(void* key,
void* base,
int n,
int elemSize,
int (*cmpfn)(void*,void*)
)
{
int i;
for(i=0;i<n;++i)
{
void* temp=(char*)base + i * elemSize;
if(cmpfn(key,temp)==0)return temp;
}
return NULL;
}
int intCmp(void* vp1,void* vp2)
{
int* ip1=vp1;
int* ip2=vp2;
return *ip1 - *ip2;
}
int doubleCmp(void* vp1,void* vp2)
{
double* ip1=vp1;
double* ip2=vp2;
return *ip1 - *ip2;
}
int StrCmp(void* vp1,void* vp2)
{
char *s1=*(char **)vp1;
char *s2=*(char **)vp2;
return strcmp(s1,s2);
}
int main()
{
printf("General function gsearch() call demo!\n");
//char test on gsearch()
char *charlist[]={"one","two","three","four"};
int csize=4;
char *key="three";
char **charfs=gsearch(&key,charlist,csize,sizeof(char *),StrCmp);
if (charfs!=NULL)
printf("found char-key %s \n",*(char **)charfs);
else
printf("Not found\n");
//int test on gsearch()
int intlist[]={1,2,8,4,9,6,7};
int isize=7;
int intkey=6;
int *intfs=gsearch(&intkey,intlist,isize,sizeof(int),intCmp);
if(intfs!=NULL)
printf("found intkey %d\n",*intfs);
else
printf("not found\n");
double floatlist[]={1.1,2.2,3.3,4.4,5.5,6.66};
int fsize=6;
double doublekey=5.5;
double *doublefs=gsearch(&doublekey,floatlist,fsize,sizeof(double),doubleCmp);
if(doublefs!=NULL)
printf("found doublekey %f\n",*doublefs);
else
printf("not found\n");
return 0;
}
run value pls see below
------------------------------------------
General function gsearch() call demo!
found char-key three
found intkey 6
found doublekey 5.500000