|
||
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
28.11.2007, 22:50 | #1 | |
DwgRuLispLib: Преобразование значения в строку
Moderator
LISP, C# (ACAD 200[9,12,13,14])
С.-Петербург
Регистрация: 25.08.2003
Сообщений: 39,790
|
||
Просмотров: 27304
|
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,790
|
Теоретически вариант с проверкой на 'str должен работать быстрее, но практически прирост скорости минимален: с проверкой на str выдает 1610 миллисекунд на выполнение, без проверки - 1656 миллисекунд. Код поменяю. Единственное "но" - к вечеру поближе.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Еще есть предложения для типа real возвращать максимальное количество знаков. Я руководствуюсь тем, что результат _dwgru-conv-value-to-string в строковом виде должен максимально соответствовать оригиналу.
Код:
Код:
__________________
Как использовать код на Лиспе читаем здесь |
||||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,790
|
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 11.10.2004
e•burg
Сообщений: 755
|
Проверить не на чем, но думаю на том же - интерпретатор ЛИСП, врядли переделают уж очень радикально. Но, в принципе, никто не запрещает сделать и (rtos value 2 64) - оно не сломается
|
|||
|
||||
По поводу 12, 15, 64 или что-то еще. Наверное, это должно быть максимальное значение, ограниченное здравым смыслом
__________________
Как использовать код на Лиспе читаем здесь |
||||
|
||||
Регистрация: 11.10.2004
e•burg
Сообщений: 755
|
Здравый смысл, во всех отношения замечательная штука, кроме одного "НО" - он контекстнозависим... Поскольку функция претендует на унивесальность, то ориентироваться надо бы только на технические возможности, так считаю.
|
|||
|
||||
Кстати, насчет здравого смысла и технических возможностей примерчик
Код:
__________________
Как использовать код на Лиспе читаем здесь |
||||
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381
|
Мне кажется, функцию конвертирования надо оставлять "как есть". Что vl-princ-to-string для числа вернет, то и вернет функция.
А форматирование "строковых" чисел делать отдельной функцией. Там тоже может быть много вариантов (лидирующие и завершающие нули, символ десятичной точки). Не надо стремиться всё в одно место загнать. Мне даже rtos пришлось заменять. |
|||
|
||||
Регистрация: 11.10.2004
e•burg
Сообщений: 755
|
Интересное наблюдение - получается, что преобразование rtos производит с бОльшей точностью, чем отображает.
Но, если единственным отличием библиотечной функции от встроенной будет возврат пустой сторки, при отсутствии содержательного значения, то не проще будет прямо в тексте программы набрать: (if value (vl-princ-to-string value) ""), чем искать библиотечную? Потребность именно в такой трактовке nil не выглядит высокой. |
|||
|
||||
>Alaspher
+1
__________________
Как использовать код на Лиспе читаем здесь |
||||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,790
|
То есть, я так понимаю, такая "функция" нафиг не требуется. Зер гуд
P.S. А вот вариант "замены rtos" посмотреть было бы любопытно...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Не правильно понимаете. Такая функция "нафиг" требуется. Речь просто о том, данные на входе и выходе должны совпадать. Только на выходе - строка.
Вызывая функцию (_DWGRU-CONV-VALUE-TO-STRING 'ABCD) я вправе ожидать на выходе "ABCD", а не "ABC" Это же справедливо и для (_DWGRU-CONV-VALUE-TO-STRING 1.111222333444555). На выходе должно быть не "1.11122" как сейчас, а "1.111222333444555". Понятно, что в представлении и обработке вещественных чисел есть нюансы. Но это нюансы надо максимально приблизить к оригиналу c учетом ограничений Автокада. Поэтому и предлагаю для real внести строчку ((= (type value) 'real)(rtos value 2 15)) Назначение такой ф-ции вижу как "Гарантированно возвращать строку, максимально похожую на оригинал"
__________________
Как использовать код на Лиспе читаем здесь |
||||
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381
|
Цитата:
Но подобная функция могла бы быть полезной, если добавить в аргументы значение по умолчанию если value NIL. Для этого варианта умолчанием мог бы быть и NIL, и пустая строка, и что-то еще в зависимости от контекста вызова. Насчет разрядности возврата значений для real всё-таки предлагаю это в отдельную функцию. Почему, например, именно 15 знаков? А если надо не 1.11122 и не 1.111222333444555, а 1.11122300000? Или 0001.11000 |
|||
|
||||
Регистрация: 11.10.2004
e•burg
Сообщений: 755
|
Так вот она и есть, эта отдельная функция. А если и делать копию rtos, то только ради того, чтобы иметь легкоуправляемый возврат хвостовых нулей. Других задач я не вижу.
|
|||
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381
|
Цитата:
Но сейчас, в AutoCAD 2008, rtos возвращает правильный результат. Чувствую себя идиотом |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,790
|
Могу обрадовать - на 2008 сидят далеко не все
(в сторону): Интересно, а кем мне тогда себя чувствовать, когда в 2002 при попытке записать ldata на блок *Model_space* вываливалась ошибка, а в 2005 это нормально работало?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
проектировщик газопроводов Регистрация: 04.08.2005
Петербург
Сообщений: 325
|
Может тогда точность функции rtos задавать переменной? пришло вещественное число в функцию, определяем сколько знаков после запятой и это количество задаем как точность. А то действительно почему точность 15, а не любая другая. В тоже время VVA говорит, что какой число пришло такое же должно и вернуться.
|
|||
|
||||
Регистрация: 11.10.2004
e•burg
Сообщений: 755
|
Именно так и работет rtos - возврат зависит от значения переменных UNITMODE, DIMZIN, LUNITS и LUPREC. Влияние части из них может быть подавлено аргументами при вызове rtos, а части - нет.
|
|||
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381
|
Цитата:
Теперь вспомнил, что когда (rtos -0.5 2 3) может вернуть "-0.5", то (ru-rtos -0.5 3) всегда вернет "-0.500". Совсем плохой стал |
|||
|
||||
Давайте разберемся насчет 15.
Примеры в #11 + эти Код:
1. общая максимальная длинна строки, возвращаемой rtos = 17 2. (rtos xxx yyy 15) и (rtos xxx yyy 16) на результат уже не влияют Еще один эксперимент Код:
b+c -> 11234567890123457182199 Как видно, начиная с 15 знака после запятой точность хранения вещественных чисел не соблюдается. Именно поэтому rtos 15 и rtos 16 на результат не влияют. Это к вопросу, стоит ли биться за 64 знак после запятой. Правильно заметил Alaspher, что затронули rtos, надо решать вопрос с DIMZIN или "делать копию rtos". Вообще я бы не имел "претензий" к vl-princ-to-string, если бы она возвращала знаков 9, а не 5 как сейчас.
__________________
Как использовать код на Лиспе читаем здесь |
||||
|
||||
Функция преобразования числа в строку. Автор Сергей Зуев (ShaggyDoc)
dwgru-conv-real-to-str - Конвертирование числа в строку с заданным количеством знаков после разделителя digit (dwgru-conv-real-to-str -1.2 6) ;_ Результат "-1.200000" Использует функции библиотеки http://dwg.ru/f/showthread.php?t=15661 Код:
__________________
Как использовать код на Лиспе читаем здесь |
||||
|
||||
_dwgru-conv-value-to-string - Преобразование значения value в строку. Для nil возвращает пустую строку.
(_dwgru-conv-value-to-string 123.50) ; "123.5" (_dwgru-conv-value-to-string "qwer") ; "qwer" Использует функцию библиотеки dwgru-conv-real-to-str из поста #26 Код:
__________________
Как использовать код на Лиспе читаем здесь |
||||
|
Опции темы | Поиск в этой теме |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
DwgRuLispLib: Преобразование указателя на примитив в vla | Кулик Алексей aka kpblc | Библиотека функций | 5 | 27.12.2007 13:47 |
DwgRuLispLib: Преобразование указателя на примитив в ename | Кулик Алексей aka kpblc | Библиотека функций | 1 | 27.12.2007 13:30 |
DwgRuLispLib: Преобразование variant или safearray в список | Кулик Алексей aka kpblc | Библиотека функций | 24 | 30.11.2007 18:53 |
задание атрибуту значения имени файла | Паша Горбунов | AutoCAD | 5 | 21.10.2005 19:06 |