Возможны ли 64-битные вычисления в LISP?
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Возможны ли 64-битные вычисления в LISP?

Возможны ли 64-битные вычисления в LISP?

Ответ
Поиск в этой теме
Непрочитано 01.03.2011, 15:51 #1
Возможны ли 64-битные вычисления в LISP?
Ax3
 
Programming, automation, CADs, GISs. "Теплоком"
 
Россия, Санкт-Петербург
Регистрация: 02.02.2007
Сообщений: 306

Привет, братья по каду.
В 64-битном каде не смог корректно преобразовать символьное представление 16-ричного (hex) ObjectId, в число для передачи методу ObjectIdToObject.
Строки до "7fffffff" удаётся корректно преобразовать в числа до 2147483647.
А вот число "7ffffb16380" уже выходит за 32-битный диапазон и поэтому преобразуется у меня в -5151872, из него соответственно не удаётся получить объект.

Что делать, можете подсказать?
__________________
На LISPе можно мыслить!
Просмотров: 2066
 
Непрочитано 01.03.2011, 16:01
#2
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 979


http://forum.dwg.ru/showpost.php?p=566244&postcount=8
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 01.03.2011, 16:49
#3
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306


>>Лиспер
Мне надо наоборот - из строкового представления ObjectId получить число. 64-битные ObjectId не удаётся обработать из-за того, что в LISP вычисления 32-битные.
__________________
На LISPе можно мыслить!
Ax3 вне форума  
 
Непрочитано 01.03.2011, 16:58
#4
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 979


В результате надо объект по ObjectID получить? Если да, то чем не нравится vla-objectidtoobject?
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 01.03.2011, 17:17
#5
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306


Объясню ситуацию.
Есть объектный реактор :vlr-SubObjModified. Прицеплен к BlockReference.
В callback-функции реактора не удаётся получить доступ вообще ни к каким свойствам объекта, вызвавшего этот реактор (notifier-object), поскольку на момент отработки кода callback-функции реактора объект то ли открыт для редактирования, то ли ещё х.з. почему. Поправка. Попытка получения vla-свойств приводит к ошибке
"Automation error: Object was open for notifying".
Короче, внутри реактора нельзя получить ни хэндл объекта, ни вообще какие-либо vla-свойства. Более того, даже (entget (vlax-vla-object->ename notifier-object)) возвращает nil.
Я выкрутился с помощью (vl-princ-to-string (vlax-vla-object->ename notifier-object)) (возвращает строку типа "<entity name: 7ec33d40>") и substr для извлечения символьного представления ObjectId.
Далее это символьное представление передаётся как параметр внешней программе, которая дожидается освобождения када и вызывает нужную функцию, передавая уже ей строковое представление ObjectId.
Эта функция преобразует полученную hex-строку в целое число (для передачи методу ObjectIdToObject; математика преобразования элементарная: <младший_разряд>*(16^0) + <следующий_разряд>*(16^1)+<следующий_разряд>*(16^2)+...) и методом ObjectIdToObject получает объект, с которым надо работать.
На x86 всё прекрасно работало, на x64 возник затык с разрядностью.

В общем, если вкратце, то методу ObjectIdToObject надо передавать число, а у меня имеется только hex-строка, которую в 64-битном диапазоне я как раз и не могу корректно преобразовать в число.
__________________
На LISPе можно мыслить!

Последний раз редактировалось Ax3, 01.03.2011 в 18:44.
Ax3 вне форума  
 
Непрочитано 01.03.2011, 17:33
#6
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 979


Я не работал с такими реакторами, поэтому вопрос: notifier-объект - это BlockDefinition или изменяемый в его составе объект?
P.S. А почему бы во внешней программе не попрбовать получить указатель на объект? И возвращать уже его? Или такое не сработает в принципе?
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 01.03.2011, 17:43
#7
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306


В качестве notifier-object функция реактора получает указатель на BlockReference (ну то есть экземпляр блока), атрибуты которого пользователь только что изменил.
Поправка. notifier-object - это vla-объект.

Да, выполнить преобразование во внешней программе - возможно, получится. Даже скорее всего. Но много переделывать придётся.
Впрочем, если в LISP невозможно организовать 64-битные вычисления - куда деваться :-).

Для меня просто сама ситуация выглядит странной - Автокад 64-битный сделали, а LISP работать с 64-битными числами не научили?
__________________
На LISPе можно мыслить!

Последний раз редактировалось Ax3, 01.03.2011 в 18:40.
Ax3 вне форума  
 
Непрочитано 02.03.2011, 00:06
#8
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Ax3 ObjectIdToObject32, хотя тебе явно нужно менять ObjectID на Handle
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 02.03.2011, 09:55
#9
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306


Так в том-то и загвоздка, что не могу в объектном реакторе на событие :vlr-subobjmodified получить хэндл объекта. Как-то нелепо...

Короче, я в своём конкретном случае выкрутился - сохраняю в глобальную переменную с именем tmp__<hex-строка_ObjectId> значение (vlax-vla-object->ename notifier-object), потом оттуда читаю, получается, сразу entity name. Всё работает.

ObjectIdToObject32 не решит проблему, поскольку ей на входе как раз требуется 64-битное значение. Единственное, чем она отличается от ObjectIdToObject (как я понял) - это как раз тем, что она работает с 64-битными входными данными, и в 64-битной системе, я так понимаю, её как раз и надо использовать вместо ObjectIdToObject. Как бы там ни было, у меня не получается сформировать корректные входные данные для этой функции как раз потому, что все мои сложения и умножения при преобразовании строки в число выполняются в 32-битном режиме.

Да в общем, не так важно, я свою конкретную проблему привёл просто в качестве примера ситуации, когда были бы очень кстати 64-битные вычисления.

В общем, я так понял, ответ на заявленный в теме вопрос - нет.
То есть 64-битные вычисления в AutoLISP невозможны.
(Примечание. В AutoCAD до 2009 включительно, в более новых не проверял пока.)
Всё верно?

>>Лиспер. Александр Ривилис
Огромное спасибо за участие!
__________________
На LISPе можно мыслить!

Последний раз редактировалось Ax3, 02.03.2011 в 10:24.
Ax3 вне форума  
 
Непрочитано 02.03.2011, 10:54
#10
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Ax3 Посмотреть сообщение
не могу в объектном реакторе на событие :vlr-subobjmodified получить хэндл объекта
Даже через (entget) ?

Последний раз редактировалось Александр Ривилис, 02.03.2011 в 10:59.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 02.03.2011, 11:04
#11
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306


да. (entget) внутри реактора возвращает nil.
То есть единственное, чем у меня получилось оперировать для передачи указателя на объект между функциями - это entity name.
__________________
На LISPе можно мыслить!

Последний раз редактировалось Ax3, 02.03.2011 в 21:45.
Ax3 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Возможны ли 64-битные вычисления в LISP?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу) Red Nova LISP 5021 сегодня 17:50
{Конкурс} Lisp. Задачки для студентов gomer LISP 10 05.01.2011 16:33
Запуск Lisp команды в новом документе BlackHarp LISP 1 26.03.2009 23:06
LISP на _purge Малюк LISP 12 23.12.2007 18:15
загрузка DOS прог через LISP Gaa LISP 15 12.08.2005 19:19