posts - 26, comments - 2, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

进程间通信知识了解不少,今天第一次正式使用,就出问题了。 看看共享内存的原理,操作系统把一块公共的内存区域,映射到进程内存空间中,但映射的内存地址并不能保证映射后的地址一致性(其实一致的可能性很小,基本没有成功过),而此处array执行的地址为创建共享内存进程中正确的数组地址,在新的进程中就不对了。 因此在共享内存中,需要慎重使用指针变量。对于本文中的问题修改很简单,删除int *array,每次使用结构的地址跳过这些额外信息即可,可通过下面的宏函数得到数据域的指针。
文章来源:http://blog.csdn.net/volant_hoo/archive/2009/05/11/4169093.aspx

posted @ 2009-06-18 14:38 小夜 阅读(358) | 评论 (0)编辑 收藏

最近看CSDN,又谈到一道面试题,大致是“不使用比较运算符和库函数比较两个整数的大小”。这种题看似简单,实则深藏玄机,考得不只是技巧还有很多基础知识。
文章来源:http://blog.csdn.net/volant_hoo/archive/2009/05/11/4169108.aspx

posted @ 2009-06-18 14:38 小夜 阅读(373) | 评论 (0)编辑 收藏

上一篇中对gtest进行了一个简单的扩展,本文通过实例测试并介绍这个扩展的用法。

首先实现两个Fibonacci函数,然后对这两个函数进行测试:

Fibonacci_1,使用循环实现:

unsigned int Fibonacci_1(unsigned int n)
{
    unsigned 
int i;
    unsigned 
int f0 = 1, f1 = 1, f2;
    
for (i = 1; i < n; i++)
    
{
        f2 
= f0 + f1;
        f0 
= f1;
        f1 
= f2;
    }

    
return f1;
}


Fibonacci_2,使用递归实现:

