
C语言
文章平均质量分 87
tietao
一切,都会云淡风轻的过去。
只为,心中不变的追求。
展开
-
用异或来交换两个变量能提高速度是错误的
在进行两个变量的时候,经常会看到有些书误人子弟的推荐使用异或的方式:方式一{ x = x ^ y; y = x ^ y; x = x ^ y;}而不是采用临时变量实现交换:方式二{ int temp; temp = a; a = b; b = temp;}美其名曰:节省内存,提高运行速度。临时变量交换的方式:原创 2015-03-19 21:00:35 · 2696 阅读 · 0 评论 -
关于MCU使用操作系统的一点看法(续)
因为在连接时,全局变量和局部静态变量都是在data区,所以在这里给放一起讨论了。在原文中自己的表述犯了一个错误,就是初始化的全局变量或者局部静态变量,是占用生成的可执行文件大小。而未初始化的全局变量和局部静态变量,不占实际文件大小,但是在执行时是分配RAM空间的。这一点,是原来写博文的时候,弄混淆的一点。所以对于RAM而言,局部静态变量和全局变量消耗是一样的。所以,就像你在回复中说的,预约了全局变原创 2013-12-23 21:46:08 · 4429 阅读 · 0 评论 -
《重构》——如何如何改善代码
代码的坏味道:1、重复代码;2、过长函数;3、过大的类(C中可说过大的结构体);4、过长参数列表;5、发散式变化;6、依恋情结;7、霰弹式修改;8、数据泥团;9、基本类型偏执;10、switch惊悚现身;11、冗余类;12、平行继承体系;13、夸夸其谈未来性;14、过度耦合的消息链;15、令人迷惑的暂时字段;16、异曲同工的类;1原创 2013-12-03 07:56:47 · 4136 阅读 · 0 评论 -
关于可靠编写代码的一些记录
做到代码的静态检查,代码版本的控制。慢慢使用MISRA2004+相应的文档规范,保证新代码的质量与版本控制。如何做到文档与代码同步呢?必须先整理出文档,然后再修改?这或许是,唯一能够保证文档代码同步的方式。如果写完代码后再来整理文档,不说能否记得已经修改的要点,如果还有其他事情要做,可能就会把文档的事情,给放在不知道哪里了。对于在单片原创 2013-11-28 23:12:40 · 1060 阅读 · 0 评论 -
合适使用结构体
在设计结构体时,千万不要再结构体内部定义数组,因为这会阻碍其应用,对于如果要使用的地方,数据元素个数小于定义的数组长度,有些浪费。对于数据元素个数大于定义的数组长度,又显得不够。最合适的办法是,在结构体中,定义一个指针,之后根据具体需要再定义一个数组,使用这个数组初始化结构体中的指针。这样,就可以根据需要自行选择合适大小的数组来使用。尤其在嵌入式原创 2013-11-28 22:58:52 · 1193 阅读 · 0 评论 -
关于字符串的内存地址
看到一篇博客,给出了下面一道关于C内存的笔试题:char*getmemory(void){char p[]="hello world";return p;}void test(void){char *str=null;str=getmemory();printf(str);}请运行test()函数,会有什么样的结果?看完第一反应是输出"hello原创 2013-11-28 23:09:15 · 4010 阅读 · 2 评论 -
开发工具带来的进度影响
前几天,在以前的一个修改了一些电路的板子上编写一段新的代码的时候,发现以前正常运行的一段程序,竟然不能正常运行了。现象很像程序死掉了,卡在某处没有运行。但是,在以前的没有修改过的板子上运行一切正常。于是检查了板子上修改的部分,发现并没有哪些地方会影响到单片机的正常工作,甚至于让单片机死机。而外部电路的修改,也并没有太多。实际测量发现,之前单片机IO口为高电平,板子修改后成为了低原创 2013-09-21 10:55:43 · 1147 阅读 · 0 评论 -
关于C,看过的一些书
忘了名字的书,《C语言程序设计》(老谭版)《高质量程序设计》《C陷阱与缺陷》《C专家编程》《程序员成长计划》《UNIX环境高级编程》《深入理解计算机系统》《代码大全》《编程精粹》《重构》(在读)按照自己的阅读顺序罗列了以上书籍,基本都全部看完的(重构是正在看,已经看了三分之一)。第零本,忘记名字的书,当时就是按照书中的代码,敲到V原创 2013-08-21 00:00:38 · 10290 阅读 · 9 评论 -
《编程精粹》思之代码与产品
之前眼中有代码无产品,现在眼中有产品有代码,什么时候能做到有产品无代码?还需要努力。刚开始实习的时候,总喜欢在程序中使用*(p+1) =而不是p[1]来给入参,甚至于用来给定义的数组赋值。而且只要是能使用指针的地方,尽量换做指针操作。总以为这样,代码的执行效率高。(不知道怎么记得,指针访问比数组访问效率高,执行速度会稍微快一些。但是实际上指针的访问,需要比数组的访问多额外的步骤)还乐此不...原创 2013-08-06 22:27:05 · 2259 阅读 · 3 评论 -
《代码大全》笔记
最近将去年毕业时,大神推荐的《代码大全》看完了(已经过去一年了,要十分感谢推荐,还有凤林兄的《深入理解计算机系统》)。零零碎碎的时间,发现很多东西虽然在书中标记了,但是再去翻看时,还是有很多已经模糊的地方。想来,还是需要留个笔记,供以后看看。关于《代码大全》,每章后边的CheckList都需要好好分析与思考,并能实际运用。第六章提出抽象数据类型,是进行模原创 2013-08-06 22:24:24 · 4802 阅读 · 0 评论 -
进程间通信——信号量、互斥锁等的异同
进程间通信——信号量、互斥锁等的异同最早接触在系统上编程,是在嵌入式Linux上完成几项功能。当时就是按照写单片机程序的思维写的。实现几个功能,就用了一个进程,单线程来做。后来实习时,接触Linux下多进程,多线程的编程。了解到多个线程之间的操作需要进行同步,互斥等。在工作后,有进行了uCOS的多任务编程。发现uCOS中的多任务的同步,互斥与Linux下有很多相似性。但原创 2014-01-14 23:39:07 · 11693 阅读 · 0 评论 -
单片机串口设置的问题
最近测试涉及到底层串口代码的修改。经过这次修改,突然发现其实自己对于串口的一些特性以前并不是十分清楚。首先遇到的一些问题:1)在使用IO的数据位的时候,没有考虑校验位所占的位数。2)在设置串口输入的时候,使用悬空输入。关于1),在一次使用STM32串口参数9600,N,8,1与另一个 8051MCU通信的时候发现偶校验没有问题,但是无校验通信就出现异常。但是,当将STM32原创 2014-03-11 23:44:38 · 5647 阅读 · 0 评论 -
使用可靠的I2C代码
现有的STM32的I2C代码,由于没有使用STM32官方推荐的DMA+I2C中断优先级最高的方式,总感觉用着不放心。想要修改,却又不知道如何改是更好地。于是想查找I2C驱动部分处理的好的代码,参照将现有I2C部分程序重构下。在查找了一些代码库文件后,比对了现有的I2C程序,发现EFM32的I2C库代码部分处理的很完备。使用的是硬件I2C+超时处理机制。而且超时处理也有适当的处理。有可能是EFM32原创 2014-05-05 23:53:25 · 2935 阅读 · 2 评论 -
C语言的面向对象编程(一)
一、前言对于编程而言,重要的是解决问题的方式,而不是语言本身。面向对象与面向过程是解决问题和思考问题的方式。C语言常说是面向过程开发的语言,因为其缺少很多对于面向对象特性的支持。但,这并不影响我们采用面向对象的方式,使用C语言编程。二、基本介绍在C语言中,采用面向对象开发,有两个地方是要明白的:1、结构体,2、函数指针变量。结构体:结构体是对于内存的一种组织原创 2014-10-08 21:52:07 · 1777 阅读 · 2 评论 -
C语言编程风格
实习了一段时间,对于C语言的书写风格,做一个小总结,为以后写代码做个标杆。1变量定义在定义变量时,前缀使用变量的类型,之后使用表现变量用途的英文单词或单词缩写,且每个单词或缩写的首字母大写,各种前缀缩写如下:无符号变量使用 u8,u16,u32;例:unsigned char u8Temp;有符号变量使用 s8,s16,s32;例:char s8Temp;浮点数变量使用原创 2012-07-03 17:49:18 · 4727 阅读 · 5 评论 -
指针理解辅助程序
在理解二级指针时,自己写了一个小程序帮助理解,运行后,看到结果感觉明白了,很多。中间红色部分,是用来帮助理解的,程序会在这里死掉,因为读取的,p_1中的地址内容为NULL,读取NULL指向的内容肯定会出错。但是这也帮助理解了,指针变量是怎么工作的:首先,指针变量是一个变量#include #include int test_1(int *原创 2012-05-08 09:59:36 · 919 阅读 · 0 评论 -
优先级引起的错误(括号还是很有用的)。
前几天自己写了一段BCD的求和函数,一次加了四个数据。结果测试时,发现结果错的一塌糊涂,分析了半个小时,最后得出的结论是这种写法有问题。但错在哪里,很真不知道。只好拆开来计算,结果就是对的。后来同事提醒说是不是括号出问题了。如梦方醒,再看下程序,发现&,>>运算和+一起运算,却没有括号改变运算顺序,这不出错也难。后来改正后,再测试和之前单个相加,也一原创 2011-11-23 12:54:53 · 2814 阅读 · 0 评论 -
关于malloc的一点理解
在函数中使用malloc,如果是大的内存分配,而且malloc与free的次数也不是特别频繁,使用malloc与free是比较合适的,但是如果内存分配比较小,而且次数特别频繁,那么使用malloc与free就有些不太合适了。因为过多的malloc与free容易造成内存碎片,致使可使用的堆内存变小。尤其是在对单片机等没有MMU的芯片编程时,慎用malloc与free。原创 2012-03-11 11:17:01 · 2207 阅读 · 0 评论 -
free函数的纠结
昨天想要将ARM9板上flash中的jpg图片显示在tft上,在改写一个函数时,使用malloc函数分配了一段内存,来存储我读取的图片内容,在显示到tft上后,调用free函数释放,结果发现总会出现segmentation fault。一直不理解原因出现在哪里,代码如下static void show_pic_jpg(void *scr){__u16 x, y, w, h, i, f;__u16 *fb_buf = (__u16 *)scr;__u32 rgb_data;__u16 *p原创 2011-03-16 09:27:00 · 957 阅读 · 0 评论 -
Hello World 记录
1 binutils toolsar build static libraystrings display the strings of the object codenm display the symbol of the object filereadelf display the struct of the object原创 2012-05-06 13:21:19 · 764 阅读 · 0 评论 -
sprintf打印%,
刚才使用sprintf打印一个%,发现竟然卡了一下。当单独输入一个%号时,打印出来的东西有问题,发现这里应该输入的是%%双半分号,细节还真是需要一点点注意了。原创 2012-06-05 11:26:55 · 2634 阅读 · 0 评论 -
《关于字符串的内存地址》纠错
在翻以前的博客的时候,发现有篇博客里边写的有问题。http://blog.youkuaiyun.com/tietao/article/details/17014119首先以前在写关于这道面试题的想法时,将里边的变量p[]当做了字符串指针来处理,而不是字符数组,所以以前的那篇博客,对于这道题本身而言,是错解。之所以出现这种原因,是将p[] = "";通常认为这种赋值方式,用于给字符串原创 2014-06-14 08:13:22 · 1279 阅读 · 0 评论 -
编程中常见错误原因
参考《代码大全》及自己编程(C)中的一些错误记录,总结编程中产生错误的一些原因1.拼写错误a) 变量名,宏名,函数名等拼写错误,在编译阶段直接报错;b) 变量名,宏名,函数名等拼写为相近的变量名,宏名,函数名等,在运行时出错;2.逻辑错误a) if语句的真值逻辑判断,没有包括全部的条件,或者包含了不需要的条件;b) 选择计原创 2013-05-11 07:55:14 · 2583 阅读 · 0 评论 -
关于单片机程序设计的几点
需要的一些:对于单片机程序,首先要对于要使用的单片机比较了解,对于硬件设计比较了解,对C编程比较熟悉;了解单片机是因为当需要设置某些寄存器的时候,会知道相应的设置方式,避免出现因为寄存器设置造成的不必要的调试时间。对硬件比较了解,因为硬件电路是程序运行的前提,如果硬件电路出现了问题,软件无论如何也跑不起来;对C比较熟悉,因为过了初始化以后主要工作就是由C来承担了;对于需要操作模块的了解原创 2013-05-11 08:11:51 · 1860 阅读 · 1 评论 -
关于Sqlite模块测试总结
在早上测试完上周五写的SQLite模块的代码后,发现主要存在以下几个错误:1、主要是在写入和读出时,不一致,造成了一开始莫名其妙的bug。而根本原因就是,在写入时,是按整数写入的,get_table读出时,默认都是字符串。而这时,自己还按整数来取返回的结果,这样读出与写入的值肯定不一样了。如此,对于被调函数的理解欠缺,是造成bug的主要原因。如此,只有知己知彼,才行。同时,也知道了,准原创 2012-08-27 19:20:47 · 953 阅读 · 0 评论 -
C语言反省之一
自己以前用结构体时,较少封装实现方法即:函数指针。这一点,造成了现在对于程序扩展起来有些捉襟见肘,这里以后要注意。同时,函数参数也尽量使用结构体,这样避免函数接口的改动。现在慢慢明白了,为什么数据结构在C语言中这么重要。一个数据结构的合适与否,影响了整个程序的框架以及以后的可扩展性。以后使用C语言的过程要慢慢总结。关于内存分配的再次理解:最近看到,关于内存分配这原创 2012-08-27 19:21:35 · 1248 阅读 · 0 评论 -
char型,有符号or无符号?
下午一个程序测试了好长时间,发现总有一个bug导致内存出错。分析到最后,发现是一个char型的变量,当将其减到小于0时,需要将其重新赋值。但问题就出现在了这里,当其小于0时,并没有进入if语句,将其打印出来,发现值是255,而不是-1。char s8temp:ARM平台下的打印信息:Line: 2Line: 1Line: 0Line: 255Line: 254PC平原创 2012-08-31 08:54:26 · 8049 阅读 · 2 评论 -
由结构体设计想到的
昨天,在和春哥讨论一个结构体的设计时,最初设计结构体的结构:typedef struct Infor{ Infor *pInfor; Time *pTime; Id *pId;};struct InforHeader{ Infor *pInfor; Time *pTime; Id原创 2012-08-30 21:44:12 · 1300 阅读 · 0 评论 -
误解continue
使用continue,一直以为是跳到循环开始的地方,但是昨天的一段测试代码,发现自己以前的理解是错误的。测试代码: 1 #include 2 #include 3 4 int main(int arg, char ** argv) 5 { 6 int s32Cycle; 7 8 s32Cycle = 10;原创 2012-08-10 09:06:41 · 919 阅读 · 0 评论 -
函数调用时的栈信息
在看到《C专家编程》中关于运行时的数据结构这一节时,使用gdb测试的一个小程序,观察函数调用时栈的排列帮助理解。..............214 804843d: e8 82 ff ff ff call 80483c4 215 8048442: 89 45 fc mov %eax,-0x4(%ebp原创 2012-08-07 14:38:16 · 1333 阅读 · 0 评论 -
函数返回值检查的必要性
早上检测昨天留下的内存泄露的bug,程序运行一段时间后总会发生SIGSEGV信号,明显内存访问出错了。由于是多线程,开始时定位出错的原因花费了不少时间。在几个线程中来回查找,开始找到的疑似bug代码的片段,经分析与检测发现并不是真正的原因。直到注释掉一段代码后,SIGSEGV信号没有再出现,感觉错误出现在这个函数中。进入函数分析后,发现错误应该存在于strstr()函数的返回值上,原创 2012-07-05 19:57:18 · 2833 阅读 · 2 评论 -
对于结构体变量赋值的误区
以前在使用结构体时没有在结构体变量之间直接赋值,今天同事在查看别人的代码时,发现有两个结构体变量直接赋值的语句当时感觉这个语句不对,认为在一个结构体里边,既有一般的无符号整形与数组,因为数组的赋值是不能直接赋值,要内存拷贝,从这里推理所以认为这个语句不对。于是问了一下,我当时以为是结构体指针变量的赋值,认为没有问题。还和同事争论了一番,当他让我看源代码时,发现是变量间的直接赋值,下意识中的判断是不原创 2012-02-14 13:42:15 · 71197 阅读 · 4 评论 -
变量初始化的疑惑
前天写了一个函数,是用来打包一组数据通过串口发送出去。当时考虑到要打包各种定义的结构类型,所以函数的参数是一个空类型。之后在回调函数中实现他们各自的打包以及最后打包成一组数据帧发送出去。在一开始写的时候,顺手在这个函数中写了一个将空类型转换为一种已经定义的结构(这个因该是在回调函数中实现,在这里属于笔误)。同时在这个函数中也定义了几个不同类型的结构变量。其中一个参数较多,参数主要由此函原创 2011-12-15 21:15:05 · 882 阅读 · 0 评论 -
函数指针使用的一点理解
在《程序员成长计划》中,提到的函数指针的运用,今天更明白了一些。分两种情况讨论。(主调函数,被调函数)第一点,可以传入的函数指针实参。这是平时应用最多的。通过传入的函数指针实现一定的功能,使用一个被调函数,在不需要修改任何代码的情况下,就可以通过传入的函数指针实现多种功能。这是《程序员成长计划》中最先提到的,着重讲解的,这也是自己最先理解的。第二种,在一个主调函数中,在不改变其原创 2012-09-10 22:55:56 · 1166 阅读 · 0 评论 -
常见gcc编译警告整理(开始)
1、warning: no newline at end of file在文件最后一行加上回车键解释:在《Rationale for the C99 standard》一文中,有C99的相关信息:A backslash immediately before a newline has long been used to continue string literals, as well原创 2012-02-09 12:02:31 · 56893 阅读 · 4 评论 -
强制转换带来的疑惑
int recv_message(sGsmRecvData *pRecvData){ int num = 0; int Index = 0; unsigned char u8Ret = FALSE; printf_func_line(); if((pRecvData == NULL) || (pRecvData->recv == NULL))原创 2012-10-17 09:07:50 · 1495 阅读 · 2 评论 -
一次调试之殇(STM32)
最近调试一段代码,发现一个很奇怪的现象,有一个函数放在一个位置,代码的执行结果是正确的。如果放在其他地方就会出现问题,同样的一个函数,为什么会出现这样的差距呢?看到这里,或许很多人已经猜出问题的原因了。但是,对于当时还在调试这段代码的人来说,或许是思维进入了一种惯性模式,看不到障眼法背后的实质原因。一直以为是,函数的位置导致了程序执行结果的偏差。甚至当时的心情,都有些向《代码大全》原创 2013-05-11 08:10:44 · 1581 阅读 · 0 评论 -
I2C程序出现的异常——STM32
在I2C程序中,很多时候使用while来判断状态是否发生改变。正常情况下,这个是很合适的。使用while,即做到了检测也起到了延时的作用,比单纯的计数延时要好的多。但是如果不正常的时候,在while处的程序执行是否还在我们预期范围内,就很难说了。程序卡死在while处的情况会有吗?首先,如果I2C链路连接有问题,肯定会出现问题的,这个时候由于while检测不到相应的状态改变,在这里卡死很正原创 2013-05-11 08:04:43 · 2606 阅读 · 0 评论 -
字节对齐与内存访问
关于字节对齐,最早是在《高质量程序设计》中看到的,当时明白一点,就是因为定义的数据字节大小不一(1字节,2字节,4字节,8字节),在内存中可能会有字节对齐的操作,就是数据在内存中的排放,不一定是连续的。因此也产生了一个疑问,就是对于数组而言,特别是结构体,如果不连续排放了。那么,当我们将结构体,当做连续的一段内存来访问时,是不是会造成错误呢?当时,虽然有疑惑,但是一直没有特别明白的原创 2013-02-05 09:47:52 · 7841 阅读 · 0 评论 -
指针,数组,变量参数传递的一点总结
测试代码:#include int add(int sum, unsigned char *p, unsigned char u8Len) { while(u8Len > 0) { sum += *p; p++; u8Len--; } return sum; }原创 2012-07-27 11:09:14 · 1544 阅读 · 0 评论