AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: База знаний и проекты
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.07.2007, 11:27   #1  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Баг? Сравнение строк длиной более 32767 символов
Приветствую участников форума.
В поиске был. Наверное плохо искал

Собственно, в чем неприятность заключается...
При использовании логических операторов "==", ">" и т.п. для переменных типа str сравнение происходит только по первым 32767 символам (это я так предполагаю ). При чем функция strcmp(...) отрабатывает правильно.
Из-за этой ошибки стандарнтое сравнение работает не верно для "больших" методов. Наткнулся давно, а посмотрел в чем дело только сейчас.

Вопрос: Присутствует ли такая багофича в последних версиях (тройки) или уже исправили? Или может это только у меня так?

Ax 3.0 SP2 (build 1951.2410).

Тестовый джоб:
X++:
static void tmp_BugStrCheck(Args _args)
{
    #define.len(32767)
    #define.suflen(1)
    str         s1;
    str         s2;
    int         i;
    ;
    s1 = strrep("A", #len) + strrep("B", #suflen);
    s2 = strrep("A", #len) + strrep("C", #suflen);

    info(strfmt("The length of s1 (must be %1): %2", #len+#suflen, strlen(s1)));
    info(strfmt("The length of s2 (must be %1): %2", #len+#suflen, strlen(s2)));

    if (substr(s1, #len+1, 1) == substr(s2, #len+1, 1)) // false - ok
        info(strfmt("Bug? Symbols at pos. %1 are eq.", #len+1));
    else
        info(strfmt("Check: Symbols at pos. %1 are not eq. Good...", #len+1));

    if (strcmp(s1, s2) == 0) // false - ok
        info("Function 'strcmp(...)': Bug? Strings s1 and s2 are eq. This is WRONG.");
    else
        info("Function 'strcmp(...)': Strings s1 and s2 are not eq. This is Ok.");

    if (s1 == s2) // true - error
        info("Operator '==': Bug? Strings s1 and s2 are eq. This is WRONG.");
    else
        info("Operator '==': Strings s1 and s2 are not eq. This is Ok.");

    if (s1 < s2) // false - error
        info("Operator '<': String s1 are less then s2. This is Ok.");
    else
        info("Operator '<': Bug? String s1 are not less then s2. This is WRONG.");
}
P.S. Кстати, 32767 = 2^16 / 2 - 1

Последний раз редактировалось vallys; 16.07.2008 в 11:44.
За это сообщение автора поблагодарили: aidsua (1), gl00mie (5).
Старый 26.07.2007, 11:40   #2  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Вот чего получилось у меня...

Info Сообщение (11:43:02) The length of s1 (must be 32768): 32768
Info Сообщение (11:43:02) The length of s2 (must be 32768): 32768
Info Сообщение (11:43:02) Check: Symbols at pos. 32768 are not eq. Good...
Info Сообщение (11:43:02) Function 'strcmp(...)': Strings s1 and s2 are not eq. This is Ok.
Info Сообщение (11:43:02) Operator '==': Bug? Strings s1 and s2 are eq. This is WRONG.
Info Сообщение (11:43:02) Operator '<': Bug? String s1 are not less then s2. This is WRONG.

ЗЫ: СП4
За это сообщение автора поблагодарили: vallys (1).
Старый 26.07.2007, 11:42   #3  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Да. Все верно... т.е. неправильно сравнивает , как и у меня. Версия аксапты какая?
Старый 26.07.2007, 11:44   #4  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Трешка, СП4. Билд не знаю какой
Старый 26.07.2007, 11:49   #5  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
А вот из четверки :

Info Сообщение (11:52:33) The length of s1 (must be 32768): 32768
Info Сообщение (11:52:33) The length of s2 (must be 32768): 32768
Info Сообщение (11:52:33) Check: Symbols at pos. 32768 are not eq. Good...
Info Сообщение (11:52:33) Function 'strcmp(...)': Strings s1 and s2 are not eq. This is Ok.
Info Сообщение (11:52:33) Operator '==': Strings s1 and s2 are not eq. This is Ok.
Info Сообщение (11:52:33) Operator '<': String s1 are less then s2. This is Ok.
Старый 26.07.2007, 11:51   #6  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
В четверке значит правильно сравнивает (по крайней мере 32768 символов)... Обидно за тройку...
Старый 16.07.2008, 12:18   #7  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Кстати.
Из-за этого бага могут быть проблемы при сравнивании "больших" методов в Ax 3.
Например, при импортировании CustVendSettle с изменениями в конце метода settleNow() стандартная сравнивалка изменений не заметит.
Так что для тройки желательно подправить SysCompare.strCompare(), например, так:

X++:
boolean strCompare(str s1, str s2, boolean source=true)
{
    if (_suppressWhiteSpace && source)
    {
        s1 = SysCompareText::suppressWhiteSpace(s1);
        s2 = SysCompareText::suppressWhiteSpace(s2);
    }
    if (_caseSensitive)
        return strCmp(s1,s2) == 0;

    // бла бла бла -->
    // Баг в Ax 3. Неправильное сравнение строк длиной более 32767 символов
    // Исправлено в AX 4
    if (strlen(s1) > 32767 || strlen(s2) > 32767)
        return strCmp(strUpr(s1), strUpr(s2)) == 0;
    // бла бла бла <--

    return s1 == s2;
}
Можно еще проверять версию аксапты как, например, тут: .#ifdef.ax4
За это сообщение автора поблагодарили: mazzy (2), Logger (3).
Теги
string, x++, баг, ошибка, ядро, ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Сортировка и сравнение строк Perc DAX: Программирование 14 25.08.2010 20:06
Как создать поле длиной более 255 символов? novic DAX: Программирование 13 18.05.2009 19:58
Тормозит копирование строк в буфер обмена ivas DAX: Программирование 20 21.08.2007 15:05
баг в 2.5. Будьте осторожнее с символом "_" подчеркивание levsha DAX: Программирование 5 07.12.2004 12:26
БАГ: копирование строк накладных в новый заказ Антон Солдатов DAX: Функционал 2 03.12.2004 09:02

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 08:56.