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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > проверка полей dcl формы, вылетает ошибка

проверка полей dcl формы, вылетает ошибка

Ответ
Поиск в этой теме
Непрочитано 27.04.2012, 18:13 #1
проверка полей dcl формы, вылетает ошибка
autocadhelp
 
Регистрация: 13.04.2012
Сообщений: 13

Написал функцию для проверки текстовых полей в autocad в dcl-форме
Код:
[Выделить все]
(defun check()
(setq w (get_tile "w")) 
(setq h (get_tile "h"))
(progn
  (if (>= w 300)
    (progn
       (set_tile 200)
nil
)
(if (>= h 20)
(progn
(set_tile "40")
nil
)))))
но автокад в командной строке выдал ошибку:
; ошибка: неверный тип агрумента для сравнения: "100" 250
никак не пойму, что я мог не правильно сделать. подскажите пожалуйста. Заранее спасибо.
Просмотров: 3758
 
Непрочитано 27.04.2012, 18:28
#2
Александр Ривилис

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


h и w имеют строковое значение, а сравнивать строку и целое операцией >= недопустимо...
Александр Ривилис вне форума  
 
Непрочитано 27.04.2012, 18:37
#3
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от autocadhelp Посмотреть сообщение
никак не пойму, что я мог не правильно сделать.
Господи, где ж вы такие беретесь? Ты хоть сам понял, что написал?
gomer вне форума  
 
Автор темы   Непрочитано 27.04.2012, 19:02
#4
autocadhelp


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


Цитата:
Сообщение от gomer Посмотреть сообщение
Господи, где ж вы такие беретесь? Ты хоть сам понял, что написал?
мы только еще учимся автолиспу )).
Да, понял, что я написал. Я пытался сравнить значение 300 с числом из текстового поля, и если оно больше, то вывести сообщение.
Т.е. получается надо написать так
Код:
кстати, такая же ошибочка с применением функции atoi

Последний раз редактировалось autocadhelp, 27.04.2012 в 19:29.
autocadhelp вне форума  
 
Непрочитано 27.04.2012, 19:49
#5
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от autocadhelp Посмотреть сообщение
понял, что я написал.
а я вот не понял... какое сообщение. у тебя в коде никаких сообщений! а к чему
Код:
[Выделить все]
 (set_tile "40")
это раз ошибка
а к чему
Код:
[Выделить все]
 (set_tile 200)
это еще два ошибка
а если w меньше 300, h можно не проверять?

а к чему
Код:
[Выделить все]
 (progn
       (set_tile 200)
nil
)
если set_tile возвращает nil и вообще при любом раскладе check вернет nil, что ты собрался проверять?
а к чему первый progn, откуда такая паранойя?
в 13 строках кода 7 ошибок
gomer вне форума  
 
Автор темы   Непрочитано 27.04.2012, 19:54
#6
autocadhelp


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


блин. Почему у меня компилятор не ругается.

Сейчас перестало ругаться на синтаксис. Сначала функцию вставлял при нажатию на кнопку ок, то кнопка не нажималась.
Вставил фуннкцию в главную программ. Никакой реакции на неправильный ввод.

Код:
[Выделить все]
(defun check ()
   setq w (atoi (get_tile "w"))
   setq h (atoi (get_tile "h"))
(if (>= (atoi w) 250)
        (set_tile "error" "íàäî 240"))
(if (>= (atoi h) 20)
        (set_tile "error" "íàäî 40"))
)
Посоветуйте еще хороший учебник, где в примерах не будет ошибок. А то как раз паранойю из progn я оттуда взял и пытаюсь привести в рабочее состояние в своей программе.

Сейчас стало выдавать такую ошибку "ошибка: неверный тип аргумента: stringp nil"

Последний раз редактировалось autocadhelp, 27.04.2012 в 20:14.
autocadhelp вне форума  
 
Непрочитано 27.04.2012, 21:40
#7
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


autocadhelp, сначала думай потом пиши, впрочем я не удивлен...
НУ ПОЧЕМУ ТЫ ПРЕОБРАЗОВЫВАЕШЬ ЦЕЛОЕ В ЦЕЛОЕ? Тебе одного преобразования мало? И почему не может быть w = 250, понимаю когда w=251 не может быть
ну и не копируй из vlide сюда у них разные кодировки и в кракозябрах желания нет особого разбираться
ну и скобки где, растеряша?

Код:
[Выделить все]
 (defun check ()
  (setq w (get_tile "w")
        h (get_tile "h"))
  (set_tile
    "error"
    (cond
      ((< 250 (atoi w))
         "Ширина больше допустимого значения! Рекомендуемое значение w - 240"
      )
      ((> 20 (atoi h))
         "Высота меньше допустимого значения! Рекомендуемое значение h - 40 "
      )
      (T "")
    )
  )
)
вот держи, найддешь где тут ошибка, будет тебе счастье
зы если h больше 20, то легко h = 40

Последний раз редактировалось gomer, 27.04.2012 в 21:50. Причина: сам ошибся ^_^
gomer вне форума  
 
Автор темы   Непрочитано 27.04.2012, 22:00
#8
autocadhelp


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


Спасибо.
ошибка: неверный тип аргумента: stringp nil
Попробую разобраться в чем там ошибка. Компилятор их не нашел. Только перевод этой ошибки не ясен.
Видимо это из за этой фигни
(action_tile "accept" "(done_dialog 1) (check_dat)")
autocadhelp вне форума  
 
