c++|2011-2012工作总结

**********************************************************************************
*工具*
**********************************************************************************
1,飞秋:/nic IP
2,vc 6.0的spy++获取窗口句柄
3,版本控制工具:svn
·注意:
用了其他地方的东东的时候,要自己再提交上去,否则,别人是更新不下来的。
(隐形错误!!)
4,vs2008:
1,。def文件:导出接口,然后才会产生lib文件。
导出函数前,加了extern ”C",因为不加的话,编译器会修改它(c++下面哦!)。
加了的话,c也可以用啦。。
还有需要注意的是,删除def后,要把工程属性的input的def也要删除。
2,在工程名上,右键,选中view class diagram,,可以看到类图。。不错。。
3,tools的attach to process这个工具,可以运行时,调试。
注:
在任务管理器中的名字:devenv
5,Notepad++
6,dependency:查看动态库link的函数有木有都连接到。
右上角的 两块(从上到下):该dll用到选中的dll的那些函数,米有的就是红色;
下方是,选中的dll中有哪些函数。
7,灵格斯翻译专家;
8,谷歌浏览器;
9,谷歌的桌面书签
10,飞鸽绑定网关的格式:/nic 192.168.13.142
11,126邮箱,设置一下自动保存,否则发送邮件大于1M的,就不会保存下来。


**********************************************************************************
*NET××××*
**********************************************************************************
1,RTSP
0,RTSP简单地说就是对从Intel上下载的数据进行控制播放;
RTSP是在RTP之上的协议,使用TCP和RTP完成数据传输;
实现RTSP的控制功能,一个是协议,还要支持协议的服务器和播放器;
1,与HTTP的区别:
HTTP传送HTML,此传送多媒体数据;
HTTP的响应是单向的,此时双向;
RTSP与万维服务器的区别:
支持流式播放,边下载边播放;
RTSP(控制),RTP(流)
2,RTSP的报文格式:
请求报文和响应报文。
主要是请求OPTION(有那些方法),DESCRIBE(媒体描述),
SETUP(请求会话),PLAY(请求播放)
TEARDOWN(停止)
3,RTSP和RTP的端口是挨着的。

2,模板中的设备断线和流断线的重连。
1,设备:设置定时器,定时间向设备发送请求,看设备有反应没;
2,流:设置定时器,利用时间差,(定时器中的时间是参考时间,填流片的
的时间是会因为网络而延迟。)

3,公司业务的理解:
一个抽象设备,对应几个抽象通道,一个通道对应几个用户。

4,设置回调函数的方法,把一个线程内的数据给回调出来。注意,因为是要把一个类的函数
给设置进去,所以:
要static声明;
因为,还要用此类的东东,所以,把this指针作为此static的参数。

