| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Функция max ограничена 255-тью значениями, можно ли её расширить?

Функция max ограничена 255-тью значениями, можно ли её расширить?

Ответ
Поиск в этой теме
Непрочитано 23.10.2012, 13:22 #1
Функция max ограничена 255-тью значениями, можно ли её расширить?
Klo
 
Инженер-конструктор
 
Юбилейный МО
Регистрация: 29.10.2007
Сообщений: 266

В своём лиспе использовал функцию max для сравнения чисел, но пользователи умудрились превысить максимальное возможное количество чисел для сравнения (как выяснилось - 255 шт.) и теперь приходится исправлять свою недальновидность.
Кто знает как обойти данное ограничение?
Или как написать свой аналог данной функции?
Просмотров: 6394
 
Непрочитано 23.10.2012, 14:12
#2
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Разбить список сравнений на списки по 255 элементов, найти max в каждом, а потом max между ними.
__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Непрочитано 23.10.2012, 14:14
2 | #3
Александр Ривилис

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


Точно ограничена 255? Ничего не путаешь?
Если мне не изменяет память, то (apply 'max number_list) находит максимум из списка чисел number_list, который может быть значительно длиннее чем 255.
Александр Ривилис вне форума  
 
Непрочитано 23.10.2012, 14:16
#4
5hev

roads
 
Регистрация: 22.12.2010
msk
Сообщений: 121
<phrase 1= Отправить сообщение для 5hev с помощью Skype™


Код:
[Выделить все]
 (car(vl-sort  '(1 2 3) 'max))
5hev вне форума  
 
Непрочитано 23.10.2012, 14:19
#5
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Точно ограничена 255? Ничего не путаешь?
Если мне не изменяет память, то (apply 'max number_list)
Точно, не ограничен, специально проверил
Код:
[Выделить все]
(setq i	   1000
      spis nil
)
(repeat	1000
  (setq spis (cons (setq i (1- i)) spis))
)
(apply 'max spis)
работает нормально

Хотя, вручную написал
Код:
[Выделить все]
(max 1 2 3 ... 999)
загрузил в кансоль и ничего, нет ответа, а написал
Код:
[Выделить все]
(max 1 2 3 ... 254)
ответ получил 254

Опять, же как пользователь может задать аргументы вручную а не через список?
__________________
Почему все вдруг становятся умными, когда уже не надо?

Последний раз редактировалось Disney, 23.10.2012 в 14:28.
Disney вне форума  
 
Непрочитано 23.10.2012, 14:51
#6
5hev

roads
 
Регистрация: 22.12.2010
msk
Сообщений: 121
<phrase 1= Отправить сообщение для 5hev с помощью Skype™


Может, ограничено не количество аргументов у функции max, а количество аргументов у функций в принципе?
Когда мы запускаем apply, мы кормим его списком значений, а max ест числа как отдельные аргументы.
Поправьте, если не прав
5hev вне форума  
 
Автор темы   Непрочитано 23.10.2012, 15:26
#7
Klo

Инженер-конструктор
 
Регистрация: 29.10.2007
Юбилейный МО
Сообщений: 266


Я проверял таким образом:
Код:
[Выделить все]
 (setq mlist (list 1) count 0)
(while (setq tm (eval (cons 'max mlist)))
       (setq mlist (append mlist '(1)))
       (setq count (1+ count))
       (princ (strcat "\n" (itoa count)))
)
Попробую предложенные варианты...
Попробовал так:
Код:
[Выделить все]
 (setq mlist (list 1) count 0)
(while (setq tm (apply 'max mlist))
       (setq mlist (append mlist '(1)))
       (setq count (1+ count))
       (princ (strcat "\n" (itoa count)))
)
После нескольких минут надоело ждать, нажал abort evaluation. Получилось примерно 40000

Последний раз редактировалось Klo, 23.10.2012 в 16:07. Причина: проверил
Klo вне форума  
 
Непрочитано 23.10.2012, 15:40
1 | #8
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Хм, действительно забавно, всплыло еще 1 ограничение автолиспа:
Код:
[Выделить все]
Команда: (defun ml(x) (if (not (zerop x)) (cons x (ml (1- x)))))
ML

Команда: (ml 10)
(10 9 8 7 6 5 4 3 2 1)

Команда: (apply 'max (ml 1000))
1000

Команда: (eval (cons max (ml 255)))
255

Команда: (eval (cons max (ml 256)))
; ошибка: неверное значение аргумента: does not fit in byte: 256

Команда: (apply '+ (ml 256))
32896

Команда: (eval (cons + (ml 255)))
32640

Команда: (eval (cons + (ml 256)))
; ошибка: неверное значение аргумента: does not fit in byte: 256
В общем по ходу это у всех функций...
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 23.10.2012 в 15:55.
Дима_ вне форума  
 
Непрочитано 23.10.2012, 16:29
#9
5hev

roads
 
Регистрация: 22.12.2010
msk
Сообщений: 121
<phrase 1= Отправить сообщение для 5hev с помощью Skype™


Дима_, у меня на х64 пишет вот что:
внутреннее ограничение: слишком много аргументов при обращении
к функции: #<SUBR
5hev вне форума  
 
Непрочитано 23.10.2012, 16:35
#10
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


а для чего использовать такое большое количество аргументов? Почему не передавать в функцию переменную, указывающую на нужный массив данных?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 23.10.2012, 16:45
#11
5hev

roads
 
Регистрация: 22.12.2010
msk
Сообщений: 121
<phrase 1= Отправить сообщение для 5hev с помощью Skype™


hwd, шутите? Для max такое не прокатит. Тем не менее, я ждал, когда подтянется серьезная публика, чтобы спросить, а как на уровне памяти все это можно объяснить? Ведь КАД написан не на лиспе, и упомянутая функция вызывает другую, написанную на одном из языков .NET
5hev вне форума  
 
Непрочитано 23.10.2012, 16:56
#12
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от 5hev[ru
;988188]hwd, шутите? Для max такое не прокатит.
Я не знаю, как это работает, потому и спрашиваю. Как я понял, для адресации параметров функции выделен 1 байт. Например в .NET этого хватило бы за глаза. Наверняка и в Lisp есть какие-то причины на то.
На моём ломанном языке это что-то вроде такого:
Код:
[Выделить все]
 
(setq x '(1 2 3 ... 1000))
(apply 'max x)
Тут получается, что в каждой строке у каждой функции по два аргумента, а массив засунут в список. Чем такой подход плох, для чего пытаться передавать содержимое всего массива в виде аргументов? Все типы чисел конечны и byte, и int - ограничение по длине неизбежно в любом случае, поэтому, как мне кажется, не стоит пытаться в виде аргументов посимвольно передавать содержимое Большой Советской Энциклопедии - лучше её передать по ссылке, это займёт всего один аргумент. При таком подходе ограничение в 256 параметров - более чем достаточно.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 23.10.2012 в 17:11.
hwd вне форума  
 
Непрочитано 23.10.2012, 17:11
#13
5hev

roads
 
Регистрация: 22.12.2010
msk
Сообщений: 121
<phrase 1= Отправить сообщение для 5hev с помощью Skype™


hwd, Ваш вопрос и был вопросом автора - подход с обертками типа apply, vl-sort, etc. выручает. Однако недокументированные ограничения все же вызывают удивление и интерес.
Получается, в объявлении функции на том же Си, параметр данной функции с такими ограничениями, был бы задан как, например, double arr[255] ?
5hev вне форума  
 
Непрочитано 23.10.2012, 17:16
1 | #14
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от 5hev[ru
;988197]Получается, с объявлении функции на том же Си, параметр был бы задан как, например, double arr[255] ?
Нет, на C сигнатура функции max выглядела бы примерно так:
Код:
[Выделить все]
double max (const unsigned int count, const double *items);
первый аргумент указывает количество элементов, а второй - указатель на массив. Если массив слишком велик, то первый параметр может быть объявлен как unsigned long.

Но применительно к данной ситуации (когда количество аргументов не может превышать 256), определение выглядело бы так:
Код:
[Выделить все]
double max (const unsigned char count, const double *items);
unsigned char - это беззнаковый тип, размер которого всегда (в отличие от др.) равен одному байту.

Цитата:
Однако недокументированные ограничения все же вызывают удивление и интерес.
Ну, теперь вы знаете, что под адресацию параметров функции в лиспе отводится всего 1 байт.

Цитата:
подход с обертками типа apply, vl-sort, etc.
я бы не стал называть это "обёртками", хотя в лиспе это может так и называется...
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 23.10.2012 в 19:08.
hwd вне форума  
 
Автор темы   Непрочитано 23.10.2012, 19:25
#15
Klo

Инженер-конструктор
 
Регистрация: 29.10.2007
Юбилейный МО
Сообщений: 266


Долго мучился, но проблема не решена.
Странно, но: строчка
Код:
[Выделить все]
 (setq max_number (apply 'max lst_numbers))
, где lst_numbers - список из 392-х чисел
при вызове программы выдаёт: internal restriction: too many arguments in function call: MAX
если вставить эту строку в командную строку автокада вручную (без вызова программы), то она нормально обрабатывается и выдаёт максимальное число.
Из-за чего это может быть ума не приложу?
Klo вне форума  
 
Непрочитано 23.10.2012, 19:53
#16
5hev

roads
 
Регистрация: 22.12.2010
msk
Сообщений: 121
<phrase 1= Отправить сообщение для 5hev с помощью Skype™


Цитата:
Сообщение от Klo Посмотреть сообщение
Долго мучился, но проблема не решена.
Очевидно, в другой строчке проблема. Потому что я запустил со списком из 557 элементов, и все работает прекрасно.
Может, выложите функцию?
5hev вне форума  
 
Непрочитано 23.10.2012, 20:19
#17
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844


В порядке бреда: попробуйте хотя бы одно из значений сделать не целым.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.10.2012, 20:33
#18
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Не сравниваете методы вызова функций в си и лиспе, то что функция работает через apply, но не работает через eval cons ... это 100% косяк, полагаю уходящий корнями во времена когда каждый байт был на счету и автодесковцы вместо нормального транслятора лиспа, поставили эту аццкую смесь (тогда это возможно было оправданно производительностью, но явно не сейчас). Си это язык ориентированный на архитектуру процессора, лисп, по спцификации нет, а автолисп это серединка на половинку. Вот лог из нормального диалекта лиспа - plt/scheme он же Racket:
Код:
[Выделить все]
 > (define (ml x) (if (zero? x) '() (cons x (ml (sub1 x)))))
> (apply + (ml 10000))
50005000
> (eval (cons + (ml 10000)))
50005000
Второй естественно работает сильно медленней, но он как и положенно лиспу, делает в точности то что его просят, вне зависимости от разрадности процессора и пр.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 23.10.2012, 23:13
1 | #19
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


похоже, пора и мне отметиться...
После выхода 2008 акада, я уже делал тему по этой ошибке, точнее ограничению, которое связано с памятью.
Помнится, большое обсуждение было на болоте.
Выход был по увеличению памяти для переменных лиспа, перед вызовом подобных функций или переписывание функций на итеративные методы.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 24.10.2012, 11:40
#20
Klo

Инженер-конструктор
 
Регистрация: 29.10.2007
Юбилейный МО
Сообщений: 266


to 5hev[ru]: с удовольствием выложу, но не уверен, что кто-то захочет в чужом коде разбираться.
Если кто найдёт, где я напортачил, тому спасибо!
Прилагаю:
1. Чертёж, в котором 256 блоков и полилиния.
2. Лисп файлик areablock.lsp и вспомогательный лисп, использующийся в areablock.lsp.
При удалении одного блока из файла, всё нормально обрабатывается и вставляется блок со следующим порядковым нумером.
Вложения
Тип файла: dwg
DWG 2007
test01.dwg (140.0 Кб, 1561 просмотров)
Тип файла: lsp areablock.lsp (7.3 Кб, 32 просмотров)
Тип файла: lsp ext_number.lsp (860 байт, 28 просмотров)
Klo вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Функция max ограничена 255-тью значениями, можно ли её расширить?

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цветовые схемы вкладки модель gomer Готовые программы 63 17.01.2014 07:28
RGB составляющие индексных цветов автокада zamtmn Программирование 26 23.10.2012 01:31
Нелинейный расчет и РСУ??? bivis333 Конструкции зданий и сооружений 240 23.01.2010 18:39