编程范式--c语言


     斯坦福大学的开放课程有一个叫编程范式的课程,现在好像翻译的都差不多了吧.. 其实这门课程,我看的跨度一年半的样子。

现在其实都翻译的差不多了,讲的非常非常好,很有意思的,推荐给大家 http://v.163.com/special/opencourse/paradigms.html

     前十集,大概讲的是不同的类型如何在计算机内存中存储,如何编写泛型的程序,手动的去支持各种类型,不像JAVA的泛型<?>,

C++<template> 等语言内置的。对一些经典的堆栈,二分查找等用泛型来实现。然后简单的讲解这些代码如何用汇编来表示,

在用汇编表示的同时,也揭露了代码是如何运行的内幕。十集后开始讲的并发方面的一些经典示例。

    今天,先记录一下,顺序查找法的泛型实现

#include <stdlib.h>
#include <stdio.h>
#include <memory.h>

int lsearch(int key, int array[], int size);
void* lsearch_1(void* key, void* base, int n, int elemSize);
void* lsearch_2(void* key, void* base, int n, int elemSize, int(*cmpfn)(void* v1, void* v2));
int IntCmp(void*, void*);
int StrCmp(void*, void*);

//int (*intCmp)(void*, void*) = IntCmp;


int main(void)
{
    int array[] = {4,2,3,6,11,7};
    int number = 7;
    int size = 6;
    int* found = lsearch_2(&number, array, size, sizeof(int), IntCmp);
    if(found == NULL) printf("oh that's shit!\n");
    else printf("that would be fun\n");

    system("pause");
    return 0;
}





int lsearch(int key, int array[], int size)
{
    int i;
    for(i = 0; i < size; i++)
    {
        if(array[i] == key)
            return i;
    }
    return -1;
}
void* lsearch_(void* key, void* base, int n, int elemSize)
{
    int i;
    for(i = 0; i < n; i++)
    {
        void* elemAddr = (char*)base + i * elemSize;
        if(memcmp(key, elemAddr, elemSize) == 0)
        {
            return elemAddr;
        }
    }
    return NULL;
}
void* lsearch_2(void* key, void* base, int n, int elemSize, int(*cmpfn)(void* v1, void* v2))
{
    int i;
    for(i = 0; i < n; i++)
    {
        void* elemAddr = (char*)base + i * elemSize;
        if(cmpfn(key, elemAddr) == 0)
            return elemAddr;
    }
    return NULL;
}

int IntCmp(void* elem1, void* elem2)
{
    int* ip1 = (int*)elem1;
    int* ip2 = (int*)elem2;
    return *ip1 - *ip2;
}

int StrCmp(void* vp1, void* vp2)
{
    char* s1 = *(char**) vp1;
    char* s2 = *(char**) vp2;
    return strcmp(s1, s2);
}

   

    

    代码很简单,简单说一下

         顺序查找,比对每一个数据与KEY数据在内存中是否一样,找到则返回地址,否则NULL

    既然是泛型,那么,就不论其数据的占几个字节,只要是相同字节,位图相等即可。

         这里用到了几个技巧,如char* 指的是一个字节,用来方便指示第一个字节的位置,

    利用void指针可以和任何类型指针转换,传入比较函数地址来满足不同类型的数据之间

    的比较规则。


         由于本人才疏学浅,菜鸟一枚。第一次鼓起勇气,写完一篇不成文的博客,虽然是写着玩的,

     但如果有错误,还望批评指正:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值