- 博客(29)
- 资源 (2)
- 收藏
- 关注
原创 添加辅助代码
<br />相信大家在写代码的时候会发现,有时候我们需要往代码里面添加部分的辅助代码以帮助我们调试,但是在开发完成之后,有一部分的辅助代码将不会被编译到产品代码中。但是又需要将辅助代码和程序代码区分开来。传统情况下,会定义一个宏,在每次添加辅助代码的地方都会判断是否需要编译进去。但是这样子让程序看起来比较繁冗。而使用宏函数则能避免这种情况。<br />下面是一段示例程序,将帮助你理解:<br /> <br />#define DEBUG<br />//session 1:如果定义了DEBUG,则可以将函数宏
2010-12-31 23:08:00
1165
原创 c 判断变量是有符号数还是无符号数-判断标识符是有符号还是无符号
判断一个变量是有符号数还是无符号数,问题的本质是考察变量的类型,而不是数本身。相信大部分程序员知道有符号数和无符号数的区别在于最高位的作用,所以问题的突破口也是在最高位的判断上。但是变量存储的只是一串01,最后的解释在于编译器,所以需要依靠编译器来完成判断。即将最高位置0或1,变量的值都应该大于0。那么变量原来的类型必是无符号的。下面是一段示例程序,将帮助你理解:#include "stdio.h"//session 1: 判断变量是有符号还是无符号//主要判断依据为,根据编译器自身的解释原理来判断//无符
2010-12-09 22:34:00
2131
原创 c realloc实现动态增长内存块
<br />相信大部分程序员关于动态内存分配都比较熟悉,而动态增长内存可以实现更为便捷的内存管理。在c中realloc则可以实现这种想法。<br /> <br />以下是一段示例程序,将帮助你理解:<br />#include "stdio.h"<br />#include "malloc.h"<br />int current_element = 0;<br />int total_element = 2;<br />//session 1:动态分配内存<br />char *dynamic = (cha
2010-12-03 12:02:00
1379
1
原创 c 向函数传递多维数组
<br />c中对多维数组的支持并不是特别的完美,导致了许多的操作对于新手来说晦涩难懂。当然如果只是从语法本身出发考虑是很难理解为什么需要这么做的,但是从编译器的角度出发恰好可以获取意想不到的效果。这起决于编译也需要一定的条件才能判断,而这个条件往往就是为什么这样子可以的原因。<br /> <br />向函数传递数组,相信会记起一条规则“数组名会被改写成一个指针参数”。但是这个规则并不是递归定义的。也就是说在一维数组时,数组名确实被改写成了指针参数。但是数组的数组则会被改写成“数组的指针”,而不是“指针的指
2010-12-03 10:26:00
3857
原创 c 数组和指针在函数参数中的转换
<br />相信刚接触c的人会认为,指针和数组是互换,但是很明显不是这样子的。之前曾经详细的罗列了数组和指针的区别。这里就不再详述了。<br /> <br />以下是一段示例程序,将帮助你理解数组在传递到函数参数中时发生的变化:<br /> <br />#include "stdio.h"<br />char g_a[] = "abcdefghi";<br />//session 1:参数使用数组<br />//由于编译器都会将形参中的数组转换成指针,所以打印出的地址是形参指针的地址<br />//其实也就
2010-12-02 23:13:00
988
原创 段错误
<br />相信大多数在vc下的程序员不会对segmentation error太熟悉,因为vc下并没有给出具体的错误信息,只是在运行中给出提示框“程序.exe遇到问题需要关闭”。而且在编译过程中也没有给出任何的error和warning,相信vc在这方面稍微要薄弱一点。<br />庆幸在gcc则会给出具体的segmentation error。<br />其实通常的段错误都是由于解除引用一个未初始化或非法值的指针引起的。<br /> <br />下面是一段示例程序,将帮助你理解:<br /> <br />
2010-11-28 17:41:00
558
原创 c 总线错误
可能使用vc的程序员对这个错误比较陌生,因为vc并不提示总线错误,而是直接得出程序.exe遇到问题需要关闭的提示框。简单的从这个层面说,并没有提供太多有用的信息。但是如果使用gcc的程序员可能就不会陌生了,因为总会提示bus error。事实上,总线错误几乎都是由于未对齐的读或写引起的。它之所以称为总线错误,是因为出现未对齐的内存访问请求时,被堵塞的组件就是地址总线。对齐的意思就是数据项只能存储在地址是数据项大小的整倍数的内存位置上。现代的计算机架构中,尤其是RISC架构,都需要字对齐,因为与任意的对齐有关
2010-11-28 17:08:00
2316
原创 计算程序运行时间
<br />在长时间计算程序运行时间时,可以使用clock函数。clock比较通用,精度并不是特别的高,大约是10ms。但是对于长时间的计算的话,还是可以使用的。<br /> <br />以下是一段示例程序,将帮助你理解:<br /> <br />#include "stdio.h"<br />#include "memory.h"<br />#include "time.h"<br />#define SIZE (65535)<br />//使用两种方法进行内存copy<br />//session 1:
2010-11-28 15:56:00
527
原创 c setjmp 和 longjmp
<br />相信大家对goto不会太陌生,但是恐怕setjmp和longjmp就不是很熟悉了。<br /> <br />以下是一段示例程序,将帮助你理解:<br /> <br />#include "setjmp.h"<br /><br />//声明一个记录变量<br />jmp_buf buf;<br />void Banana(){<br /> printf("in banana()/n");<br /> //session 2:使用longjmp实现跳转回到buf记录的位置.且返回1<br /> lo
2010-11-20 22:55:00
698
原创 c 输出地址格式符%p
<br />c语言中,有常用的几种格式符,%o输出八进制,%d输出十进制,%x输出十六进制,%f输出浮点型数据,%c输出单个字符,%s输出字符串,%l输出长整型。但是也有稍微不是很常用的格式符,%p就是其中之一。相信大家在日常中使用得比较少,其实它的输出格式也是六进制,跟%x的区别在于,%p输出的长度是一致的8位16进制符(即32位2进制符)。<br /> <br />以下是一段示例程序,将帮助你理解%p的简单用法:<br /> <br />#include "stdio.h"<br /><br />int
2010-11-20 21:40:00
15799
1
原创 c 数组和指针的区别
数组和指针,相信大部分人会认为这是基本上相同的东西,可以互相交换使用。假如你有这种思想,那将为你后续的bug埋下伏笔。数组和指针的区别在多文件,extern外部变量时表达得淋漓尽致,只要不是类型一一对应的,都将会出错。假如运行直接内存错误挂掉了,你将庆幸问题暴露出来了。假如你使用的是下文所指的第三种第四种情况,那就没有那么庆幸了。bug已经悄悄的在你身边不定时的准备爆发了。以下是一段示例程序,将帮助你理解:a.cpp//声明变量int xx[100];int *x = xx;int y[100];int a
2010-11-19 00:44:00
970
原创 typedef和define的区别
<br />大家在初次的学习的时候,可能对typedef和define的区别认识不是很透彻。大部分人会认为这是两个功能很接近的语法<br />但是它们之间存在一定的差别,下面的例子有助于你的理解<br /> <br />以下是一段示例程序,将帮助你的理解:<br /> <br /> #include "stdio.h"<br />//session 1:<br />typedef int banana;<br />#define peach int<br /><br />//session 2:<br />
2010-11-18 21:36:00
605
原创 c 结构体直接赋值
<br />通过对C语言的学习,相信大家都知道结构体能够直接赋值,但是如果结构体内部是数组,那情况又会如何呢?<br />结果是,还是能够直接赋值,且是深拷贝,就像是C++实现的=重载一样的效果。<br /> <br />以下是一段示例程序,将帮助你理解:<br /> <br />#include "stdio.h"<br />struct s_array{<br /> int a[100];<br />};<br />//session 1:结构体能够作为一个对象返回<br />struct s_arra
2010-11-18 20:36:00
3542
原创 结构体中位段用法
<br />在结构体中允许存在位段、无名位段以及字对齐所需的填充字段。但是位段的用法,本身就具有一定的限制性,并不是简单的分配,期间还需要考虑到字对齐。系统默认的字对齐是4字节字对齐。<br /> <br />以下的一段示例代码,将帮助你理解位段的用法:<br /> <br />#include "stdio.h"<br />//session 1:结构体内部进行位段分配,但是只是分配一个字用于字段分配<br />//大小为8个字节,4字节对齐<br />struct pid_tag_small{<br /
2010-11-18 12:05:00
2564
原创 c 优先级的问题举例
<br />关于C语言的优先级问题是比较混乱的,C语言本身关于某些优先级的设置是存在一定的问题的。<br />单靠语言本身去区分优先级,不是一种好的策略。下面关于space举一个例子。<br /> <br />以下是一段示例程序,可以帮助你的理解:<br /> <br />#include "stdio.h"<br />int main(int argc, char* argv[])<br />{<br /> printf("Hello World!/n");<br /> //maximal munch s
2010-11-17 21:56:00
639
原创 fall through switch的用法
switch 在其合适的case中开始运行,一直到遇到break或者跳出switch。那么如果你的case中没有break,那就会出现所谓的fall through现象,就像是滑滑梯一样。以下是一段示例程序,有助于你理解fall through:#include "stdio.h"int main(int argc, char* argv[]){ printf("Hello World!/n"); int num_of_operands = 2; //fall through 的设计可以把代码设计得很简约,
2010-11-17 20:38:00
2943
原创 ANSI C 自动将相邻的字符串常量合并埋下的BUG
<br />ANSI C 自动将相邻的字符串合并起来,但是这也给程序埋下了晦涩的bug,假如在你遗漏了“,”(逗号)的时候,这将是地狱开门的时候。<br /> <br />以下是一段示例程序,将有助于你理解这个bug的伏笔<br /> <br />#include "stdio.h"<br />int main(int argc, char* argv[])<br />{<br /> printf("Hello World!/n");<br /> //session 1:输出毗邻的三个常量字符串,ANSI
2010-11-17 20:35:00
1740
1
原创 switch带来的麻烦
<br />switch的使用确实使代码清晰很多,特别是在多种case的情况下,但是switch语法的宽松也带来了一些麻烦。<br />以下是一段示例程序,switch带来的麻烦。<br /> <br />#include "stdio.h"<br />int main(int argc, char* argv[])<br />{<br /> printf("Hello World!/n");<br /> int i = 1;<br /> //session 1:以下这个switch语句是正确的,编译通过<
2010-11-17 20:30:00
1461
原创 sizeof 计算出数组的长度
<br />通过sizeof可以计算出类型的长度,同样也可以计算出数组的长度,但是这具有一定的局限性。<br /> <br />以下是一段示例代码:<br />#include "stdio.h"<br />void Count_array_element_ptr(int *p){<br /> printf("%d/n",sizeof(p)/sizeof(p[0]));<br /> return ;<br />}<br />void Count_array_element_array(int array[]
2010-11-17 16:55:00
1197
原创 const 基本用法
<br />关于const的用法,相信刚开始学习的时候总会有点糊涂,但是经过深入的学习和理解之后const的用法其实很简单。const是一个修饰符,所修饰的变量初始化之后就不允许第二次赋值修改。但是const指针的用法相信就会很让人糊涂。<br />以下是一段示例代码,相信认真查阅之后会对你的理解有更深入的帮助。<br /> <br />#include "stdio.h"<br />#include "malloc.h"<br />int main(int argc, char* argv[])<br /
2010-11-17 16:02:00
699
原创 c 输出格林治时间和当前时间
<br />当我们使用ctime输出本地当前时间的时候,不知不觉却对后面的输出结果产生了影响。即使后面你再使用asctime(gmtime(time_t *))去输出格林治时间,得到的结果仍为本地当前时间。<br />正确的做法是,先输出格林治时间,再输出本地当前时间。(假设需要同时输出当前两个结果时)<br /> <br />以下是示例代码:<br />#include "stdio.h"<br />#include "time.h"<br />#include "malloc.h"<br />#incl
2010-11-17 11:20:00
2263
原创 mm和mil的转化
<br />开始试用protel的时候,对于mil的使用感觉有点不方便,总是转化成mm来使用。<br /> <br />1mil = 0.0254mm = 25.4um<br />1mm = 39.3701mil<br />1inch = 1000mil = 25.4mm
2010-11-10 11:01:00
2582
原创 0402/0603/0805/1206封装尺寸
<br />0805封装尺寸/0402封装尺寸/0603封装尺寸/1206封装尺寸<br />封装尺寸与功率关系: <br /> 0201 1/20W <br /> 0402 1/16W <br /> 0603 1/10W <br /> 0805 1/8W <br /> 1206 1/4W <br />封装尺寸与封装的对应关系<br /> 0402=1.0mmx0.5mm <br /> 0603=1.6mmx0.8mm <br /> 0805=2.0mmx1.2mm <br />
2010-10-17 11:14:00
8510
原创 0元素数组
<br />#include <stdio.h><br />#include <string.h><br />#include <stdlib.h><br />struct aa{ <br /> int a;<br /> int b;<br />};<br /><br />struct bb{ <br /> struct aa test[0];<br />};<br />int main(void)<br />{<br /> struct bb *p=(struct bb*)mall
2010-08-29 15:56:00
1064
原创 IAR 430 头文件中#define定义的部分解释
<br />今天在阅读RF_Example_Code_v1.0中头文件cc430x613x.h时发现了几部分的疑问。<br />首先来看一下cc430x613x.h 中的3个#define的例子:<br />#define DEFC(name, address) __no_init volatile unsigned char name @ address;<br /><br />#define DEFW(name, address) __no_init volatile unsigned short na
2010-07-22 15:20:00
3807
1
原创 IAR 430 头文件中#define定义的部分解释
<br />今天在阅读RF_Example_Code_v1.0中头文件cc430x613x.h时发现了几部分的疑问。<br />首先来看一下cc430x613x.h 中的3个#define的例子:<br />#define DEFC(name, address) __no_init volatile unsigned char name @ address;<br /><br />#define DEFW(name, address) __no_init volatile unsigned short na
2010-07-22 15:20:00
1671
2
转载 #define的部分用法:通过#define连接字符串
<br />最近看com相关的资料,看到CCmdTarget实现com接口的时候,去读了一些宏的定义,在afxdisp.h头文件中 <br />#define BEGIN_INTERFACE_PART(localClass, baseClass) /<br />class X##localClass : public baseClass / <br />本来这个宏定义很容易理解的,但是这里多出个X##,我真没见过这种用法,不晓得它是什么用意。<br />后来问了几个朋友也都不知道。 <br />你知道么?
2010-07-21 23:54:00
11247
原创 就从这里开始
其实之前开了好多个blog,只是随着时间,总是慢慢的就丢出了我的生活。最近感觉看的书开始多,心情或许有点些许的压抑。还是找一个blog作为想法暂时实现的地方吧。呵呵;其实像我这样子还是只是个小孩子,啥都不懂,本来是不应该有貌似这么多的想法的,但是貌似生活来得有点突然,让我对生活的认识有了另一番的看法。经过了今年两次的波折之后,对于生活,貌似又懂多了一点点。这是好事,呵呵;于是慢慢的开始了自己
2009-11-12 13:29:00
385
转载 四线电阻式触摸屏
四线电阻式触摸屏 四线电阻式触摸屏的结构如图1,在玻璃或丙烯酸基板上覆盖有两层透平,均匀导电的ITO层,分别做为X电极和Y电极,它们之间由均匀排列的透明格点分开绝缘。其中下层的ITO与玻璃基板附着,上层的ITO附着在PET薄膜上。X电极和Y电极的正负端由“导电条”(图中黑色条形部分)分别从两端引出,且X电极和Y电极导电条的位置相互垂直。引出端X-,X+,Y-,Y+一共四条线,这就
2009-11-12 13:06:00
3751
高质量c++编程 林锐
2010-04-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人