【问题标题】:Adding similar variable names to array将相似的变量名添加到数组
【发布时间】:2021-10-13 18:53:33
【问题描述】:

我在 openFOAM 中编写了一个运行良好的 c++ 程序。用户可以将直径 d_p 作为输入。这个直径的数量可以变化,例如在一种情况下,它可能是d_p1d_p2d_p3……在另一种情况下,它可能只是d_p1d_p2。我想做的是首先检查在字典中设置了哪些直径并将它们添加到我可以循环的数组中。这将帮助我解决具有索引直径的数组的方程,而不是为每个变量复制粘贴代码。

有人知道这是否/如何可能吗?我在互联网上阅读了一些关于此的帖子,但找不到解决方案:/

编辑:

更多细节:

我有一本名为 someProperties 的字典,它看起来像这样:

d_p1     d_p1     [0 1 0 0 0 0 0]      0.1E-06;
d_p2     d_p2     [0 1 0 0 0 0 0]      100.0E-06;

d_p 的数量,就像我说的,是可变的。我可以使用另一个名为 createFields.H 的头文件读取直径,并使用以下可能的代码:

IOdictionary someProperties
(
    IOobject
    (
        "someProperties",
        runTime.constant(),
        mesh,
        IOobject::MUST_READ_IF_MODIFIED,
        IOobject::NO_WRITE
    )
);

dimensionedScalar d_p1
(
    CDRProperties.lookup("d_p1")
);

dimensionedScalar d_p2
(
    CDRProperties.lookup("d_p2")
);

稍后我想在我的正常代码中使用这个直径。要遍历直径(所以我不需要为所有直径复制粘贴我的代码)我需要某种结构,如数组或带有维度的标量列表(这是某种 openFOAM 编码)。

提前致谢

火神

【问题讨论】:

  • 直径只是直径类型的命名实例吗?
  • 你为什么需要一个 dictionary/hashmap 呢?您不能将它们存储在动态扩展的std::vector 中吗?然后,您可以像通常使用数组一样遍历它。
  • openFOAM 中的字典是用来初始化用户的……意思是如果用户想运行程序,他可以在这个字典中定义参数,然后程序从中读取变量。 ..

标签: c++ initialization openfoam


【解决方案1】:

只需使用std::vector。它基本上是一个按需增长的动态数组:

#include <vector>

int main() {
  std::vector<double> d_p;
  d_p.push_back(1);
  d_p.push_back(2);
  d_p.push_back(3);

  // later on use [] to acces
  d_p[0] = 42; // ...

  // Or iterate
  for (int i = 0; i != d_p.size(); ++i)
    d_p[i] = i * 3.14; // ...
}

【讨论】:

  • 这就是我想做的,但我不知道 d_p 条目的数量。我怎么能意识到这一点?例如,如果我有 d_p1 = 10; dp_2 = 15; dp_3 = 18;
  • @Pyro 你可以做d_p.push_back(10); d_p.push_back(15); d_p.push_back(18);
  • 那将是最简单的方法,是的...但是我需要在程序运行时读取的字典中定义变量...如果我像这样使用 push_back ,我需要一直更改源代码并再次编译...这不是该工具以后应该如何工作的方式。
  • @Pyro 你是什么意思?你能告诉我minimal reproducible example,我可以看到你打算如何使用它吗?
  • 嗨,我在上面的主要问题中添加了更多信息。提前感谢您的帮助。
猜你喜欢
  • 2013-04-28
  • 2013-01-13
  • 2018-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多