软件开发
做自己就好
我就是我
展开
-
c++基础学习
因为没有学过c++,而c++作为面向对象程序设计语言,在工作中又可能常常会见到。所以先了解一点点c++的基础知识。至于未来要怎么学,那就视具体需要而定了。1. class/object/instancec++中的class就类似于c语言中的struct类型一样,可以把它理解成一种数据类型;object相当于定义的某个class类型的变量;instance就是某种class类原创 2013-12-20 19:12:54 · 302 阅读 · 0 评论 -
关于函数栈帧的思考与分析
1. ebp和esp是什么?ebp是指向当前栈帧底部的指针;esp是指向当前栈帧顶部的指针。 2. stack是什么?stack是存储器中一种很昂贵的资源,默认情况下linux给每个线程分配的空间为8MB,可以使用ulmit -s或者ulmit -a进行查看:sh-# ulimit -s8192sh-# ulimit -acore file size原创 2013-09-06 12:44:36 · 938 阅读 · 0 评论 -
linux system函数的学习
1. system是库函数还是系统调用?system是一个库函数,system会fork一个child process,然后在这个child process中去执行shell命令。如果你的程序需要调用system函数,你需要#include system函数的原型是int system(const char *command); 2. system是同步函数吗?所以原创 2013-09-03 11:02:02 · 1810 阅读 · 0 评论 -
callback函数学习(二)
在计算机程序设计中,callback是指通过函数参数传递到其它代码的某一块可执行代码的引用。callback机制允许了底层代码调用高层定义的子程序,而不必关心高层对callback函数的具体实现。callback机制:1. callback函数调用者定义一个函数原型,函数实现者在既定的函数原型下实现函数;2. 函数实现者在初始化时将已经实现的callback函数的函数指针注册给ca原创 2013-12-19 19:03:57 · 476 阅读 · 0 评论 -
关于重构的学习
重构(refactory)的最大特别是以不改变软件可观察行为,修改软件代码提高软件的可读性、降低软件维护的成本。所以在软件的外在表现来看,程序的行为和结果没有发生任何变化;如果程序的行为和结果发生了改变,那就不叫重构。重构是对软件内部结构进行调整,让代码具有更好的可读性、更小的维护成本。哪些代码需要重构?1. 可读性差的代码;2. 逻辑复杂的代码;3. 逻辑大量重复的程原创 2013-12-19 18:05:16 · 365 阅读 · 0 评论 -
c语言函数与函数调用学习
函数(function)表示每个输入值对应唯一输出值的一种对应关系。所以一个完整的函数由函数名、函数体、输入输出参数以及返回值等几部分组成。下面就是一个类似于strcpy函数的实现案例,char* strcpy(char* dest, const char* src){ char * temp = dest; while(*temp != '\0')原创 2013-12-19 12:18:19 · 367 阅读 · 0 评论 -
c语言typedef关键字学习
typedef关键字用来给现有数据类型创建别名。typedef int size_t;所以下面的两个定义其实完全相同。size_t size;int size;咦,下面这样定义一个size_t的宏是不是也能达到一样的效果呢?#define size_t int在这里,确实define一个数据类型宏能达到同样的目的。但是typedef和define相比:defin原创 2013-12-18 18:07:48 · 523 阅读 · 0 评论 -
c语言预处理命令学习
所谓预处理命令,就是在编译之前即预编译阶段进行处理的命令。预处理命令以字符"#"开头,并且一行只能有一条预处理命令。c语言的预处理命令主要有三方面:1. 宏定义#define MAX_SIZE (100)#define MAX(a, b) (((a) > (b))(a) : (b))2. 文件包含一个文件包含另一个文件的内容,通常被包含的文件称之为头文件,并且以".h"原创 2013-12-18 18:06:04 · 410 阅读 · 0 评论 -
关于strcpy,strncpy以及memcpy的学习
1. 函数原型#include char *strcpy(char *dest, const char *src);char *strncpy(char *dest, const char *src, size_t n);void *memcpy(void *dest, const void *src, size_t n);这几个函数都能用来copy字符串,但是使用起来要特别小原创 2013-10-13 12:40:22 · 746 阅读 · 0 评论 -
linux parse文件的函数
#include FILE *fopen(const char *path, const char *mode);int fclose(FILE *fp);如果你要parse一个文件中的内容,首先必须要open这个文件。用户可以根据具体的需求来决定是以只读、只写或可读写等方式打开。#include int fgetc(FILE *stream);char *fgets(原创 2013-12-22 13:33:51 · 394 阅读 · 0 评论 -
c语言学习小结
语言本身只不过是一个工具,写出高质量的软件不光是要了解语言本身,更要对软件工程、数据结构、操作系统等有所了解。1. 要避免潜在的隐式类型转换。在做算术运算时变量的数据类型要一致,如果既有有符号型变量也有无符号型变量那么有符号型负数会隐式转换为大正数;2. 函数和变量要保证定义和声明的一致性,这样可以消除编译器编译代码时发出的警告同时能够提高软件的可移植性;3. Char *原创 2014-04-12 15:19:35 · 682 阅读 · 0 评论 -
程序设计中常用的几种图
使用图表可以简单直观简洁的表达一件事。在程序设计中,更是有一幅图能够替代千言万语的作用。这里就简单介绍一些程序设计中经常需要画的几类图。1. 模块图对一个大的程序或软件按照功能进行划分,这样可以从宏观上很直观的看到程序是由哪些模块组成的。2. 状态图表达的是程序或程序内的模块的一种状态转换关系。通过该图可以清楚的看到程序的生命周期。3. 程序流程图使用流程图原创 2014-04-08 18:09:06 · 3244 阅读 · 0 评论 -
c coding style学习
1. 使用do-while结构去避免潜在的内存泄漏问题。do{ p1 = malloc(10); if (null == p1) { break; } p2 = malloc(20); if (null == p2) { break; } return ok;}原创 2013-09-09 17:19:12 · 587 阅读 · 0 评论 -
关于debug level的学习
debug level就是在代码中增加的一些日志信息,其目的是为了debug。既然是代码中增加的日志信息,那为何还要debug level呢?直接使用printf输出不行吗?因为如果将所有的日志信息都打印出来,那必须会极大的降低程序的执行效率。log level该如何定义?像linux printk就定义了8个级别的log level:#define KERN_EMERG ""原创 2014-03-23 15:06:48 · 3646 阅读 · 0 评论 -
关于同步函数的学习与思考
下面这篇博文中已经有对同步函数与异步函数做了基本的学习,http://blog.csdn.net/boyxulin1986/article/details/17413239考虑到理解这个概念对学习可能产生的帮助,所以这一块打算继续学一学。需求:有两个线程A与B,如果A/B同时做一件事就会导致程序出错;现在的需求是在线程A中要调用线程B的函数,如果提供的是异步调用的函数,则就原创 2014-01-27 12:28:38 · 335 阅读 · 0 评论 -
关于可变参数函数的学习
可变参数函数,顾名思义就是函数的参数个数是不确定的,可以变化的。可变参数函数见得比较多的就是字符串格式化输入输出函数了,如标准输入函数scanf、标准输出函数printf等。#include int scanf(const char *format, ...);int printf(const char *format, ...);可以实现可变参数函数的原因是头文件stda原创 2014-01-08 20:07:49 · 337 阅读 · 0 评论 -
c语言字符串格式化输出
c语言中字符串格式化符号(format specifier)是字符"%",常用的有:%d,表示十进制有符号整数;%u,表示十进制无符号整数;%f,表示浮点数;%s,表示字符串;%x,表示无符号以十六进制表示的整数。c语言中用户格式化字符串的函数有:#include int printf(const char *format, ...);int fprintf(F原创 2013-12-23 18:25:24 · 583 阅读 · 0 评论 -
c语言字符串格式化输入学习
字符串格式化输入和字符串格式化输出正好相反,字符串格式化输出请参考下面这篇文章,http://blog.csdn.net/boyxulin1986/article/details/17509495#include int scanf(const char *format, ...);int fscanf(FILE *stream, const char *format, ...);原创 2013-12-24 12:34:02 · 394 阅读 · 0 评论 -
c语言const关键字学习
在c语言中const关键字用来修饰一个变量,它限定一个变量不允许被修改。const int max_size = 5;看起来使用const修饰的变量,和使用宏很类似,为何不直接使用宏呢?#define MAX_SIZE (5)这是因为和宏比起来:1. const修饰的是一个变量,所以会在代码编译阶段进行语法检查。而宏只会在预编译阶段进行简单的替换动作;2. 使用cons原创 2013-12-18 12:18:35 · 597 阅读 · 0 评论 -
关于strlen和sizeof的学习
strlen是一个函数,用来计算字符串的长度。#include size_t strlen(const char *s);char test[4] = {'t','e','s','t'};此时strlen(test)的结果是什么?答案是无法预知。因为字符串"test"没有以字符'\0'结束,而字符't'后面的地址上的数据是无法预知的,并且strlen计算字符串的长度原创 2013-12-17 19:51:20 · 481 阅读 · 0 评论 -
关于extern "C"的学习
1. extern "C"怎么用?#ifndef _MODULE_A_H_#define _MODULE_A_H_#ifdef __cplusplusextern "C" {#endifdeclear your APIs#ifdef __cplusplus}#endif#endif2. extern "C"的作用?extern "C"的主要作用是为了原创 2013-11-05 11:56:27 · 937 阅读 · 1 评论 -
字符集和字符编码学习
做嵌入式应用软件开发,总是少不了要跟字符集和字符编码打交道。字符集是各种文字和符号的总称。常见的字符集有ASCII字符集、GB2312字符集、BIG5字符集、Unicode字符集等,每一种字符集支持的字符个数并不相同。因为计算机无法像人类一样识别自然界中的具体事物,它只能识别0和1这两个二进制数字。所以在向计算机输入数据时,计算机必须要有一套编码系统,将数据编码成0/1这样的计原创 2013-11-16 12:31:09 · 1177 阅读 · 1 评论 -
软件功能模块化的方法讨论
结合本人工作中的一些经验心得,说一说软件功能模块化的方法。SW=A+B+C+D+E+...全功能软件总是由很多很多功能模块组合而成。而针对不同客户,其需求并不完全相同,比如:SW1=A+B+C+D,SW2=B+D+E,SW3=A+C+D,......所以,就要针对不同客户给出不同的软件。那要如何才能做到呢?通常有两种做法:1. 编译时决定。使用模块化的宏原创 2013-09-26 18:06:45 · 602 阅读 · 0 评论 -
软件开发中比较重要的几条原则
以下纯属结合个人工作经历的一些经验分享,大家自行体会,如有觉得值得商榷或不足的地方,欢迎提出来讨论。 1. reliability即可靠性,软件必须要有避免可能发生故障的能力,且在发生故障时,要具有纠错的能力。这要求我们在编码时对于可能发生的问题,应该要做出错处理。不能动不动系统就崩溃吧? 2. robustness即健壮性,对于软件规范要求之外的输入要能够有合理的原创 2013-09-02 21:18:40 · 530 阅读 · 0 评论 -
关于变量初始化的分析
1. 哪些变量需要初始化?要养成好的编程习惯,通常局部变量都需要初始化,static类型的局部变量除外。 2. 为什么局部变量需要初始化?因为局部变量是从stack或heap上直接分配的空间,而stack或heap上的空间是被反复使用的。所以无法预知上一个时间点这块内存空间存了什么样的数据,这样有时可能会对程序的执行结果造成影响。 3. 为什么static类型的局部原创 2013-09-09 14:30:28 · 683 阅读 · 0 评论 -
源代码静态分析工具
代码写的不严谨,常常会让你的软件出现很多不可预测的错误,而且这种错误有时会表现的很随机性,这会给你分析和定位问题带来难度。 我们可以利用一些优秀的源代码静态分析工具帮助我们检查很多诸如变量未初始化、内存泄漏、空指针引用、缓冲区溢出以及数组越界等很多编程时可能会不经意犯下的错误,让软件更加稳定和健壮。比较有名的工具有klocwork、lint等。 案例一内存泄漏之检查:原创 2013-09-10 12:04:37 · 1551 阅读 · 1 评论 -
关于race condition的思考
所谓race condition就是因为语句执行顺序的不同,从而造成程序运行结果不同的一种情况。单线程编程是不可能出现race condition的情况;如果你的共享资源是原子操作,那也不会出现race condition,但是对于共享资源,哪怕只是一个全局变量的访问,也无法保证其原子性。在单处理器系统中,真正的原子操作是能够在一个指令周期内完成的操作都能称为原子操作;而在多处理器原创 2013-09-15 11:06:58 · 1139 阅读 · 0 评论 -
浅谈多线程编程中对过期消息的处理
在多线程编程中,经常会遇到两个线程之间需要通过传递消息进行通信的情况。现在假设有两个线程:thread_background和thread_foreground,thread_background负责不影响跟用户交互的处理,所以可以放到后台偷偷做;thread_foreground负责跟用户的交互行为,所以其要求是要能快速处理,不能影响到用户的体验感。有以下几个情形:情形一:原创 2013-09-11 16:26:33 · 449 阅读 · 0 评论 -
C语言中数据类型转换的学习
1. 整型和枚举类型数据的转换测试代码如下:#include typedef enum _E_TYPE_T{ E_TYPE_1 = -1, E_TYPE_2, E_TYPE_3, E_TYPE_END}E_TYPE_T;int main(int argc, char* argv[]){ unsigned char ui1原创 2013-10-08 20:55:05 · 541 阅读 · 0 评论 -
关于callback函数的学习
以前看过一些美国大剧,经常有听到"I will callback you later."这样一句话,只知道大概是我晚些时候给你打电话的意思。在C语言中,我们经常会看到callback函数。所谓callback函数就是将一个函数的地址作为参数传递给另一个函数,当这个地址被用为调用它所指向的函数时,这就是callback函数。callback函数有两种用法:1. 多线程环境中,原创 2013-09-18 19:01:34 · 838 阅读 · 0 评论 -
C语言指针学习二---何时使用指针
在下面这篇文章中已经有对指针做过学习,http://blog.csdn.net/boyxulin1986/article/details/17148969指针作为C语言中极为重要的部分,它在为程序员提供极大便利的同时似乎也隐藏了各种潜在的危险。用好了指针,对C语言编程很有帮助;用不好,程序可能随时会出错,并且引起问题的原因也很难查找。所以接下来就需要知道什么时候该用指针,什么时原创 2013-12-17 18:20:11 · 495 阅读 · 0 评论 -
关于errno学习
1. 先写一段测试代码如下,#include #include #include int main(int argc, char* argv[]){ int fd = 0; printf("\nerrno=%d,errno=%s\n", errno, strerror(errno)); fd = open("/etc/shaxxx",原创 2013-12-16 12:48:13 · 639 阅读 · 0 评论 -
关于assert的学习
编写代码时,总会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看成是异常处理的一种高级形式。c语言assert宏的定义,#include void assert(int expression);意思就是断言表达式expression为真。如果expression表达式的结果为假,则向stderr打印出错信息并调用abort来终止程序运行。#undef ass原创 2013-12-15 21:17:45 · 558 阅读 · 0 评论 -
C语言指针学习
数组指针,它是一个指针、是一个指向数组的指针。以下是一个指向整型数组的指针,int (*p)[n];指针数组,它是一个数组、数组中的元素都是指针。以下是一个整型指针数组,int *p[n];int main(int argc, char* argv[]),这里的argv就是一个char类型的指针数组,argv里面的每一个元素都是一个char类型指针。指针的类型决定了原创 2013-12-05 21:05:32 · 431 阅读 · 0 评论 -
关于转义字符的学习
转义字符在很多系统或语言中都有用到。为什么要有转义字符呢?以我目前接触到的工作来看,有两种原因:1. 字符本身已经被解释成另外的含义;2. 字符本身不可打印。关于原因1,以linux shell为例进行学习。因为shell下的域分隔符就是空格字符,所以shell将空格理解成域分隔符了。sh-# echo 11 2211 22sh-# echo原创 2013-10-01 15:22:49 · 787 阅读 · 0 评论 -
void*类型指针学习
void*指针即无类型指针,它可以指向任何类型的数据。因为void*指针没有具体的类型,所以编译器无法确定一个元素的数据长度,所以void*指针不能执行++或--操作。因为void*指针是无类型指针,所以它可以被转换成任意类型的指针,这给使用上带来了一定的灵活性。比如函数参数定义为void*类型,那么函数实现者就可以根据不同的需求提供不同类型的数据,这也就需要接口提供者和接原创 2013-12-09 18:09:22 · 462 阅读 · 0 评论 -
pre-built的含义和理解
个人觉得,pre-built只是一个概念,在build之前先pre-built出来.so或.ko或可执行档案等。通常是你的程序需要其它模块,而其它模块你却无权限去阅读其source code,所以它们将先build好.so或.ko或可执行档案给你使用,这种build的方式就可以称之为prebuilt。对于IT公司来讲,软件source code是公司及其重要的资产;特别是关系到核心原创 2013-12-08 16:08:30 · 1627 阅读 · 0 评论 -
软件开发过程中会出来的几个版本
1. baseline,这是一个比较基础的版本,它作为进一步开发的基础;2. alpha,这个版本主要用来供内部测试用;3. beta,这个版本是给用户或测试的一个版本;4. gamma,这个版本通常作为发布候选版本(release candidate),通常这一版应该比较稳定了,而且到了这一版因为不会增加新功能开发了;5. release,这是最终交付给终端用户或客户的版本.原创 2013-09-12 21:04:20 · 663 阅读 · 0 评论 -
__FILE__, __FUNCTION__, __LINE__学习篇,谨以此文告别那无知的岁月
printf("\n%s,%s,%d\n", __FILE__, __FUNCTION__, __LINE__);经常会在代码中看到类似于上面的log,虽然一直很好奇__FILE__,__FUNCTION__这些macro在哪define的,但是却从来没想过要去查一下。 经查,发现__FILE__, __FUNCTION__, __LINE__, __DATE__, __TIM原创 2013-09-04 19:20:48 · 815 阅读 · 0 评论 -
软件开发中的资源控制问题学习
软件特别是一些较大的软件都是由很多很多模块组成的,SW = A + B + C + D + E + ...而我们知道,这些模块几乎不会同时处于运行状态。一般情况下,可能只有一个或其中几个模块处在同时运行中。如果在软件启动时就将这些模块全部初始化,其好处是因为所有的模块都已经被初始化了,所以当要运行其中某个模块时可以快速的运行起来;但我们知道内存在系统中总是紧俏资源(大部分的原创 2013-09-30 12:06:45 · 989 阅读 · 1 评论