您的位置:首页 > 编程语言 > C语言/C++

编程范式--c语言

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

现在其实都翻译的差不多了,讲的非常非常好,很有意思的,推荐给大家 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指针可以和任何类型指针转换,传入比较函数地址来满足不同类型的数据之间

的比较规则。

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

但如果有错误,还望批评指正:)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: