Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Дмитрий Загорулькин от 02-04-2019, 17:33:11

Название: Point3dCollection возвращает точку после последней. Баг?
Отправлено: Дмитрий Загорулькин от 02-04-2019, 17:33:11
Вот такой код:
Код - C# [Выбрать]
  1. [CommandMethod("TestPoint3dCollection")]
  2. public void TestPoint3dCollectionCmd()
  3. {
  4.     Point3dCollection col = new Point3dCollection();
  5.     col.Add(new Point3d(1.0, 2.0, 3.0));
  6.     string msg
  7.         = $"Всего точек в коллекции: {col.Count} шт.";
  8.  
  9.     for (int i = 0; i <= col.Count + 1; i++)
  10.     {
  11.         msg += $"\n\nТочка № {i + 1}: ";
  12.         try
  13.         {
  14.             Point3d pt = col[i];
  15.             msg += $"X={pt.X:0.####}, Y={pt.Y:0.####}, Z={pt.Z:0.####}";
  16.         }
  17.         catch (System.Exception ex)
  18.         {
  19.             msg += ex.Message;
  20.         }
  21.         msg += "\nЕё индекс в коллекции: ";
  22.         try
  23.         {
  24.             msg += col.IndexOf(col[i]);
  25.         }
  26.         catch (System.Exception ex)
  27.         {
  28.             msg += ex.Message;
  29.         }
  30.     }            
  31.  
  32.     Application.ShowAlertDialog(msg);
  33. }        
  34.  
Результат - на скриншоте. Как думаете, это баг?
Название: Re: Point3dCollection возвращает точку после последней. Баг?
Отправлено: Александр Ривилис от 02-04-2019, 17:40:25
Как думаете, это баг?
Да. Кстати, можно дисассемблемом этот класс посмотреть. Там хорошо видно, что если "индекс <= количество элементов" вместо "индекс < количество элементов", то исключения нет. Но подозреваю, что это никто исправлять не будет. Может возникнуть побочный эффект.
Название: Re: Point3dCollection возвращает точку после последней. Баг?
Отправлено: Дмитрий Загорулькин от 02-04-2019, 17:53:07
Попробовал тот же фокус с ObjectIdCollection - ей вообще всё равно какой индекс! Если он выходит за диапазон - просто возвращается ObjectId.Null. В общем, я понял - надеяться на исключение IndexOutOfRangeException при работе со встроенными коллекциями AutoCAD не стоит...
Код - C# [Выбрать]
  1. [CommandMethod("TestObjectIdCollection")]
  2. public void TestObjectIdCollectionCmd()
  3. {
  4.     Database db = Application.DocumentManager.MdiActiveDocument.Database;
  5.     ObjectIdCollection col = new ObjectIdCollection();
  6.     col.Add(db.CurrentSpaceId);            
  7.  
  8.     int i = -10000;
  9.  
  10.     bool isOk;
  11.  
  12.     do
  13.     {
  14.         try
  15.         {
  16.             ObjectId id = col[i++];
  17.             isOk = true;
  18.         }
  19.         catch
  20.         {
  21.             isOk = false;
  22.         }                
  23.     } while (isOk && i < 10000);
  24.  
  25.     Application.ShowAlertDialog($"Index: {i}, status: {isOk}");          
  26. }        
  27.  
Название: Re: Point3dCollection возвращает точку после последней. Баг?
Отправлено: avc от 02-04-2019, 18:23:31
надеяться на исключение
надеяться на исключение - это уже какая-то неправильная логика. ИМХО
Название: Re: Point3dCollection возвращает точку после последней. Баг?
Отправлено: Александр Ривилис от 02-04-2019, 19:04:15
Попробовал тот же фокус с ObjectIdCollection - ей вообще всё равно какой индекс! Если он выходит за диапазон - просто возвращается ObjectId.Null.
Угу:
Код - C# [Выбрать]
  1.         public unsafe ObjectId this[int index]
  2.         {
  3.                 get
  4.                 {
  5.                         AcArray<AcDbObjectId,AcArrayMemCopyReallocator<AcDbObjectId> >* impObj = GetImpObj();
  6.                         ObjectId result;
  7.                         result.m_id = *(long*)((long)index * 8L + *(long*)impObj);
  8.                         return result;
  9.                 }
  10.                 set
  11.                 {
  12.                         AcArray<AcDbObjectId,AcArrayMemCopyReallocator<AcDbObjectId> >* impObj = GetImpObj();
  13.                         *(long*)((long)index * 8L + *(long*)impObj) = *(long*)(&value);
  14.                 }
  15.         }
