最近听了下网易的公开课,发现我们通常认为某种语言有某种编程范式,其实不完全正确,下面就是一些在该课上出现的一些c语言写泛型的模式的一些编程,主要是让读此文的童鞋们可以想到用不支持某种编程范式的语音也可以自己去实现该钟编程范式,某种编程范式并不是某种语音特有的,编程范式只是为了让我们编程的时候对语言或者对程序结构的设计有更好的理解。有助于我们更好的利用该语言完成自己想要的操作。
语言也许会给你带来某些方面的限制,而当你理解了各种编程范式回头再去利用语言写程序的时候,无论是写c或者c++,或者lua,paython等语言,你都可以利用各种不同的编程范式去组织你的程序,只要你能将程序组织的灵活,能够适应未来可能的变化,就是一种好的设计方式,编程范式混合着用也许对于新手来说会将程序写的一塌糊涂,但是对于老手来说,各种范式混合使用会促使程序的生命力和可复用性提高到另一个境界,语言只要符合图灵完全就可以写各种编程范式的程序。只是难易程度的问题,可是对于一个经常使用某种语言的人来说,这些就都不是问题,只是你能不能分清什么时候该用什么范式的问题,这是程序选择中的难点,也是一些人为什么会用面向对象的语言做着面向过程的事导致程序一塌糊涂。我个人喜欢c++因为它有多种编程范式,当然也是这语言为什么会这么复杂的根源,而你也可以喜欢java或者c,你可以有你自己的各种理由,当然没有也可以,对于编程范式语言本身并不重要,重要的是怎么使用它。就像一师兄的话,c++就是一把打开的瑞士军刀,啥都能干,但是一不小心就将自己划伤了,其根本原因不是别的,是因为我们自己写一些不符合语意或者逻辑的东西,或者说写一些自己不能明确知道会怎样执行的语句。无论ADT+PP还是GP,或者大家都知道的OO他们都不是万能药或者灵丹妙药,世界上目前还没有“银弹”的东西,我们只能靠自己去不断的发现,思索未来。
由此我自己模仿课上内容写了几个c实现泛型的函数,以及一些调用方法,这样做可以达到减少编译体积,提高执行效率。
缺点调用不慎会直接悲剧而且还不知道怎么悲剧的。
#include <iostream>
using namespace std;
void swapvalue(void *vp1,void *vp2,size_t buffersize)
{
char *buffer= new char[buffersize];
memcpy(buffer,vp1,buffersize);
memcpy(vp1,vp2,buffersize);
memcpy(vp2,buffer,buffersize);
delete []buffer;
};
int mylsearch(int key,int array[],int size)
{
for (int i=0;i<size;i++)
{
if (array[i]==key)
{
return i;
}
}
return -1;
}
void* mylsearch(void *key,void *base,int arraysize,int elemSize)
{
for (int i=0;i<arraysize;i++)
{
void *elemaddr=(char*)base+i*elemSize;
if (0==memcmp(key,elemaddr,elemSize))
{
return elemaddr;
}
}
return NULL;
}
void* mylsearch(void *key,void *base,int arraysize,int elemSize,int (*cmpfun)(void* ,void*))
{
for (int i=0;i<arraysize;i++)
{
//强转char*是一个黑客操作
void *elemaddr=(char*)base+i*elemSize;
if (0==cmpfun(key,elemaddr))
{
return elemaddr;
}
}
return NULL;
}
int intcmp(void* elem1,void* elem2)
{
int *ip1
=
(int *)elem1;
int *ip2
=
(int *)elem2;
return *ip1-*ip2;
}
char *notes[]={"Ab","F#","B","Gb","D"};
char *favorateNote ="B";
int StrCmp(void* vp1,void *vp2)
{
char *s1
=
*(char **)vp1;
char *s2
=
*(char**)vp2;
return strcmp(s1,s2);
}
void main()
{
char *str1="this is a very long str";
char *str2="this is a short str";
cout<<"交换之前:"<<endl;
cout<<str1<<endl;
cout<<str2<<endl;
swapvalue(&str1,&str2,sizeof(char *));
cout<<"交换之后:"<<endl;
cout<<str1<<endl;
cout<<str2<<endl;
int arr[]={4,2,3,7,11,6};
int size =6;
int number = 7;
int *found = (int*)mylsearch((void*)&number,arr,6,sizeof(int),intcmp);
if (NULL==found)
{
cout<<"没发现"<<endl;
}
else
{
cout<<found<<endl;
}
char**found2 = (char**)mylsearch(&favorateNote,notes,5,sizeof(char*),StrCmp);
if (NULL==found2)
{
cout<<"没发现"<<endl;
}
else
{
cout<<found2<<endl;
}
cout<<*found2<<endl;
system("pause");
};