5,extern "C"
C++中用到c写的dll,#include头文件时,
#ifdef__cplusplus
extern"C"
{
#endif
#include".."
#ifdef__cplusplus
}
#endif
主要是f(int, int)在c++中编译成f_itn_int大概这样
编译器,根据看到的原型进行相应的编译,比如,看到是c的函数声明(c++中extern”C")
,那么就按照这个声明方式进行函数的编译。

6,一个算法,将周围的小方块整理成大的方块

7,LoadLibrary();
GetProcAddr()

8,写过HostTest

9,写在组件下方的宏的作用:
我觉得:1,公开的接口,开始的就是创建host的类。
2,用内存池分配对象,不会造成内存浪费。

10,细节:
1,ltmsel是64位,dword是32位:时间的表示64位才表示的完!!
这是需要注意的细节的地方。
2,windows下应用程序分配的地址空间2-4g,linux下可能更大,所以,用atoi64

11,不要轻易全局

12,placement new:new对象有两个动作,空间+构造。
形式:·char* buff = new char[sizeof(OBJ)*N];
memset(buff, 0, sizeof(OBJ)*N);

·OBJ* pObj = new (buff)OBJ;

·必须显示调用析构函数

·delete []buff;

13,来这里工作,最开始的体会是,类的继承者,使用者,设计者的概念,从protected理解到的。

14,模板与一般函数的编译的区别:
·模板在用到的时候才实例化。所以,会造成
f.hf.cpp | main.cpp中,包含f.h但是却没有实例化。

15,设置回调函数:A要用到B中源源不断的数据。
设置回调函数。在A中,b.setCallBack。因为作用域,所以,只有
把A的static函数设置进去。同时,把A的this指针一起穿进去。。
所以,setCallBack(DWORD pThis, pCallBack fun);

16,purecall错误,,纯虚构函数,不能在基类中的构造函数和析构函数中调用。
在其他函数中是可以的。

17,#if !defined()对typedef的判断是无效的:一个是预编译一个是编译时

18,fatal error C1088: Cannot flush compiler intermediate file:'C:\DOCUME~1\ADM
c内存空间不足

19,拷贝构造函数与赋值符号重载的私有化的原因:
主要是因为,如果,不去写这两个东东的话,会位拷贝,拷贝指针就麻烦老。。
所以,偷懒呗,就直接私有化了。。呵呵。。
不过,要会怎么写这两个函数,前者简单,后者,注意要判断自赋值。

20,在往队列中增减元素的时候,用到线程锁比较多。。

21,char c;
while((c= fgetc(fp)) != EOF)
{
putchar(c);
}
1,//这里有错。
2,//错误分析:
1,如果char被编译器认为是unsignd char,那么while循环永远不成立;
2,如果,自己定义char为signed char,那么读到0xFF字符时,就会误
认为是文件尾,就会提前退出
3,//修改错误,声明c为int

22,习惯在析构函数前写,virtual

23,熟悉一个环境:
怎么进行错误检查,
assert的行为和意义
开发了什么调试的工具或者函数没
熟悉公司的打印日志的一些函数

**********************************************************************************
**
**********************************************************************************
1,异步IO
2,对rtp扩展头的处理
3,调试:OSMsgQ.h中报func参数个数不对,一层层看下去,,
4,PFUNC pp = &CInsLibrary::Func; 否则就是Compiler ErrorC3867
5,指针跟&有别

**********************************************************************************
*C++*
**********************************************************************************
1,纯虚析构函数,还是要把{}加起,因为,对象的销毁是需要父类的纯虚函数的。
否则就会在linking是出错。
2,类的头文件,没有任何分配内存,它更像一个使用说明书。这也是理解初始化例表的
关键。初始化例表是在自动分配内存之前。对于对象的成员变量,这点非常重要。
3,模板中的析构函数都是virtual,delete时的自动化;
4,c++在设计函数时,是基于重载的考虑,所以编译出来跟c有所不同。这也是extern “C"的意义。
5,{
CNPLOCKlock;//利用局部对象自动销毁。
。。。
}
6,static属于类的,在单件构造中,static函数只能访问米有this的成员函数和变量;
static成员,在外面初始化。

工作习惯总结:
0,工作框架:
1,每日文件夹:文档,时间记录,图片,资料;
2,收集程序的codelib;
3,有个自己的tst工程。
1,自己的东西提交完整,什么是完整,就是别人用我提交的东西,可以编译运行。
注意:1,库所要的要提交完整;
2,要用自己的svn(虽然看到是提交了状态,但是是别个人的。这个很容易忽略)
3,depends和ldd来查看需要哪些库。
4,保持清醒,直到自己的组件是要哪些库的,表含糊。
2,工作要问对人,善于问,提前想好问题。
3,听清楚别人说的是什么?确认。
4,养成复习昨天代码的习惯;
5,养成计划一周,特别是周五和周六,要细致才有效果。
6,传达消息的时候,用明显的符号区分,表空格
7,对于别人的请求,首先是自己去查看是个什么意思。
|
V
向有关负责人反映此请求
|
V
最后才是去处理此请求。
8,适应每次变化,也要注意变化会带来什么变化。onvifreceiver.h头文件没有提交
9,磨刀很多时候不费砍柴功。。。(至少在自己这一级别上来说)
10,z_主题公园
11,一个草稿文件,专门记载代办事项。

mfc随笔:
1,a,//{{afx_data------------------ (.h文件中声明)
b,//{{afx_data_init----------------- (构造函数中初始化)
c,//{{afx_data_map-------------- (DoDataExchange中变量与控件关联)


线程随笔:
1,critical section;event; semaphore;

设计模式随笔:
1,弄过单件构造模式,


编程习惯一二:
1,类的函数的实现,把默认的传参也靠过来,因为编译器不允许这样,然后再注释掉。
2,结构体清零的重要性.
3,一个指向派生类的基类指针,当调用只有派生类的函数时,要强制转换。。
4,sock初始化为invalid_socket(-1),初始化为-1。不是0哈,,
5,打印调试信息#ifdef DEBUG #endif
6,#defineOUT这样的字眼,是程序可读性强
7,断言的认识。
断言的行为,会暂时中断程序执行,用户可以选择“继续”,“终止”,“重试”。
程序中断言编程,在断言的后面,一定要越过异常条件。eg:
ASSERT(p!=NULL);
if(p!=NULL)//这句就是我说的要跳过异常条件
{
}
8,在调试的地方,写好///111这样的标识,,好删除。
9,if for while else if与()之间有一个空格
10,
一个真实的故事:
在SunOScar 4.0.3下,打印程序/usr/ucb/lpr有时会产生一条错误信息,表示“内存不足”,拒绝打印任务。
最后确定下来,是一个Interpositioning导致了这个错误。

bug具体:
程序员写了一个函数mktemp(,,),而库中有这个函数mktemp()。而,getwd()调用mktemp,就调用
到需要传三个参数的那个函数。这时,把一个参数压入栈(因为只有一个参数)。但是,提取的时候却三
个参数。当然是垃圾了哦!根据垃圾内容的不同,有时会以“内存不足”提示。

解决方案:
不要让程序中的任何符号成为全局的,除非友谊吧他们作为程序的接口。
所以要声明为static。

******************************************************************************
编程规范:
1,int* p; int& r;
禁止一行定义指针,普通变量和引用变量。
2,接口的使用说明在.h文件中书写;
接口的实现原理在.cpp文件中书写。
3,对于较难理解的地方加适量说明。

沟通技巧:
1,特别怀疑别人没加载上自己的组件的话,就在程序的一开始部分,打印自己的信息。

**********************************************************************************
*快 捷 键*
**********************************************************************************
快捷键总结:
ctrl+>
shift+上
alt+f8
f3
alt+f4
w+e
w+d
w+f


感悟:
c++自动化;
extern和static的感想
回调:
**********************************************************************************
*知识源*
**********************************************************************************
知识源:
1,新浪下载;
2,整理URL;
3,CSDN;
4,开源中国。


**********************************************************************************
*学习习惯*
**********************************************************************************
学习感悟:
1,没有文档的规范不是很好的东东,最好表去。。
2,对于不熟悉的东东,还是要结合程序,如果是光板的,不是非不得已,
不碰他。否则浪费时间。
3,现象是什么?
解释是什么?
支撑这个解释的理由是什么?
例子是什么?
4,思考为什么不懂
5,怎么看本好书:
·技术产生的背景是什么;
·这个技术怎么用;
·用在什么情况下(多半是背景,也可能可以解决更多的问题)
·需注意些什么
6,
学习使用一个东西的需求:(比如socket)
1.Socket的机制是什么?

2.用C/C++写Socket需要什么头文件、库文件、DLL,它们可以由谁提供,安装后一般处于系统的哪个文件夹内?

3.编写Socket程序需要的编程基础是什么?

4.Socket库内最重要的几个函数和数据类型是什么?

5.两个最简单的例子程序;

6.一个贴近应用的稍微复杂的Socket应用程序。

**********************************************************************************
*素材*
**********************************************************************************
1,windows中\n\r
unix\n
mac\r

2,a.out的来历:PDP-7(一种语言)不存在链接器,编译器把源文件连接,编译,把汇编语言
输出到a.out中。
但是现在多了个链接器,所以,因为历史的原因吧,虽然是链接器生成了这个文件,但仍然
叫做a.out。

3,

**********************************************************************************
*杂记*
**********************************************************************************
杂记:
1,有时候就是很怪,一方面,不要过了,一方面,就要过了。
矛盾,才能平衡生活。
就像骑自行车,整个过程,一直都是在左过了,纠正,右过了,纠正,,,
只是这些动作太自然,以至于忽略了这确实是平衡
,而对象是矛盾。
2,纪伯伦:我们已经走的太远,以至于我们忘记了为什么而出发
3,虽然不晓得会确定发生什么,但是可以比较确定的会发生的程度和时间(推迟决定)
4,指导性的书虽好,但如果你连需要发酵的葡萄都没有准备,怎么可以两成一瓶好酒呢?

**********************************************************************************
*DEBUG库*
**********************************************************************************
1,动态库相关错误:
最常见的是,目录下放有两个相同组件。。衰,,

2,·现象:
mtest.obj:errorLNK2001:unresolved external symbol __imp__htonl@4
·原因:
缺少库
·解决方法:
#pragmacomment(lib,"ws2_32.lib ")
或者
project--setting--link--library/module加入:ws2_32.lib

3,在默认参数时,A::A(int i, int j = 1)那么初始化时,一个也可以。

4,怎么分析断言:见codelib的同名。问题出在,第一行,下面的函数栈调用。特别是(126)
表示,断言在126行。

5,在公司中,传地址,用%u传过去,用%p传会有问题。

**********************************************************************************
*零碎的知识*
**********************************************************************************
0,
pascal从左到右系统
cdecl从右到左调用者(主要用于变长参数)
stdcall从右到左系统

1,static
static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝.

2, double为8

3, malloc一类的考题记得,释放空间

4, 用两个栈实现一个队列的功能?我没考虑到的是,判断专门弹出栈顶的那个栈是否为空。

5, 频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现? c用宏定义,c++用inline

6, 网络字节序是:大端法(主要考察htonl)

7, 用什么函数开启新进程、线程

*8,Pb是一个局部指针在函数返回的时候就被释放掉了,但是其申请的空间还在,所以会出现内存泄漏。
(自己忘了考虑内存泄露这块了)

1,c中定义的int等,是至少多少位,

2,什么是实模式,保护模式:
事实上,实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,系统程序和
用户程序并没有区别对待,而且每一个指针都是指向实际的物理地址。这样一来,用户程序的
一个指针如果指向了系统程序区域或其他用户程序区域,并修改了内容,那么对于这个被修改
的系统程序或用户程序,其后果就很可能是灾难性的。再者,随着软件的发展,1M的寻址空间
已经远远不能满足实际的需求了。最后,对处理器多任务支持需求也日益紧迫,所有这些都促
使新技术的出现。
为了克服实模式下的内存非法访问问题,并满足飞速发展的内存寻址和多任务需求,处理器厂
商开发出保护模式。在保护模式中,除了内存寻址空间大大提高;提供了硬件对多任务的支持;
物理内存地址也不能直接被程序访问,程序内部的地址(虚拟地址)要由操作系统转化为物理地
址去访问,程序对此一无所知。至此,进程(程序的运行态)有了严格的边界,任何其他进程根
本没有办法访问不属于自己的物理内存区域,甚至在自己的虚拟地址范围内也不是可以任意访
问的,因为有一些虚拟区域已经被放进一些公共系统运行库。这些区域也不能随便修改,若修
改就会有出现linux中的段错误,或Windows中的非法内存访问对话框。


*********************************************************************
*c-FAQ*
*********************************************************************

1,externint i; (这里的extern可以省略,这也是看程序会造成歧义的地方):“看”是我们在看哦。。

2,全局变量怎么放
1,专门一个.c文件放定义;
2,专门一个.h文件放extern声明;(可以不加extern表示是全局变量的引用,但是程序时给程序员看的哦!!)
注:切勿在.c文件中放函数的原型。如果函数变了的话,很容易忘掉修改原型。所以放在一个统一的地方,方便管理

3,file1.c:|file2.c:

intarray[] = {1, 2, 3}; |extern int array[];
描述:file2.c中的sizeof(array)失去效果,(造成编译错误)。
原因:sizeof是编译时起作用,而编译期间,这里的array还只是个符号。
解决方案:

1,在定义的地方把数组的长度给计算出来。
file1.c:|file2.c:

intarray[] = {1, 2, 3}; |extern int array[];
intarraysz = sizeof(array); |extern int arraysz;

2,在.h文件中预编译显示的写出来
file1.h:

#defineARRAYSZ 3
externint array[ARRAYSZ];

file1.c:|file2.c:

#include"file1.h"|#include "file1.h"
intarray[ARRAYSZ]; |

3,在数组的最后设置一个“哨兵”
file1.c:|file2.c:

intarray[] = {1, 2, 3, -1}; |extern int array[];

4,那么.h文件中应该放什么呢?为什么呢?
macrodefinition;
struct,union,and enumration的声明;
typedefdeclaration;
externalfunc declaration;
globalvariable declaration.

5,在c中的私有。就把声明或者定义放在那个.c文件中。

6,当你觉得源文件实在太多了,想重新整理文件的时候,可以按照,把static变量和static函数以及共享
他们提供的接口的放在一个文件中。

7,typedef 与 #define 的区别:工作经验。

8,typedef进阶:
描述:
#definex int *|typedef int * x;
constx y; |const x y;
区别:
y所指向的字符串被限定|y本身被限定。
理解:
这是typedef与#define的有一区别。
可以这样理解typedef,在编译时,才识别x。所以,用x去定义y。之后再用const去限制y。

9,描述:
constint n = 5; int a[n];
错误。
原因:
n要在运行时才能知道。

10,计算结构中域的位偏移
#definesetof(type, f) ((size_t) \
((char*)&((type*)0)->f - (char*)(type *)0))