unsigned int Fibonacci_2(unsigned int n)
{
    
switch (n)
    
{
        
case 0:
            
return 1;
        
case 1:
            
return 1;
        
default:
            
return Fibonacci_2(n - 1+ Fibonacci_2(n - 2);
    }

}


测试用例:

TEST_T(Fibonacci_Recursive, 30)
{
    Fibonacci_2(
30);
    ASSERT_TIME(
0.1);
}


TEST_T(Fibonacci_Loop, 
30)
{
    Fibonacci_1(
30);
    ASSERT_TIME(
0.1);
}


TEST_T(Fibonacci_Recursive, 
40)
{
    TEST_T_SHOWTIME();
    Fibonacci_2(
40);
    EXCEPT_TIME(
0.1);
    ASSERT_TIME(
1<< "\nUsed too long time!";
}


TEST_T(Fibonacci_Loop, 
40)
{
    TEST_T_SHOWTIME();
    Fibonacci_1(
40);
    EXCEPT_TIME(
0.1);
    ASSERT_TIME(
1<< "\nUsed too long time!";
}


测试结果:

 

[==========] Running 4 tests from 2 test cases.
[
----------] Global test environment set-up.
[
----------2 tests from TIME_Fibonacci_Recursive
[ RUN      ] TIME_Fibonacci_Recursive.
30
[       OK ] TIME_Fibonacci_Recursive.
30
[ RUN      ] TIME_Fibonacci_Recursive.
40
FibonacciTest.cpp:
47: Failure
Failed
Time: running 
2.9995(s) > 0.1(s)
FibonacciTest.cpp:
48: Failure
Failed
Time: running 
2.9995(s) > 1(s)
Used too 
long time!
[   TIME   ] used time: 
2.9995(s)
[  FAILED  ] TIME_Fibonacci_Recursive.
40
[
----------2 tests from TIME_Fibonacci_Loop
[ RUN      ] TIME_Fibonacci_Loop.
30
[       OK ] TIME_Fibonacci_Loop.
30
[ RUN      ] TIME_Fibonacci_Loop.
40
[   TIME   ] used time: 
0(s)
[       OK ] TIME_Fibonacci_Loop.
40
[
----------] Global test environment tear-down
[
==========4 tests from 2 test cases ran.
[  PASSED  ] 
3 tests.
[  FAILED  ] 
1 test, listed below:
[  FAILED  ] TIME_Fibonacci_Recursive.
40

 

实例中测试了四个测试用例,分别测试了两个函数分别计算Fibonacci(30)和Fibonacci(40)所花费的时间。测试用例1、2比较简单,仅有一个ASSERT_TIME断言用于测试运行到此该测试用例花费的时间。测试用例3、4,增加了两条语句:TEST_T_SHOWTIME(),测试用例结束后打印执行时间;EXCEPT_TIME断言,这里只是测试以下EXCEPT_TIME和ASSERT_TIME的区别,前者继续执行后续语句,后者则结束当前的测试用例。

posted @ 2008-08-27 23:34 小夜 阅读(2979) | 评论 (0)编辑 收藏

看了gtest的一个simple,其中有测试运行时间的方法,但使用起来稍微负责,因此做了一个简单的扩展。

扩展内容:
1. TEST_T(test_case_name, test_name),用于定义运行时间测试用例。
2. TEST_T_SHOWTIME(),打开打印测试用例运行时间打印开关。
3. EXCEPT_TIME(second)和ASSERT_TIME(second),断言,second为double类型,测试运行时间是否小于second。

使用说明:
向正常使用一样,只是在需要时间测试时include “gtest_e.h”即可,当然也得把相应的库链接到执行文件中。

具体实现:
源文件gtest_e.h----

/**
 * gtest_e.h
 
*/


#ifndef GTEST_E_H_
#define GTEST_E_H_

#include 
"gtest_time.h"

#define TEST_T(test_case_name, test_name)\
    GTEST_TEST(TIME_##test_case_name, test_name, ::TimeTest)

#define TEST_T_SHOWTIME() TimeTest_setShowFlag(1)

#define ASSERT_TIME(time) if(TimeTest_setTimePoint() - time > 0) \
    FAIL() 
<< "Time: running " << TimeTest_getTime() << "(s) > " << time << "(s)"

#define EXCEPT_TIME(time) if(TimeTest_setTimePoint() - time > 0) \
    ADD_FAILURE() 
<< "Time: running " << TimeTest_getTime() << "(s) > " << time << "(s)"

#endif /* GTEST_E_H_ */
源文件gtest_time.h----
/**
 * gtest_time.h
 
*/


#ifndef GTEST_TIME_H_
#define GTEST_TIME_H_

#include 
<gtest/gtest.h>

class TimeTest: public testing::Test
{
public:
    inline 
void TimeTest_setShowFlag(int flag)
    
{
        show_time_ 
= flag;
    }


    inline 
double TimeTest_getTime()
    
{
        
return end_time_ - start_time_;
    }


    
double TimeTest_setTimePoint();

protected:
    
double start_time_;
    
double end_time_;
    
int show_time_;

    
virtual void SetUp();
    
virtual void TearDown();
}
;

#endif /* GTEST_TIME_H_ */
源文件gtest_time.cpp----
/**
 * gtest_time.cpp
 
*/


#include 
<iostream>
#include 
"gtest_time.h"

using namespace std;

#if defined(WIN32)
#include 
<sys/timeb.h>
double now()
{
    
struct _timeb current;
    _ftime(
&current);
    
return (((double) current.time) + (1.0 * current.millitm) * 0.000001);
}

#else
double now()
{
    
struct timeval current;
    gettimeofday(
&current, NULL);
    
return (((double) current.tv_sec) + 1.0e-6 * ((double) current.tv_usec));
}

#endif

void TimeTest::SetUp()
{
    start_time_ 
= now();
    end_time_ 
= 0;
    TimeTest_setShowFlag(
0);
}


void TimeTest::TearDown()
{
    
if (show_time_)
    
{
        
double used_time = TimeTest_setTimePoint();
        cout 
<< "[   TIME   ] used time: " << used_time << "(s)"
                
<< endl;
    }

}


double TimeTest::TimeTest_setTimePoint()
{
    end_time_ 
= now();
    
return TimeTest_getTime();
}


以上内容只是一个简单的实现,没有过多的测试,且时间精度不够,误差较大。

posted @ 2008-08-27 23:14 小夜 阅读(2286) | 评论 (0)编辑 收藏

奥运会结束了,工作也要开始忙起来了。从开幕到闭幕,看了两个星期的比赛,有高兴,有惊喜,有震撼,也有失望。现在被比赛牵动的心,又得趋于平淡。回归现实,还是工作的劳累和生活的奔波。
前天查了系分考试的成绩,论文没有过。成绩在意料之间,一篇字数刚好、内容跑题的论文,又怎么能过呢。失败也是经验,感觉以下几点:
1、系分没有想象中那么难考。好好准备一下,争取基础知识和案例成绩再提高一些。
2、自己的文字组织能力有待提高。很长时间没有动笔写字了,两个小时完成2000-3000字的论文和300-500的摘要,是个不小的挑战。考试的时候,不敢多做思考,就一直写呀写的,结束前一分钟刚好码字到2000字那一行,惭愧啊!
3、写论文要学会说废话。一直以来,自己都崇尚以“简”为美,经常对外文书籍中动辄“洋洋大论”的行为嗤之以鼻,直到考试的时候,才发现说废话也是一种好习惯。
4、把规划细化也是一种好的方式。长期以来,养成的习惯都是先写好主干内容,然后再逐步扩充,呵呵,像XP一样,错了可以改,少了可以加。唉,电子版可以如此,纸质版又能如何,羡慕机试了。
5、需要一块手表。考场上没有钟,手机不能用,有时间规划也不能落到实处。
换了工作,又换了房子,需要时间去适应新的环境。下半年的系分不打算考了,来年再度奋战。阿门,祈祷一下,希望能够顺利通过。

posted @ 2008-08-26 11:29 小夜 阅读(169) | 评论 (0)编辑 收藏

google开源了c++单元测试框架,真让人兴奋。安装的过程比较简单,在eclipse+mingw+cygwin下很easy就搞定了。使用也很容易,按照sample不用看文档也能很快上手。过程就不多少了,记点东西备忘。

断言:
ASSERT_TRUE(condition); EXPECT_TRUE(condition); condition为真
ASSERT_FALSE(condition);    EXPECT_FALSE(condition);    condition为假

ASSERT_EQ(expected, actual);    EXPECT_EQ(expected, actual);    expected == actual
ASSERT_NE(val1, val2);  EXPECT_NE(val1, val2);  val1 != val2
ASSERT_LT(val1, val2);  EXPECT_LT(val1, val2);  val1 < val2
ASSERT_LE(val1, val2);  EXPECT_LE(val1, val2);  val1 <= val2
ASSERT_GT(val1, val2);  EXPECT_GT(val1, val2);  val1 > val2
ASSERT_GE(val1, val2);  EXPECT_GE(val1, val2);  val1 >= val2

ASSERT_STREQ(expected_str, actual_str); EXPECT_STREQ(expected_str, actual_str); 两个C字符串有相同的内容
ASSERT_STRNE(str1, str2);   EXPECT_STRNE(str1, str2); 两个C字符串有不同的内容
ASSERT_STRCASEEQ(expected_str, actual_str); EXPECT_STRCASEEQ(expected_str, actual_str); 两个C字符串有相同的内容,忽略大小写
ASSERT_STRCASENE(str1, str2);   EXPECT_STRCASENE(str1, str2);   两个C字符串有不同的内容,忽略大小写

头文件:
#include <gtest/gtest.h>

main:
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();

库:
    -lgtest

posted @ 2008-07-31 12:52 小夜 阅读(2883) | 评论 (1)编辑 收藏

eclipse的出现和每一次版本升级,都让人兴奋,赶紧把公司和家里都升了上去。试用了两天,总体感觉还是不错的。
文章来源:http://blog.csdn.net/volant_hoo/archive/2008/07/17/2668471.aspx

posted @ 2008-07-18 06:14 小夜 阅读(509) | 评论 (1)编辑 收藏

很久没有接触snort了,由于工作的原因,和它打了两年多的交道,虽然有不少的认识,但缺少深入的研究。闲来时翻的几篇手册,原来放在163上,偷懒放个总的上来。
文章来源:http://blog.csdn.net/volant_hoo/archive/2008/07/07/2622733.aspx

posted @ 2008-07-08 04:23 小夜 阅读(154) | 评论 (0)编辑 收藏

做了几年C/C++开发,一直想要把单元测试加上,因为工作安排,做了一小段时间的java,更坚定了搭建c++单元测试环境的想法,但不得不说cppunit的配置实在是有些繁琐,MinGW的安装还好说,cygwin安装实在是太慢,可怜的网速让我数次终止了它的安装,幸运的是在公司的电脑上居然发现了cygwin的安装包,于是就开始了我的cppunit的测试旅程。
文章来源:http://blog.csdn.net/volant_hoo/archive/2008/06/02/2502339.aspx

posted @ 2008-06-02 18:30 小夜 阅读(513) | 评论 (0)编辑 收藏

本文对一篇文中的三种方法进行整理,并描述我面试时的解法。
文章来源:http://blog.csdn.net/volant_hoo/archive/2008/04/12/2283902.aspx

posted @ 2008-04-12 10:32 小夜 阅读(476) | 评论 (0)编辑 收藏

仅列出标题
共3页: 1 2 3