原文链接地址:http://hi.baidu.com/erfolgreich/blog/item/ce94dbad02c0c3f7faed5010.html
c 语言实现24位bmp图片加载,读写,放大缩小
可用 microsoft visual c++ 6.0 建立Win32 Console Application 工程,添加如下.cpp
2010-04-30 10:24
发现好多人网上查找c 语言版本的bmp图像读取,保存,放大,缩小程序,很难找到完整的。 现在将自己写的贴出来 供大家学习参考交流。转载请标明出处,尊重作者劳动成果。
/**********************************************************
作者:fankaipeng
时间:2010-04-27
文件名称 ......
一直觉得C语言的预处理
器是个美妙而神奇的工具,以后会陆续把自己学到的关于它的新知识总结出来。To be continued aways...
一、 #define替换
(Pointer ON C
, Ch14.2.2)
程序中扩展#define定义符号和宏时,涉及如下几个步骤:
(1) 在调用宏时,首先对参数进行检查,看看是否包含了任何由#define 定义的符号,如果是,它们首先被替换。
(2) 替换文本随后被插入到程序中原来文本的位置,对于宏,参数被它们的值替代。
(3) 最后,再次到结果文本进行扫描,看看它是否包含了任何由#define 定义的符号,如果是,就重复上述处理过程。
看一个例子:
#define _QUOTEME(x) #x
#define QUOTEME(x) _QUOTEME(x)
那么QUOTEME(__LINE__);将会被替换成字符串“34”(如果当QUOTEME被调用时,__LINE__刚好等于34)
而_QUOTEME(__LINE__);将会直接被替换为"__LINE__"! ......
对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问题。已经有许多技术被研究出来以应对这个问题,比如Smart Pointer,Garbage Collection等。Smart Pointer技术比较成熟,STL中已经包含支持Smart Pointer的class,但是它的使用似乎并不广泛,而且它也不能解决所有的问题;Garbage Collection技术在Java中已经比较成熟,但是在c/c++领域的发展并不顺畅,虽然很早就有人思考在C++中也加入GC的支持。现实世界就是这样的,作为一个c/c++程序员,内存泄漏是你心中永远的痛。不过好在现在有许多工具能够帮助我们验证内存泄漏的存在,找出发生问题的代码。
内存泄漏的定义
一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显示释放的内存。应用程序一般使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。以下这段小程序演示了堆内存发生泄漏的情形:
void MyFunction(int nSize)
{
char* p= new char[nSize];
if( !GetStringfrom( p, ......
对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问题。已经有许多技术被研究出来以应对这个问题,比如Smart Pointer,Garbage Collection等。Smart Pointer技术比较成熟,STL中已经包含支持Smart Pointer的class,但是它的使用似乎并不广泛,而且它也不能解决所有的问题;Garbage Collection技术在Java中已经比较成熟,但是在c/c++领域的发展并不顺畅,虽然很早就有人思考在C++中也加入GC的支持。现实世界就是这样的,作为一个c/c++程序员,内存泄漏是你心中永远的痛。不过好在现在有许多工具能够帮助我们验证内存泄漏的存在,找出发生问题的代码。
内存泄漏的定义
一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显示释放的内存。应用程序一般使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。以下这段小程序演示了堆内存发生泄漏的情形:
void MyFunction(int nSize)
{
char* p= new char[nSize];
if( !GetStringfrom( p, ......
一般我们调用shell脚本都用system()来实现,然后发现sytem返回值不好控制而且转换麻烦(还要右移4位即/256),于是我用popen来获取shell的返回值。果然在Unix世界里面,通道就是连结各个方面的桥梁啊!
代码例子如下:
#include<stdio.h>
#include<stdlib.h>
#include<sys/wait.h>
int main (int argc, char *argv[])
{
char szline[256];
FILE *fp;
if (argc != 2)
{
printf ("usage: %s command\n", argv[0]);
return 0;
}
if ((fp = popen (argv[1], "r")) == NULL)
{
printf ("the command %s not exist\n", argv[1]);
return 0;
}
while (fgets (szline, sizeof (szline) - 1, fp) != NULL)
{
printf ("frome command:%s", szline);
}
pclose (fp);
& ......
#include
using namespace std;
typedef struct lnode
{
long sno;
char name[20];
struct lnode *next;
}LNode, *LinkList;
LinkList InitList()
{
LinkList head;
head = new LNode;
head->next = NULL;
cout<<"Initialization completed!"< return head;
}
LinkList CreateList()
{
int i, n;
cout<<"Input data number:";
cin>>n;
LinkList q, p, head;
head = new LNode;
head->next = NULL;
q = head;
for (i = 0; i < n; i++)
{
p = new LNode;
cout<<"Input Information:"< cin>&g ......
4.2 多角度保证测试效果
对于代码质量要求很高的项目来说,仅有白盒覆盖是远远不够的。白盒覆盖不能发现代码缺失,白盒覆盖基于现有代码,如果代码不存在,当然不能发现。为了检测代码缺失,需要人工对测试数据进行检查。白盒覆盖也不能发现用例未反映功能。如果设计用例时,测试员不了解代码的功能,通过阅读代码来设计用例,这叫跟着代码走,这样测试的话,再高的覆盖率也没有意义。这也从另一个角度说明了自动用例的局限性,完全由工具自动生成的用例,效果显然还比不上跟着代码走。
开发当中还有一个特点,也是我们要注意的,就是程序员和测试员都容易遗漏边界和非法输入。程序员未考虑某些输入,就会造成代码缺失,白盒覆盖不能发现,如果测试员也漏掉,这种错误就发现不了。不过幸运的是,边界和非法输入容易产生的是极端错误,如崩溃、超时,自动生成的边界测试用例正好可以捕捉这类错误。
通过前面的分析,我们可以知道应该从哪些角度保证测试效果。黑盒、白盒、自动应该相结合。
黑盒角度,应该将测试数据分类集中起来,这样便于人工检 ......
4.2 多角度保证测试效果
对于代码质量要求很高的项目来说,仅有白盒覆盖是远远不够的。白盒覆盖不能发现代码缺失,白盒覆盖基于现有代码,如果代码不存在,当然不能发现。为了检测代码缺失,需要人工对测试数据进行检查。白盒覆盖也不能发现用例未反映功能。如果设计用例时,测试员不了解代码的功能,通过阅读代码来设计用例,这叫跟着代码走,这样测试的话,再高的覆盖率也没有意义。这也从另一个角度说明了自动用例的局限性,完全由工具自动生成的用例,效果显然还比不上跟着代码走。
开发当中还有一个特点,也是我们要注意的,就是程序员和测试员都容易遗漏边界和非法输入。程序员未考虑某些输入,就会造成代码缺失,白盒覆盖不能发现,如果测试员也漏掉,这种错误就发现不了。不过幸运的是,边界和非法输入容易产生的是极端错误,如崩溃、超时,自动生成的边界测试用例正好可以捕捉这类错误。
通过前面的分析,我们可以知道应该从哪些角度保证测试效果。黑盒、白盒、自动应该相结合。
黑盒角度,应该将测试数据分类集中起来,这样便于人工检 ......