11,枚举类型的一个优点是:
调试的时候可以看到字符串

*********************************************************************
*一些机器表达式*
*********************************************************************
1,交换a,b
a^= b ^= a ^= b;

*********************************************************************
*杂记*
*********************************************************************
1,看了c的一些工程组织,更体会c++是一个工业效率的产物。
也感觉makefile


*********************************************************************
*进阶*
*********************************************************************
1,操作系统
2,编译原理
3,算法
4,数据库


*********************************************************************
*目录*
*********************************************************************

*********************************************************************
*一些数据*
*********************************************************************


*********************************************************************
*多线程*
*********************************************************************
1,Handle1 = CreateThread(NULL,0, ATM_1, NULL, 0, &ThreadID1);
Handle1是进程级的,ThreadID1是系统级的。
2,有信号:可能应该理解成,提醒下面的程序可以执行了,的意思吧。



*********************************************************************
*MY_URL*
*********************************************************************
1,算法
1,http://www.keithschwarz.com/interesting/

2,GNU:
http://www.gnu.org/prep/standards/

*********************************************************************
*业界权威*
*********************************************************************
1,在编程语言的统计,Tiobe是个权威的机构。
方式是:
每月进行评估,进行跨年度同期比较

杂记一二:
协议编程,,最主要的是,晓得要用到协议的什么命令,,然后最重要的定义结构体。。
然后,再通过网络编程,填充这些结构的成员。。

印度的大多外包公司,都不是先驱者。他们一般都会坐等编程语言市场份额的变化,然后
再以相应低廉的薪水来做出反应。
///
///
//要养成的习惯/

1,先有个方向,大致方向,立马,前进
2,尽快从愤怒中冷静下来。


【c++|2011-2012工作总结】1,每天花点时间来了解手边的工具

    推荐阅读