24.08.2004, 15:44 | #21 |
Гость
|
все еще хуже: max (enum) -> 250
|
|
25.08.2004, 05:11 | #22 |
Участник
|
Цитата:
Изначально опубликовано mazzy
Нет, уж! Огромное спасибо за вопросы! Побольше бы таких неожиданных и интересных. Как раз материальчик для того раздела. |
|
25.08.2004, 06:05 | #23 |
Участник
|
Всё таки нашел тот топик и еще раз заценил тот глюк с контейнером.
Решил расследовать причины такого странного поведения контейнера и написал следующий Job: (крайне рекомендуется запустить и насладится результатом всем, кто пользовался или собирается пользоваться ф-ей conDel) PHP код:
Особенно рекомендую посмотреть нижнюю часть инфолога. Причина видимо кроется в том, что контейнеры как и любая нормальная динамическая структура выделяет память под свои элементы если в нём не хватает места не по одному элементу, а порциями. Как видно в X++ начальное значение этой порции равно 50 элементов, именно с этого количества элементов в контейнере начинаются страшные глюки. Соответственно в любом контейнере хранятся два параметра - n - реальное число элементов в массиве и m - число элементов под которое выделена память. m может быть больше или равно n. Так вот такое ощущение что conDel в каком то месте ошибочно вместо n обращается к m или наоборот! |
|
|
За это сообщение автора поблагодарили: alex55 (1). |
13.10.2004, 16:18 | #24 |
Участник
|
Вдогонку
real a = -257;
boolean b = a; ; info(strfmt("%1", b)); if (b) { info("все-таки true"); } |
|
13.10.2004, 17:16 | #25 |
Участник
|
static void TestEnum(Args _args)
{ int i, i2; real r, r2; real a = -257; boolean b;// = a; //NoYes b;// = a; ; b = a; info(strfmt("b = %1", b)); // проверяем что же реально хранится в переменной b и видим что там // лежит 255, которое расценивается как true в условии if, но ! // которое strFMT не умеет преобразовывать в строку "Да" или в строку "Нет" i = b; r = b; b = true; // а здесь уже будет лежать единичка info(strfmt("b = %1", b)); i2 = b; // так что strFMT отработает нормально r2 = b; info(strFMT('реальное содержимое при копировании в int %1 ; %2 ', i, i2)); info(strFMT('реальное содержимое при копировании в real %1 ; %2 ', r, r2)); } А все из-за того что фактически вместо boolean используется shortint и при присваивании происходит простое копирование в памяти без проверки типов. |
|
27.11.2008, 11:23 | #26 |
Участник
|
Ну, похоже, что проблемы с преобразованием int в boolean решили между 3.0 и 2009.
|
|
27.11.2008, 12:02 | #27 |
Участник
|
|
|
27.11.2008, 12:13 | #28 |
Роман Долгополов (RDOL)
|
Взял свой же джоб из предыдущих сообщений на 3.0 KR2 все ок. Более свежих версий под рукой сейчас нет, проверьте у кого есть - не раз были случаи что исправленное ранее всплывало снова и снова.
А вообще в очередной раз "порадовала" скорость исправления. Признав ошибку критической правили полтора года и то после неоднократных повторных пинаний |
|
27.11.2008, 12:41 | #29 |
Участник
|
Цитата:
то у меня он выдал 4 раза "ok", как я понимаю, это означает что бага исправлена. Ax KR3 (build 7609) "все ок." - вы имели в виду что бага исправлена ? Или что джоб продолжает ругаться ? Последний раз редактировалось Logger; 27.11.2008 в 12:44. |
|
27.11.2008, 13:37 | #30 |
Роман Долгополов (RDOL)
|
исправлена
|
|
Теги |
recid, баг, ошибка, ax3.0 |
|
Похожие темы | ||||
Тема | Ответов | |||
if (record) vs if (record.RecId) | 18 | |||
Как сформировать RecId | 18 | |||
поля, содержащие RecId | 15 | |||
aEremenko: Дефрагментация RecID | 2 | |||
Два RecId у одной записи таблицы | 33 |
|