То, что вы делаете неправильно, это (int)sizeof(fset)
.Это дает вам размер указателя в байтах, а не количество элементов в переданном массиве fset
.
Вам нужен какой-то другой способ определения количества элементов в массиве, возможно, путемпередавая другой аргумент, используя std::
контейнер вместо массива или NULL-завершающий массив.
Например, слегка изменяя определение вашей функции:
void parser::eval_cmd(std::string& exp, const std::vector<pro::command>& fset)
{
...
for (int i = 0; i < fset.size(); i++)
{
...
остальная часть кода остается неизменной.
EDIT : Мой лучший совет - использовать std::map<string, pro::command>
и разрешить map
управлять алгоритмом поиска, или std::vector<pro::comand>
и использовать вышеуказанный алгоритм без изменений.Вы можете измерить производительность памяти, но я ожидаю, что единственные издержки над массивом vector
- это издержки new
ed массива над статическим массивом.Стандартные контейнеры, вот мой второй лучший совет:
void parser::eval_cmd(std::string& exp, pro::command fset[], size_t count)
{
...
for (int i = 0; i < count; i++)
{
Предположительно, вызывающая сторона знает (или может определить) количество элементов в массиве fset.(См. Может ли этот макрос быть преобразован в функцию? для справки.)