C++解析器源代码中的原因不明的错误

App*_*ker 2 c++ arrays parsing for-loop runtime-error

这个函数检查用户输入的函数名称到我正在进行的解释器/解析器中,将它与函数数组进行比较,并执行相应的C++函数.只要用户输入正确的函数名称,它就可以正常工作,但是如果没有用户输入的名称功能,解释器会以一些无法解释的运行时错误结束,即使我将其编程为打印"未定义函数"然后继续解析循环:

void parser::eval_cmd(std::string& exp, pro::command fset[])
{
    expr = exp;
    exp_ptr = (char*) expr.c_str();

    bool found = false;

    for (int i = 0; i < (int)sizeof(fset); i++)
    {
        if (fset[i].check(expr))
        {
            found = true;
            exp_ptr = (char*)expr.c_str() + (fset[i].name.size() - 1);
            if (fset[i].cmd)
                fset[i].cmd(eval_args());
            break;
        }

    }

    if (!found) err::show(err::UNDEFINED);
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Rob*_*obᵩ 7

你做错了什么(int)sizeof(fset).这将为您提供指针的大小(以字节为单位),而不是传入fset数组中的元素数.

您需要一些其他方法来确定数组中有多少元素,可能是通过传入另一个arg,使用std::容器而不是数组,或者通过NULL终止数组.

例如,稍微更改函数定义:

void parser::eval_cmd(std::string& exp, const std::vector<pro::command>& fset)
{
    ...

    for (int i = 0; i < fset.size(); i++)
    {
        ... 
Run Code Online (Sandbox Code Playgroud)

代码的其余部分保持不变.


编辑:我最好的建议是使用std::map<string, pro::command>和允许map管理查找算法,或std::vector<pro::comand>使用上述算法不变.您可以测量内存性能,但我希望vectorover数组的唯一开销是newed数组在静态数组上的开销.

如果您确实得出不使用标准容器的结论,这是我的第二好建议:

void parser::eval_cmd(std::string& exp, pro::command fset[], size_t count)
{
    ...

    for (int i = 0; i < count; i++)
    {
Run Code Online (Sandbox Code Playgroud)

据推测,调用者知道(或可以确定)fset数组中的元素数量.(请参阅此宏可以转换为函数吗?以获得帮助.)