AutoCAD... AutoLISP... VisualLISP...

  [5] getINT i getREAL

index  

  Podstawowym warunkiem poprawnego działania każdego programu, jest odpowiednie wprowadzenie danych wejściowych. Szczególnie ma to znaczenie w sytuacjach gdy dane pobierane są od użytkownika. Domniemanie że dane zostaną podane poprawnie (a tym samym że program będzie działał), opiera się na zbyt kruchym fundamencie. Jest też jednym z najczęściej spotykanych błędów w programach lisp-owych. Odpowiednie filtrowanie i sprawdzenie danych pobieranych od użytkownika zmniejsza ryzyko wystąpienia błędów, a można osiągnąć to w stosunkowo prosty sposób. Na początek pobranie danych w postaci liczby całkowitej albo rzeczywistej. Poniżej przykładowa funkcja zapewniająca pobranie takich danych z określonego zakresu.
; Funkcja oczekuje od użytkownika podania liczby INT / REAL z określonego zakresu.
; (jk:GET_Numb [Tp Msg Init Mini Maxi])
; Argumenty:
; Tp [STR] - określenie typu liczby: "R" dla liczby rzeczywistej, "I" dla całkowitej
; Msg [STR] - zgłoszenie
; Init [INT] - liczba całkowita zakodowana bitowo - tak jak dla initget czyli:
;             0 - uniemożliwia podanie odpowiedzi pustej (ENTER)
;             2 - uniemożliwia podania liczby zero
;             4 - uniemożliwia podania liczby ujemnej
; Mini [INT,REAL] - liczba określająca minimalną dopuszczalną liczbę
; Maxi [INT,REAL] - liczba określająca maksymalną dopuszczalną liczbę

(defun jk:GET_Numb (Tp Msg Init Mini Maxi / Res ts)
  (if
    (member 
      (setq ts (strcase Tp))(list "R" "I")
    )
    (progn
      (initget Init)
      (if
	(setq Res
          (if
	    (= "R" Ts)
	    (getreal Msg)
	    (getint Msg)
	  )
        )
	(cond
	  ( (< Res Mini)
	    (princ "Podana liczba jest za mała. ")
	    (jk:GET_Numb Tp Msg Init Mini Maxi)
	  )
	  ( (> Res Maxi)
	    (princ "Podana liczba jest za duża. ")
	    (jk:GET_Numb Tp Msg Init Mini Maxi)
	  )
	  (T Res)
	)
	Nil
      )
    )
    Nil
  )
)