我正在编写一些代码来用c ++进行科学计算,我需要对自定义结构foo
进行一些计算。为了使将来整个事情更容易维护,我想在单独的文件中分隔设置foo.bar=1;
等结构的代码。怎么实现呢?该结构使用犰狳库来支持矩阵/线性代数。我已经编写了头文件f.hpp
,如:
#include <armadillo>
#include <complex>
using namespace arma;
#ifndef __fn__
#define __fn__
struct foo
{
cx_mat a;
mat b;
cx_cube c;
complex<double> d;
string desc;
};
#endif
答案 0 :(得分:2)
将其添加到源代码文件将要求您每次希望更改值时进行编译。这是一种不好的做法,特别是如果你的编译时间很长。
推荐的方法是让配置文件说'foo.ini'。如果您使用第三方/开源库,例如https://code.google.com/p/inih/或http://www.hyperrealm.com/libconfig/,则可以拥有灵活的配置文件。
但是,如果你想保持简单,试试这个约定: 具有备用键值对的配置文件,具有固定的预期顺序。例如:
# foo.bar
42
# foo.pub
You're awesome
# foo.club
24/06/2015
# tab.a
64
请注意,值的顺序很重要,这将使我们可以使用简单的C ++代码轻松解析。只需打开文件并重复调用getLine(),忽略所有其他行并解析第二行以将其存储到结构中。
如果你想存储一个复杂的结构 - 例如矩阵,你可以设置一个简单的策略来存储这样的结构,因为解析函数也是由我们编写的:
# Foo matrix rows
100
# Foo matrix cols
50
# Foo matrix elements, row-by-row:
0.5 3 5 23 ... ... 100
4 5 5 34 1 ... ... 100
.
.
3 33 33 2 ... ... 100
# Diagonal Matrix rows-cols
20
# Diagonal Values, row-by-row others 0
45
22
92
.
.
20
另请注意,libconfig(http://www.hyperrealm.com/libconfig/)允许您使用数组和类似Json的文本来存储和表示此类复杂的数据结构。如果你想要一个完整的“配置语言”,你可以使用它。
你节省了大量的编译时间。只需更新配置文件并重新运行程序即可。这样,其他程序可以输入配置值。
答案 1 :(得分:2)
另一种可能性,在识别HPC中非常常见,它可以在您的应用程序中嵌入一些脚本语言。
您可以在应用程序中嵌入Lua或Guile(或Ocaml)解释器,并在运行复杂计算之前让它解释一些初始化脚本。该用户提供的脚本可以执行一些简单的解释计算来初始化您的数据。您只需提供一些脚本原语来操作(和创建)用户将与其脚本组合的数据。
您还可以使您的应用程序成为某些现有框架的扩展(或插件),例如Scilab,Octave,R,Python,NekoVM < / p> 顺便说一下,您的程序还可以读取一些简单数据(可能使用文本serialization格式,如Json),您的用户自己会编写其他一些脚本或程序来提供您的(例如使用{{3 }})。
另一种方法可能是用C ++初始化你的东西,它可能是生成的(甚至可能是你的程序来自某些更高级别的输入),并在运行时编译该C ++代码然后Unix pipelines作为插件使用dynamically load(我正在dlopen(3)执行此类操作...)。
请注意,嵌入或集成某些解释器是主要的软件架构设计选择,您应该尽早做出选择。