编程范式--c语言
2014-02-11 00:19
260 查看
斯坦福大学的开放课程有一个叫编程范式的课程,现在好像翻译的都差不多了吧.. 其实这门课程,我看的跨度一年半的样子。
现在其实都翻译的差不多了,讲的非常非常好,很有意思的,推荐给大家 http://v.163.com/special/opencourse/paradigms.html
前十集,大概讲的是不同的类型如何在计算机内存中存储,如何编写泛型的程序,手动的去支持各种类型,不像JAVA的泛型<?>,
C++<template> 等语言内置的。对一些经典的堆栈,二分查找等用泛型来实现。然后简单的讲解这些代码如何用汇编来表示,
在用汇编表示的同时,也揭露了代码是如何运行的内幕。十集后开始讲的并发方面的一些经典示例。
今天,先记录一下,顺序查找法的泛型实现
代码很简单,简单说一下
顺序查找,比对每一个数据与KEY数据在内存中是否一样,找到则返回地址,否则NULL
既然是泛型,那么,就不论其数据的占几个字节,只要是相同字节,位图相等即可。
这里用到了几个技巧,如char* 指的是一个字节,用来方便指示第一个字节的位置,
利用void指针可以和任何类型指针转换,传入比较函数地址来满足不同类型的数据之间
的比较规则。
由于本人才疏学浅,菜鸟一枚。第一次鼓起勇气,写完一篇不成文的博客,虽然是写着玩的,
但如果有错误,还望批评指正:)
现在其实都翻译的差不多了,讲的非常非常好,很有意思的,推荐给大家 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指针可以和任何类型指针转换,传入比较函数地址来满足不同类型的数据之间
的比较规则。
由于本人才疏学浅,菜鸟一枚。第一次鼓起勇气,写完一篇不成文的博客,虽然是写着玩的,
但如果有错误,还望批评指正:)
相关文章推荐
- 关于C++的动态库
- 自己用C++实现BaseLine Jpeg解码(要点总结)
- 表达式计算之c++调用python
- 2013 蓝桥杯 【初赛试题】 错误票据
- 如何编写一个简单的嵌入式操作系统 (2)时间片轮转
- C语言 windows下如何获取开机时间
- C++中const的实现机制深入分析
- C++ derived class access specifier
- 排序算法实例精粹(windows c++ 验证)
- C++为什么不提倡使用scanf和printf函数
- 谈谈位运算之按位异或
- 虚函数对C++多态的影响
- C++的成员函数在多线程下运行的测试
- c++强制类型转换
- C++继承
- C++成员初始化列表
- C++容器适配器
- C++之函数应用
- 日志时间打印(精确到毫秒)C/C++
- C++调用dos命令