Проблема: Запятая при вводе в Visual C++ 2005

20 views
Skip to first unread message

Sergey Lyalin

unread,
Oct 9, 2006, 11:53:59 AM10/9/06
to Arageli
Уважаемые инетересующиеся Arageli, этот
топик относится не только к Arageli, но и в
целом к Microsoft Visual C++ .NET 2005.

Некоторым известно, что в Arageli при
компиляции с Visual C++ 2005 обнаруживается
ошибка, свазанная с изменениями в
трактовке символа запятой "," при вводе
строк по сравнению с предыдущими (или
другими, не от Microsoft) реализациями C++.

Например, следующий код:

#include <iostream>
#include <arageli/arageli.hpp>
int main ()
{ Arageli::vector<int> a = "(1, 2, 3)"; }

Прекрасно отработает в Visual C++ 2003, но
вызовет исключение Arageli::incorrect_string в Visual
C++ 2005. Проблема в том, что запятая в
новой версии продукта трактуется как
разделитель тысяч с группами цифр по 3.

Эта проблема не слишком активно
обсуждается в Интернете; я нашёл лишь
пару реальных попыток её решить в
англоговорящем мире и ни одной --- в
рускоговорящем. Может быть, я плохо
искал и кто-нибудь укажет мне на
подобное обсуждение.

Тем не менее по одному источнику
(http://groups.google.com/group/microsoft.public.vc.language/browse_frm/thread/64ac882a37ddb1e9/eee6c084d09bf204is):
"...The MS product team has decided this is a bug with no workaround.
They a considering oit for a Quick Fix Engineering..." И более
никакой информации не поступало (это
было более полугода назад). А по
другому
(http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=700005&SiteID=1)
во всём виноват стандарт C++, и
предложено решение по созданию нового
объекта локализации с корректной
пунктуацией.

Может быть кто-нибудь знает, как решить
эту проблему максимально просто и не
накладно по времени/памяти исполнения.
Требуется способ, подходящий для Arageli,
т.е. изменения должены затрагивать
ТОЛЬКО ввод объектов Arageli.

Sergey Lyalin

unread,
Nov 8, 2006, 9:59:25 AM11/8/06
to Arageli
Так. Попробывал я сделать почти так,
как это написано по второй ссылке.
Почему-то выходит ошибка при удалении
std::locale. Вообще, я почти никогда не
работал с этими локале, фасетами и
проч., если кто работал, и сразу увидит,
что сделано не так --- пишите. А то
придётся читать книжку.

Делаю так:

struct nocommapunct : public std::numpunct<char>
{ protected: char do_thousands_sep() const { return 0; } };

nocommapunct ncp;
std::locale oldloc = in.getloc();
in.imbue(std::locale(oldloc, &ncp));
... делаем ввод из in ...
in.imbue(oldloc); /* возвращаем всё как было */

В конце блока, когда удаляется oldloc в
деструкторе срабатывает ассерт, ---
какая-то проблема с памятью.

Sergey Lyalin

unread,
Nov 8, 2006, 12:13:58 PM11/8/06
to Arageli
Оказывается, std::locale автоматически
удаляет переданный фасет ncp. По крайней
мере MSVC++ 2005 ведёт себя именно так.
Поэтому представленный выше фрагмент
работал не корректно.

Замена in.imbue(std::locale(oldloc, &ncp)) на
in.imbue(std::locale(oldloc, new nocommapunct())) похоже,
решает проблему, но надо получить
подтверждение от Страуструпа :) а так
же узнать о получившемся замедлении
при вводе.

Итак, обозначеная проблема с запятыми
в VS2005, похоже, решена. Только что
выгруженная ревизия Arageli (222) будет
работать корректно вводить вектора.

Если у кого-то появятся проблемы из-за
внесённых изменений или комментарии и
пожелания по данной теме, пишите!

Reply all
Reply to author
Forward
0 new messages