C / C++
文章平均质量分 55
nyzhl
while(SUCCESS!=try());
展开
-
C/C++调用JVM -可执行Java文件方案
每次运行写好的Java程序都要先进命令行,再打JVM命令,很不爽。网上流传了很多生成Java可执行文件的方案,有的修改JBuilder.exe,很遗憾,我用免费的eclipse。有的用exe4j,貌似是个好东西,可以把字节码文件编译成本地文件,不过编译过来就不该叫Java了,该叫C++了。其实都把简单的问题复杂化了,只用C或C++写一个shell调用JVM就OK了。一行代码就搞定了。C/C++代码原创 2007-08-05 21:32:00 · 2683 阅读 · 2 评论 -
TCP Socket编程 C/C++实现 (Windows Platform SDK)
C语言TCP程序中的Hello World。以前一直用OO语言,现在用C语言写着玩,思想上有点转不过来弯,o(∩_∩)o...Server:#pragma comment(lib, "ws2_32.lib")#include #include void main(){ //版本协商 WORD wVersionRequested原创 2008-07-04 20:38:00 · 6176 阅读 · 4 评论 -
C++ 纯虚析构函数 error LNK2019
C#和Java写的多了,在能声明为接口的情况下,尽量不会声明为抽象类昨天写C++程序,理所当然的把基类里的所有方法都写成了纯虚函数。事实上也的确应该全是纯虚函数。因为我是把两个(以后可能会是n个)硬件厂商的SDK抽象出来,硬件不一样,软件SDK差别就更大了,完全没有一致的地方。基类的析构函数应该声明为虚函数的,索性一不做二不休声明为纯虚构函数好了。这样,一个类似与Java中接口的C++原创 2009-01-14 18:01:00 · 3768 阅读 · 0 评论 -
关于 Win32API 中的 LoadLibrary
有人说 反射反射,程序员的法宝。这句话一点也没有错。如果能够动态的加载类和方法,就等于彻底的解除了类和类,方法和方法的耦合。当然,这样编译器就无法帮你检查出其中的错误了,还是有一定的风险的。总的来说,反射是一位好同志。他可以让程序的扩展变得如此方便,免除了重新编译之苦。 近来在玩C++,被其中的种种细节问题搞得晕头转向。用LoadLibrary实现动态加载类,花了很多时间在dl原创 2009-02-03 22:21:00 · 5698 阅读 · 0 评论 -
static 成员未初始化引起 error lnk2001
对C++的语法不精通,出了很多问题。静态成员我本想直接初始化,结果编译出错,必须是静态常量才行,而且C++没有静态构造函数。根据C#和Java的经验,不初始化总要有默认的初始化吧!结果出了编译错误error lnk2001,我以为是某个符号没有链接上,找了好久配置问题无果。后来才发现出错的都是静态变量。头文件: static bool m_hasInit; static v原创 2009-02-04 13:39:00 · 2626 阅读 · 0 评论 -
关于值类型和引用类型的思考
注:这里的引用类型是广义上的Referrence Type,类似于C#中关于引用类型的定义,包括C++中的引用和指针.更准确的说应该是堆内存指针. 已经习惯了C#和Java里的对象即对象指针,在写C++程序中总是面临困扰.用引用类型?什么时候new而又什么时候delete?在堆内存分配空间比栈更耗时,用什么样的方案最合理呢?用值类型?传值,以为着内存之间的频繁拷贝,频繁拷贝构造和析原创 2009-03-20 21:16:00 · 755 阅读 · 0 评论 -
多重继承与类型转换 -- 虚基类多继承
多重继承是C++的特性之一,但在比较新的Java和C#中被摒弃,因为多重继承在类型转换中会出现一些有意思的现象。下面是虚方法多重继承#include #define interface structusing namespace std;interface IA { virtual void FA() = 0;};interface IB { vir原创 2009-04-11 20:48:00 · 2539 阅读 · 0 评论 -
关于数组名的思考
在大学里一直认为数组名是指针,现在看来似乎有些站不住脚,最明显就是sizeof的结果:char arr[8];在这里,sizeof(arr)的结果是8,而在32位PC中,指针的长度应该是4才对。 但是可以有这样的操作:char* p = arr;可以把数组赋值给指针,数组名又好像指针一样 从本质来讲,数组应该是连续的一段存储空间,个人觉得C#和Java的数组声明方法更直原创 2009-04-08 20:10:00 · 819 阅读 · 1 评论 -
新写简单C++链表
C++标准化的进度一直都很慢,也许是因为众口难调的原因吧~!但是已经标准化的STL用起来也比较闹心,最典型的就是跨Dll调用时老出问题。首先,参数和返回值不能用STL类,因为STL模板实现时使用了静态成员,而每个Dll都有独立的静态存储空间,这样对象传过去后再访问静态成员,就造成了非法内存访问。由此延伸,类的成员也不能有STL对象,因为类对象拷贝也会造成STL对象拷贝,也会发生上面的问原创 2009-05-08 20:53:00 · 114 阅读 · 1 评论 -
ATL-Style模板 不用虚函数实现 多态
最近在看ATL和WTL,比较有意思的是,它用类模板来实现多态,子类通过类模板将真实的类型传给父类,这样父类就知道真实的类型了。简单的例子:#include //Coding by nyzhltemplateclass CBase{public: void Display() { T* pT = static_cast(this); pT->Print()原创 2009-07-28 16:51:00 · 2060 阅读 · 1 评论 -
private virtual 与 Template Method模式
今天面试真倒霉,本来我状态还不错,结果遇到一位咄咄逼人的面试官。然后我就被逼问的晕菜了。最后问private virtual声明的方法有什么用,我竟然随口答没有用。出来想了一下 ,大概是父类还有一个公有的方法调用这个private virtual方法,由于虚函数不受访问权限的影响,在子类中可能会有该方法的override。为了验证这个想法,回去写了段程序试了一下,果然如此。#include原创 2009-07-29 18:57:00 · 151 阅读 · 0 评论 -
CreateThread引起的内存泄露
我的程序跑了一个星期,比较稳定,但是内存占用却以每天300k左右的速度递增.内存泄露比较难找,先让他继续跑跑看偶尔在书上看到CreateThread创建的线程,并不能释放CRT的资源如果用CRT函数的话,可能会有内存泄露.很遗憾... 我习惯用CRT字符串处理 在此有两种解决方案:1.用CRT函数 _beginthread来创建线程,它在结束时会自动释放CRT资源2.在原创 2009-07-03 10:27:00 · 3140 阅读 · 0 评论 -
UDP Socket编程 C/C++实现 (Windows Platform SDK)
挺无聊一小程序,俩SB一人说一句,据说聊天程序最好用UDP写。Server:#pragma comment (lib,"ws2_32.lib")#include #include void main(){ //版本协商 WORD wVersionRequested; WSADATA wsaData; int err;原创 2008-07-04 21:05:00 · 13148 阅读 · 5 评论 -
Critical Section 线程同步 (C/C++ Windows Platform SDK 实现)
Mutex和Event是系统内核对象,好处是他们是跨进程的,可以用作进程间的线程同步。缺点也很明显,就是他们的速度较慢。Critical Section则是用户对象,速度快,但是不能设置超时时间,一不小心会造成死锁。(记得操作系统课本上的哲学家饿死问题吗,幸好哲学家不搞程序,要不然非气吐血不可)。。。一个很简单的Critical Section示例:// Coding by nyzhl原创 2008-07-11 21:55:00 · 2311 阅读 · 0 评论 -
Mutex线程同步 (C/C++ Windows Platform SDK 实现)
最近对Windows Platform SDK和MFC编程比较感兴趣,工作之余(我是搞.NET的C/S编程),写了写小程序消遣。o(∩_∩)o... 首先是关于线程同步的:#include #include //线程方法DWORD WINAPI Run1(LPVOID lpParam);DWORD WINAPI Run2(LPVOID lpParam);原创 2008-07-04 20:18:00 · 2184 阅读 · 1 评论 -
C语言函数传值问题
一个菜菜的问题,也是每个初学者必然碰到的问题#include stdio.h>void Plus1(int i) ...{ i += 1;}void main() ...{ int i = 0; Plus1(i); printf("%d ",i);}Plus1的作用是让参数值加一,很不幸,以上程序运行后并没有达到想要的效果。这是因为当main函数中的i传入P原创 2007-09-08 22:07:00 · 2042 阅读 · 0 评论 -
顺序栈 C语言实现
最近复习C和数据结构,顺序栈是最简单的栈实现。它是用数组来存放数据,用一个int变量来记录当前栈顶元素的下标,用-1来表示空栈,结构简单。写一个完整的测试程序,编译器虽然是C++的,但程序是按照C语言规范来写的。程序实现:依次向栈中压入0~19二十个数字,然后依次出栈并输出。头文件:SeqStack.h//SeqStack.h#define TRUE 1#define FALSE 0#原创 2007-09-08 17:42:00 · 7710 阅读 · 1 评论 -
C语言中 ++ 和 * 的优先级
本来我想当然的以为在C语言中指针预算符的优先级肯定比++高,后来在写程序时发现并没有这么当然。在C语言中,自增运算符++和指针运算符*的优先级关系为左++ > * > 右++比如 ++ *i 相当于 ++ (*i) ,指针i对应的变量+1。*i ++ 相当于 * (i++) ,指针i,也就是地址值 +1(其实是加1个变量所占的地址空间)#include stdio.h>void原创 2007-09-08 22:33:00 · 16959 阅读 · 11 评论 -
链栈 C语言实现
顺序栈的实现依靠数组,而数组需要事先声明长度,一次性地静态地分配内存空间。这样就给我们带来很多不便。因为我们事先并不能精确地估计栈所需的大小,估计大了浪费空间,估计小了后果就严重了,导致程序无法正常运行。所以我们通常使用链栈这种数据结构。链栈用链表作为存储结构,栈初始化时仅需给栈顶指针分配内存空间,而后每当有数据入栈时再为该数据分配空间,这样实现了内存空间的动态分配。理论上栈的大小可以是无限大原创 2007-09-09 11:23:00 · 5887 阅读 · 5 评论 -
括号匹配问题 栈的应用 C语言实现
括号匹配问题是栈的一个经典应用。程序基本 思路是这样的:遍历字符串,如果遇到左括号就入栈,如果遇到右括号就取栈顶元素,然后比较是否匹配,如果匹配就出栈删除相匹配的括号,如果不匹配就说明括号匹配失败。遍历完成后看栈中是否还有未匹配的括号,如果有就说明括号匹配失败,如果是空栈,就说明括号匹配成功。程序清单:CharStack.h BracketMatch.cBracketMa原创 2007-09-09 20:59:00 · 5975 阅读 · 0 评论 -
栈 C++实现
先后写了栈的Java ,C实现,今天又上数据结构课,机房的环境是C++。本以为C和Java都没问题了,C++岂不是手到擒来?结果一写就出错,而且是一大堆错,郁闷~缠着老师问了问,回家再埋头修炼,写了C++版链栈程序清单:Stack.h StackTest.cpp程序实现:依次将0~19而是个数压栈,再依次出栈并输出Stack.h /**//* Stack.h *//*原创 2007-09-11 23:17:00 · 2255 阅读 · 0 评论 -
简单顺序表 C语言实现
顺序表是以数组为存储结构的线性表。由于数组中各元素的地址是可计算的,所以查找定位操作 有很高的执行效率。但是这种顺序存储结构的缺点也相当明显,要获得连续的内存空间就必须一次性申请,而在程序执行之前往往无法精确得到所需空间的大小。这时通常先确定一个合适的数组长度,如果后来空间不够,再重新申请一个更大的空间并把原先空间的数据转移过来。可以预见到,如果数据庞大的话,这个转移操作是相当耗费资源的。所以顺序原创 2007-09-12 20:22:00 · 1623 阅读 · 0 评论 -
可变长度 顺序表 C++实现
简单顺序表 C语言实现 的C++改进版 实现顺序表长度自动增加顺序表是以数组为存储结构的线性表。由于数组中各元素的地址是可计算的,所以查找定位操作 有很高的执行效率。但是这种顺序存储结构的缺点也相当明显,要获得连续的内存空间就必须一次性申请,而在程序执行之前往往无法精确得到所需空间的大小。这时通常先确定一个合适的数组长度,如果后来空间不够,再重新申请一个更大的空间并把原先空间的数据转移过来。原创 2007-09-20 12:07:00 · 2831 阅读 · 0 评论 -
二叉树 遍历 算法总结
二叉树的遍历可以大致分为递归遍历和层序遍历。递归遍历依次遍历左子树和右子树,递归遍历时,每个节点会经过三次。按照访问节点时机的的不同,分为先序,中序和后序遍历。先序遍历:1.访问根节点2.先序遍历左子树3.先序遍历右子树//二叉树定义 本例代码为类C伪码 不能直接运行typedef struct BiTree { DataType Data; //定义数据域 struct BiTree *L原创 2007-11-06 23:04:00 · 3158 阅读 · 1 评论 -
_declspec 缩写的英文含义
今天在看C++中的Dll调用时(Dll中被调用函数前要加“_declspec(dllexport)” 主程序调用外部的函数前需加声明 “_declspec(dllimport)”),搞不明白 这个declspec到底是什么的缩写到网上查了下,也没有查到。我疑似是declaration spec (声明说明)的缩写,如果不对,还请大虾们指正谢谢原创 2008-03-13 20:01:00 · 4731 阅读 · 4 评论 -
讨厌的匈牙利表示法
习惯了C#和Java中的命名方法,现在要用匈牙利表示法,觉得很别扭。匈牙利表示法以变量类型的缩写为前缀,后面是头字母大写的变量描述。 不知道老程序员们为什么如此热衷于此道,这简直是火星语。匈牙利记号表示法前缀 前 缀原创 2008-03-14 14:09:00 · 1039 阅读 · 0 评论 -
尴尬的goto语句
以前看过的effect xxx之类的书,总是会少不了这一条:避免使用goto语句理由很简单,你一段代码一会跳这里,一会跳那里,跳来跳去就晕了,犹如在迷宫之中看起来是很有道理,但是在实际运用中,不大会有人这么乱跳有些情况下,goto反而是一种更加优雅的方式。比如: 1.多重循环跳出循环用break,如果跳出多重循环呢?这种例子屡见不鲜,大家也都有自己的应对方式:标志变量。原创 2010-03-26 21:47:00 · 1238 阅读 · 0 评论