26.07.2007, 11:27 | #1 |
Developer
|
Баг? Сравнение строк длиной более 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."); } Последний раз редактировалось vallys; 16.07.2008 в 11:44. |
|
|
За это сообщение автора поблагодарили: aidsua (1), gl00mie (5). |
26.07.2007, 11:40 | #2 |
Программатор
|
Вот чего получилось у меня...
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 |
Developer
|
Да. Все верно... т.е. неправильно сравнивает , как и у меня. Версия аксапты какая?
|
|
26.07.2007, 11:44 | #4 |
Программатор
|
Трешка, СП4. Билд не знаю какой
|
|
26.07.2007, 11:49 | #5 |
Программатор
|
А вот из четверки :
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 |
Developer
|
В четверке значит правильно сравнивает (по крайней мере 32768 символов)... Обидно за тройку...
|
|
16.07.2008, 12:18 | #7 |
Developer
|
Кстати.
Из-за этого бага могут быть проблемы при сравнивании "больших" методов в 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; } |
|
|
За это сообщение автора поблагодарили: mazzy (2), Logger (3). |
Теги |
string, x++, баг, ошибка, ядро, ax3.0 |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|