我正在使用其他人为计算化学反应而编写的代码。用户必须为计算指定许多值,这可能会导致错误。我试图自动化/简单地这个过程。
我可以通过执行(例如)实例化一个类:
Algorithm<double> chlorine;
我想做多个实例 - 例如氯,氢和氧。当我把“氯”,“氢”和“氧气”作为元素放在一个名为“chemicalElements”的字符串向量中然后这样做时,我不明白为什么会出现分段错误:
for (i = 0; i < chemicalElements.size(); i++)
{
Algorithm<double> chemicalElements[i].data();
}
我在这里错过了一些简单的东西吗?我写的时候:
Algorithm<double> chlorine;
“氯”只是一个字符串,对吗?那么为什么在字符串向量中的元素中添加“氯”是不行的?
答案 0 :(得分:3)
chlorine
不是示例代码中的字符串,它是变量的标识符(类型为Algorithm<double>
)。
必须为变量提供编译时标识符;这意味着必须在编译器遍历代码时指定标识符。在运行时之前,chemicalElements[i].data()
的结果是未知的。
C ++没有任何在运行时创建变量名称的工具,因此您无法直接直接询问。然而,听起来你真正需要的是一组算法对象,每个元素对应一个。要创建算法对象的数组,您可以执行以下操作:
Algorithm<double> algorithms[15];
这会创建15个不同的算法对象,您可以根据需要将其映射到元素。当然,您可以选择不同于15的数字,只要该数字是编译时常量值即可。
您可能也有兴趣了解std::vector<T>
,一种允许您创建动态调整大小数组的类型,或std::map<K,V>
,它允许您在键值(字符串)之间创建关联映射,例如“氯”和一个值,例如相关的算法)。
要使用后者,你可以这样做:
std::map<std::string, Algorithm<double>> algorithms;
algorithms["chlorine"] = Algorithm<double>();
algorithms["argon"] = Algorithm<double>();
然后再说:
auto results = algorithms["chlorine"].data();
(您当然应该仔细阅读上述类型的链接文档,因为为了简洁起见,我省略了一些错误处理。)
答案 1 :(得分:1)
算法氯,意味着 您已经实例化了一个名为“氯”的“算法”对象
制作“算法”数组 你编码就像:
Algorithm<double> chemicalElements[Const_num];
并通过它的每个项目,你调用数组的名称+它的索引如:
chemicalElements[0 or 1 or 2 or ... etc].data();
所以它会像
for (i = 0; i < Const_num i++)
{
chemicalElements[i].data();
}
答案 2 :(得分:1)
在本声明中
Algorithm<double> chlorine;
氯不是一个字符串。它是一个标识符,用于命名Algorithm<double>
类型的对象。
这种结构
Algorithm<double> chemicalElements[i].data();
在C ++中没有语法意义,编译器应发出错误。