Непрочитано 27.04.2012, 22:48
#9
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от autocadhelp Посмотреть сообщение
ошибка: неверный тип аргумента: stringp nil
Цитата:
Сообщение от autocadhelp Посмотреть сообщение
Видимо это из за этой фигни
(action_tile "accept" "(done_dialog 1) (check_dat)")
это ты потому что ты скармливаешь функции atoi nil: сравни (atoi nil) и (atoi "250")

А происходит это потому, что берешь значение h и w уже после закрытия диалога, это как минимум нелогично
по сути тебе нужна функция отклика на кнопку accept
Код:
[Выделить все]
 (defun accept_clk ()
  (setq w (atoi (get_tile "w"))
        h (atoi (get_tile "h")))
  (cond
    ((< 250 w)
      (set_tile
        "error"
         "Ширина больше допустимого значения! Рекомендуемое значение w - 240"
      )
    )
    ((> 20 h)
      (set_tile
        "error"
        "Высота меньше допустимого значения! Рекомендуемое значение h - 40 "
      )
    )
    (T (done_dialog 1))
  )
)
например такая
gomer вне форума  
 
Автор темы   Непрочитано 28.04.2012, 11:40
#10
autocadhelp


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


Пробовал, пробовал. Такое ощущение что на кнопку ок не реагирует.
-оставлял только эту функцию
-писал название функции в главной программе
непомогло. Рисует даже при 300, 400 и более размерах.
autocadhelp вне форума  
 
Непрочитано 28.04.2012, 11:50
#11
Кулик Алексей aka kpblc
Moderator

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


Полный код (т.е. lsp и dcl) выкладывай.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.04.2012, 14:24
#12
autocadhelp


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


Вложил файлы в прикрепленном файле.
Вложения
Тип файла: rar prog.rar (1.6 Кб, 38 просмотров)
autocadhelp вне форума  
 
Непрочитано 28.04.2012, 18:20
#13
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


нахерато харакири
Код:
[Выделить все]
prog : dialog {
   label = "Рисование детали ";
  : row {
    : boxed_column {
      label = "Эскиз";
      : image {
        key = "img";
        aspect_ratio = 0.64;
        width = 40;
        color = 136;
      }
    }
    : boxed_column {
      label = "Размеры";
      : edit_box {
        key        = "w";
        label      = "Длина, w: ";
        value      = "100";
        edit_width = 4;
        edit_limit = 3;
      }
      : edit_box {
        key        = "h";
        label      = "Ширина, h: ";
        value      = "50";
        edit_width = 4;
        edit_limit = 2;
      }
      : edit_box {
        key        = "v";
        label      = "Высота, v: ";
        value      = "10";
        edit_width = 4;
        edit_limit = 2;
      }
    }
  }
  spacer;
  ok_cancel_err;
}
Код:
[Выделить все]
 (defun c:prog ( / dcl_id h w pt accept_clk *error*)

  (defun *error* (msg) (princ))
  
  (defun accept_clk ()
    (setq w (atoi (get_tile "w"))
          h (atoi (get_tile "h"))
          v (atoi (get_tile "v"))
    )
    (cond
      ((< 250 w) (set_tile "error" "Ширина больше допустимого значения! Рекомендуемое значение w - 240"))
      ((> 20  h) (set_tile "error" "Высота меньше допустимого значения! Рекомендуемое значение h - 40 "))
      (T (done_dialog 1))
    )
  )
;;; загрузка диалога
   (if (> 0 (setq dcl_id (load_dialog "prog.dcl"))) ; (findfile "prog.dcl")
    (progn
      (alert "Выбранный диалог не загрузился")
      (exit)
    )
  )
;;; создание диалога
  (if (not (new_dialog "prog" dcl_id))
    (progn
      (alert "Выбранный диалог не создан")
      (exit)
    )
  )

  (action_tile  "accept"  "(accept_clk)")
  (action_tile  "cancel"  "(done_dialog 0)")
 
  (setq dcl_rt (start_dialog))
  (unload_dialog dcl_id)
  
  (if (zerop dcl_rt)
    (prompt "\nОтмена пользователем")
    (if (setq pt (getpoint "\nУкажите точку вставки: "))
      (progn
        (setq osm (getvar "OSMODE") cmd (getvar "CMDECHO"))
        (setvar "OSMODE" 0) (setvar "CMDECHO" 0) ; отключаем привязку и эхо команд
        (command "_box" pt  "_L" h w v "")
        (setq *box* (entlast))
        (setvar "OSMODE" osm) (setvar "CMDECHO" cmd)
      )
    )
  )
  (princ)
)

Последний раз редактировалось gomer, 28.04.2012 в 18:28.
gomer вне форума  
 
Автор темы   Непрочитано 28.04.2012, 19:22
#14
autocadhelp


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


Цитата:
нахерато харакири

cпасибо большое.

Последний раз редактировалось autocadhelp, 28.04.2012 в 19:58.
autocadhelp вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > проверка полей dcl формы, вылетает ошибка

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка балки на устойчивость плоской формы деформирования hotik Деревянные конструкции 69 27.02.2024 13:14
Проверка связей в Лире-СТК по гибкости не соответствует ручному расчету. Ошибка программы или...? Alive_creep Расчетные программы 8 26.12.2011 11:16
Ошибка при компилировании формы engenerit AutoCAD 2 30.09.2011 11:59
Несоответствие результатов в Лире s.vas Лира / Лира-САПР 19 11.11.2009 07:31
Помощь по Лире Серега М Лира / Лира-САПР 52 28.05.2007 02:47