在 DLL 中使用时,运行代码不起作用



我在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,因为我的初始化(没有初始化,程序由于尝试返回未初始化的变量而崩溃。

我在下面的屏幕截图中添加了来自视觉工作室的值

有人有什么建议吗?

屏幕截图 1 - 来自视觉工作室的值

屏幕截图 2 - 来自视觉工作室的值

如果你可以使用标准容器(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]));

这将需要一个这样的搜索谓词

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。

相关内容

  • 没有找到相关文章

最新更新