改用C++生成自动化数据表

简介:                               改用C++生成自动化数据表  前面的文章中,我们讨论了使用一个基于.NET的第三方程序库来从程序中来生成数据表。在我看来,这整个思路是非常有用的,例如为显示测试结果。

 

                              改用C++生成自动化数据表

 

 

面的文章中,我们讨论了使用一个基于.NET的第三方程序库来从程序中来生成数据表。在我看来,这整个思路是非常有用的,例如为显示测试结果。我经常会自己在博客中尝试各种像这样的方法。大体上就像你做各种测试然后把结果输出到控制台或者文本文档中……

 

 

 但是,要是把结果直接写入电子表格然后自动化地生成可视化图表不就更好了吗?这种方法也可以用C++实现吗?

 

 

  简介

在上面提过的文章中,我给大家演示了如何将测试结果直接输出到Excel文件中。我用了一个很棒的程序库它叫做 Spire.XLS。不仅是表格,图表也能很轻松地绘制出来!不仅如此,如果你细心发现,它还可以实现数据的计算,预测,运算等。

这些在.NET环境下都可以实现,在这呢我尝试了下用C++ 也就是原代码的主意原语言。

简而言之,我们用C++/CLI作为源代码和托管代码之间的桥梁。

以这种方法,我们可以用疯狂的最优源代码高速运行我们的算法和标准检查程序。结束的时候的,我们仅仅把结果传输到报表产生器模块。然后我们就有了可以进行分析的数据表。

当然另一种方法就是把结果从文本文档(或者控制台)复制到电子数据表中。我以前经常这么干,但不得不说这经常耗费很多时间。

处理来自源代码的调用

C#调用C++十分简便。你要做的就是用些PInvoke方法以及互操作机制(Interoperability mechanisms)然后从托管代码中调用原函数。

但是呢,我们怎样从C++中调用C#?换句话说:怎样逆用PInvoke?

幸运的是,这应该也不是难事:

1 我们要在C++的公共语言运行时中创建一个数据表模块的动态链接街库(也就是DLL)文件。

2 C++的公共语言运行库允许我们在C#.NET)中使用第三方程序库

在原代码中我们可以使用上面的DLL作为`normal Dll`.

我是根据这篇教程实现的:tigerang/reverse-pinvoke

通常像这种交互操作中,当你想从一端传送复杂数据到另一端(托管/原)时,事情就会变的很复杂。在我的示例中,我会只用 framework可以自动处理的简单的,基本的类型。

实现

源代码下载: github.com/fenbf/AutoPerfReport

数据表生成器接口:C++/CLI

#pragma once
 
#ifdef REPORTER_EXPORTS
     #define REPORTER_API __declspec(dllexport) 
#else
     #define REPORTER_API __declspec(dllimport) 
#endif
 
namespace reporter
{
     class REPORTER_API Reporter
    {
     private:
         class *Result _results;
     public:
        Reporter();
        ~Reporter();
 
         void AddResult( const  char *colName,  int n,  double elapsedTime);
         void SaveToFile( const  char *fname);
    }; 
}

  

这个接口不是通用的。但是用于简单的测试还是可以的。每次测试运行你要用测试名调用AddResult法,n 是测试程序的大小和elapsedTime

原代码:

for ( int n = startCount; n <= endCount; n += stepCount)
{
     for(auto &test : perfTests)
    {
        test->run(n);
        report.AddResult(test->name(), n, pt->elapsedTimeSec());
    }
}

为了保存结果,我用了名为 map的示意图:

class Results
{
public:
    std::map<std:: string, std::map< intdouble>> _res;
};


这张示意图是用来存储测试实例的(它的名字),示意图上的数字‘N’和所用时间来存储这种测试运行。

所以  _res["hello"][100] – 意味着测试运行100个元素的’hello’所用的时间。

下面是主方法:

void Reporter::SaveToFile( const  char *fname)
{
    Workbook ^workbook = gcnew Workbook();
    workbook->CreateEmptySheets( 2);
 
    String ^range =  "";
    String ^labelRange =  "";
    writeData(_results, workbook, range, labelRange);
    createChart(workbook, range, labelRange);
    std::cout <<  " Workbook with data created! " << std::endl;
 
    String ^filename = gcnew String(fname);
    workbook->SaveToFile(filename, ExcelVersion::Version2007);
    std::cout <<  " Workbook written to  " << fname << std::endl;
}

 

C++ CLI代码看上去很像C#,但是他有一些有趣的元素:-

从命名上就可以猜出writeData createChart 方法是将数据写入电子表格(填入列)并且基于这些数据制作相应的图表。

在以上的示例中我用Spire.XLS库受益良多。这是非常容易上手并且容易使用的模块。我用过的是免费版(每个文件最多150行)但这对于我大多的实例来说足够用了。

这个程序库数要是让我们在系统中没安装Office的情况下对XLS文件进行操作。另外我在添加相关引用在 Visual Studio 2013 Express甚至在C++ CLI时都没有任何问题。当然他在任何2.0以上版本的.NET Framework上都完美运行。

 

输出结果

事实上我的原/托管 示例的运行结果和我上篇文章一模一样。和我预想的一样:)

Spire.XLS 库可以创建文档,添加行,生成图表并且可以成功保存到硬盘。当然,这里测试结果好似来自原代码而不是托管代码。

总结

在以上示例中我向大家展示了如何简单地把测试结果从原代码中输出到电子表格文件中。Spire.XLS 库让我们仅仅用几行代码就可以创建文件,并用图表展示运算结果。

在简单的测试示例我们可以随意,但是当你开发一些大的工程的话这种自动化操作会节省很多时间。

目录
相关文章
|
IDE NoSQL Java
简单的 C/C++ 项目自动化构建--Xmake
简单的 C/C++ 项目自动化构建--Xmake
|
IDE Linux 开发工具
Linux入门学习教程:GNU C及将Vim打造成C/C++的半自动化IDE
C语言在Linux系统中的重要性自然是无与伦比、不可替代,所以我写Linux江湖系列不可能不提C语言。C语言是我的启蒙语言,感谢C语言带领我进入了程序世界。虽然现在不靠它吃饭,但是仍免不了经常和它打交道,特别是在Linux系统下。
1316 0
|
测试技术 图形学 C语言
《测试驱动的嵌入式C语言开发》——2.3节CppUTest:一个用C++实现的自动化单元测试框架
本节书摘来自华章社区《测试驱动的嵌入式C语言开发》一书中的第2章,第2.3节CppUTest:一个用C++实现的自动化单元测试框架,作者:(美)James W. Grenning,更多章节内容可以访问云栖社区“华章社区”公众号查看
2080 0
|
1天前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
1天前
|
安全 编译器 C语言
【C++篇】深度解析类与对象(中)
在上一篇博客中,我们学习了C++类与对象的基础内容。这一次,我们将深入探讨C++类的关键特性,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、以及取地址运算符的重载。这些内容是理解面向对象编程的关键,也帮助我们更好地掌握C++内存管理的细节和编码的高级技巧。
|
1天前
|
存储 程序员 C语言
【C++篇】深度解析类与对象(上)
在C++中,类和对象是面向对象编程的基础组成部分。通过类,程序员可以对现实世界的实体进行模拟和抽象。类的基本概念包括成员变量、成员函数、访问控制等。本篇博客将介绍C++类与对象的基础知识,为后续学习打下良好的基础。
|
4天前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)
|
1月前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
70 19
|
1月前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
52 13
|
1月前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
54 5