Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.02.2014, 19:15   #1
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
Вопрос boost_regex проблема со стеком

Здравствуйте.

У меня проблема со стеком boost в регулярном выражении.

Есть вот такой код

Код:
        boost::regex vtRegex("[\\s]{1,100}<float_array id=\"[\\S]{1,100}-map-0-array\" count=\"([0-9]{1,7})\">([\\s\\S]{1,})[\\s\\S]{0,}");
        boost::smatch vtResult;
        if(boost::regex_match(str,  vtResult, vtRegex))
        {
            int64_t ti;
            std::string xStr = vtResult[2];
            std::string vtresult = " " + xStr;
            std::string vtres1 = vtResult[1];
            std::stringstream vtres2;
            int64_t vtres3;
            vtres2 << vtres1;
            vtres2 >> vtres3;
            std::string vtstr;
            for(ti = 0; ti < vtres3; ti++)
            {
                vtstr += " ([\\S]{1,12})";
            }
            boost::regex vtReg(vtstr);
            boost::smatch vtRes;
            if(boost::regex_match(vtresult,  vtRes, vtReg))
            {
                for(ti = 0; ti < vtres3; ti += 2)
                {
                    std::string vt1str = vtRes[ti + 1];
                    std::string vt2str = vtRes[ti + 2];
                    float vt1;
                    float vt2;
                    std::stringstream ssvt1;
                    std::stringstream ssvt2;
                    ssvt1<<vt1str;
                    ssvt1>>vt1;
                    ssvt2<<vt2str;
                    ssvt2>>vt2;
                    textures.push_back(vt1);
                    textures.push_back(vt2);
                }
            }
            else
            {
                std::cout << "TextureError";
            }
        }
Который извлекает данные находящиеся между тегами <float_array>1 2 3 4 ...... n</float_array> и запихивает n элементов в векторный массив textures.

С этим кодом я проработал пол года, но когда количество элементов в <flaot_array></float_array> перевалило за 100 000 появилась проблема, после запуска программа прекращает свою работу и выводит ошибку

terminate called after throwing an instance of 'boost::exception_detail::clone_imp l<boost::exception_detail::error_in fo_injector<std::runtime_error>
>' what(): Ran out of stack space trying to match the regular expression.


Первое регулярное выражение из кода выше отрабатывает нормально.
Как я понял причина во втором регулярном выражении, которое я формирую в цикле

Код:
for(ti = 0; ti < vtres3; ti++)
{
    vtstr += " ([\\S]{1,12})";
}
Элементов оказывается слишком много для буста.

Подскажите пожалуйста как можно решить эту проблему?

Спасибо за внимание.
gunsoy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
boost_regex кирилица gunsoy Общие вопросы C/C++ 8 17.01.2014 21:04
Проблема со стеком skad0 Помощь студентам 1 16.04.2013 02:31
Работа со стеком KBAC Помощь студентам 0 26.12.2010 12:54
проблема со стеком ruslan_k1 Помощь студентам 6 29.09.2010 15:18
Проблема со стеком в проге на ассемблере T(h)rasher Помощь студентам 23 26.09.2010 17:18