我在Visual Studio中用c ++编程。
这是我的子程序,它从双数组中返回一个特定的值:
double specific_value_search(std::string mol_fractions_name[], std::string mass_fractions_name_output[], double mass_fractions_output[], int molecule)
{
double specific_value=5;
std::string a = mol_fractions_name[molecule];
std::string b;
for (int i = 0; i <= 11; i++)
{
b = mass_fractions_name_output[i];
if (a.compare(b) == 0)
//if ((a.find(b) != std::string::npos))...this was my second try // sollte string b in Zeile a gefunden werden, dann...
{
specific_value = mass_fractions_output[i];
break;
}
}
return specific_value;
}
所以当我在项目中将此代码执行到.exe时,代码运行正常。 但是当我将它编译成dll时,通过外部程序运行它,该值返回5,因为我的初始化(没有初始化程序因为尝试返回未初始化的变量而崩溃。
我在下面的屏幕截图中添加了visual studio中的值
有人有任何建议吗?
答案 0 :(得分:0)
如果你可以使用标准容器(std :: map或std :: unsorted_map),那么这就变得微不足道了。
std::map<std::string, double> fractionNames;
// fill map
double specificValue = fractionNames[mol_fractions_name[molecule]];
如果molecule
可能大于名称数量,或者如果在地图中找不到分数名称则需要生成错误,那么您将需要添加一些代码来检测和处理这些情况。
如果您无法使用地图,则可以使用矢量
struct FractionName {
std::string name;
double value;
}
typedef std::vector<FractionName> FractionNameVector;
FractionNameVector fractionNames;
// again fill fractionNames
FractionNameVector::iterator iter = std::find(fractionNames.begin(), fractionNames.end(), SearchPredicate(mol_fractions_name[molecule]));
这需要像这样的SearchPredicate
struct SearchPredicate
{
bool operator()(const FractionName& haystack) { return haystack.name ==
needle; }
explicit SearchPredicate(const std::string name) : needle(name) {}
std::string needle;
};
如果您使用的是C ++ 11或更高版本,则可以使用lambda。