Название: Re: Point3dCollection возвращает точку после последней. Баг?
Отправлено: Дмитрий Загорулькин от 04-04-2019, 11:29:45
надеяться на исключение - это уже какая-то неправильная логика. ИМХО
Я имел в виду, что раньше была надежда, что если вдруг где-то ошибся с индексами - словишь исключение. И по этому поводу голова не болела. Сейчас ещё и это надо держать в уме.
Название: Re: Point3dCollection возвращает точку после последней. Баг?
Отправлено: Привалов Дмитрий от 04-04-2019, 11:47:42
Сейчас ещё и это надо держать в уме.
Скорее всего это еще одна причина, почему AutoCAD фаталит на ровном месте.....в уме разработчиков уже не укладываются многочисленные исключения из правил.
Название: Re: Point3dCollection возвращает точку после последней. Баг?
Отправлено: Дмитрий Загорулькин от 04-04-2019, 12:23:02
:)
Это же внешний API. Не думаю, что его используют для внутреннего функционала.
Название: Re: Point3dCollection возвращает точку после последней. Баг?
Отправлено: Александр Ривилис от 04-04-2019, 12:25:35
:)
Это же внешний API. Не думаю, что его используют для внутреннего функционала.
Почему нет? Часть managed модулей в AutoCAD использует AutoCAD .NET API так же как native-модули используют ObjectARX.
Название: Re: Point3dCollection возвращает точку после последней. Баг?
Отправлено: Привалов Дмитрий от 04-04-2019, 12:28:14
Стало интересно сколько людей трудится над созданием и тестированием AutoCAD, сотни(тысячи), но не нашел. (((

Кому интересно, наткнулся на небольшую статью про тестирование AutoCAD
http://isicad.ru/ru/articles.php?article_num=14676 (http://isicad.ru/ru/articles.php?article_num=14676)

Название: Re: Point3dCollection возвращает точку после последней. Баг?
Отправлено: Александр Ривилис от 04-04-2019, 12:33:18
Стало интересно сколько людей трудится над созданием и тестированием AutoCAD, сотни(тысячи), но не нашел. (((

Кому интересно, наткнулся на небольшую статью про тестирование AutoCAD
http://isicad.ru/ru/articles.php?article_num=14676 (http://isicad.ru/ru/articles.php?article_num=14676)


Этой статье уже восемь лет. А вот и живое выступление Михаила Белиловского:

Название: Re: Point3dCollection возвращает точку после последней. Баг?
Отправлено: Привалов Дмитрий от 04-04-2019, 12:52:50
Вот посвежее
http://isicad.ru/ru/articles.php?article_num=19038 (http://isicad.ru/ru/articles.php?article_num=19038)

из статьи....AutoCAD R13 был настолько плох, его очень плохо покупали, компания была в критическом состоянии и могла развалиться. Но ничего, выжила и смогла улучшить продукт.
хм, никогда бы не подумал что одна неудачная версия могла потопить Autodesk.
Название: Re: Point3dCollection возвращает точку после последней. Баг?
Отправлено: Александр Ривилис от 04-04-2019, 13:12:02
хм, никогда бы не подумал что одна неудачная версия могла потопить Autodesk.
Тогда (в 1994-ом) в портфеле Autodesk был только AutoCAD. И тогда версии AutoCAD не "клепали" каждый год.