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)
我究竟做错了什么?
你做错了什么(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>
使用上述算法不变.您可以测量内存性能,但我希望vector
over数组的唯一开销是new
ed数组在静态数组上的开销.
如果您确实得出不使用标准容器的结论,这是我的第二好建议:
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数组中的元素数量.(请参阅此宏可以转换为函数吗?以获得帮助.)