主题:【原创】编程心得 -- 荆棘探兴
问题一般是晚上解决, 白天我的效率太低...我正试图改变我的习惯...
80年代。进入90年代后,再在PC上写程序,就是那该死的WINDOWS了!那时候的WINDOWS别提多烂了。除了一段时间在日本的NEC PC9801上写程序,还改过一些中断,模仿一下WINDOWS的感觉。
我家老爷子都快80岁了,他用计算机多半就是数值计算,大量的经济数据,对他来说,FORTRAN就是最好的刀!老爷子现在要学JAVA,没错,80岁的老头子学JAVA,我现在给他讲JAVA,嘿嘿,他那个30年的传统手段跟现在的面向对象的新方法那是真难对上号,对他来说就是革命。我这个革命的过程,在80年代末90年代初刚学C++的时候就痛苦过了,那时候国内可真是没有什么好的将面向对象的书,我看那些写书的人也未必就是真的彻底明白了,那书看的就是别扭。
或者最简单的,就用dos下的debug工具n, l, d也可以。
直到现在网上还有很多386时代的bios代码,跟现在的bios代码比就太简单了...
那时候什么东西拿来就破,没有人有什么版权那么一说。严格说起来,我相信就是那时候的BIOS肯定也是版权保护的,不过在中国就没有人管了。
现在的BIOS肯定是越来越复杂啦,早就不是当年那开茅荒的年代啰。
不知道上面有没有这两个文件的代码...
往往最新技术只能看英文资料,因为成书,或者翻译都要花时间。
书在解决知识点理解方面还是有用的。当年我的C的指针问题就是攻读了一本这方面的完整解剖秘籍之后,不再疑惑,开始入门。
写程序满多年了。
像我这样多年没写程序的,用C写几个函数还很自然,但C++的语法和各种定义实在有点头大了。
int strlen(char* psz)
{
int len = 0;
while (*psz++)
++len;
return len;
}
char* strcpy(char* dst, char* source)
{
char* p = dst;
while (*dst++ = *source++) ;
return p;
}
char* strcat(char* s1, char* s2)
{
char* p = s1;
while (*s1)
++s1;
while (*s1++ = *s2++);
return p;
}
class string
{
public:
string();
string(char* psz);
string(const string& str);
~string();
string& operator=(const string& str);
int length();
char* get_str();
private:
char* m_pBuffer;
};
int string::length()
{
return strlen(m_pBuffer);
}
char* string::get_str()
{
return m_pBuffer;
}
string::string() : m_pBuffer(0)
{
}
string::string(char* psz) : m_pBuffer(0)
{
if (psz) {
int len = strlen(psz);
m_pBuffer = (char*)::malloc(len+1);
strcpy(m_pBuffer, psz);
}
}
string::string(const string& str) : m_pBuffer(0)
{
if (str.m_pBuffer) {
m_pBuffer = (char*)::malloc(str.length()+1);
strcpy(m_pBuffer, str.m_pBuffer);
}
}
string& string::operator=(const string& str)
{
if (this != &str) {
::free(m_pBuffer);
m_pBuffer = 0;
m_pBuffer = (char*)::malloc(strlen(str.m_pBuffer)+1);
strcpy(m_pBuffer, str.m_pBuffer);
}
return *this;
}
string::~string()
{
if (m_pBuffer) {
::free(m_pBuffer);
m_pBuffer = 0;
}
}
string operator+(const string& s1, const string& s2)
{
char* pBuffer = (char*)::malloc(s1.length() + s2.length() + 1);
strcpy(pBuffer, s1.get_str());
strcat(pBuffer, s2.get_str());
string s(pBuffer);
::free(pBuffer);
return s;
}
如果你还对c++感兴趣的话,尤其是后两本。
看得出你是有一定的编程经验的,你的代码避免了很多程序员很容易犯的错误。 我发现的大问题有:
1. 从你的代码中看得出你是允许使用者用0指针的,而且你的string类缺省的内部就是0指针。可是你的strlen、strcpy、strcat都不能正确处理0指针(实际上库函数也不能)。这样如果用户的代码是
string s1,s2,s3=s1+s2;
程序就会崩溃。
2. c++程序里一般地说是不应该有malloc/free这两个库函数的。 你的程序里用这两个函数还会导致一个问题:当内存分配失败的时候malloc会返回0。而由于问题1,0指针会导致程序失败。
还有其他的一些小毛病,比如+函数里的内存使用有点笨拙,const可以再多用一些,get_str()破坏了封装,尤其是没有用const的时候。
谭浩强。。。多了个g。。
自我矫正一下,贴错楼了,呵呵。
看似很简单的问题其实很难,比如你就问一下C里面printf到底是如何实现的我就不大说得上来。
当年刚接触C语言的时候就有人跟我说指针是难点,可是从来也没发现它是如何的难理解啊?指针难吗?奇怪的很