C语言泛型编程技术(linux,mysql广泛应用)

来源:互联网 发布:易企秀官网mac版 编辑:程序博客网 时间:2024/05/16 02:50

/*********************************************************/
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



原创粉丝点击