Đến nội dung


Hình ảnh
* - - - - 1 Bình chọn

Các lỗi thường gặp trong lập trình Lisp


  • Please log in to reply
43 replies to this topic

#1 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5679 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 09 June 2011 - 11:20 PM

Dù giỏi mấy thì giỏi cũng có lúc gặp những lỗi sai cơ bản - hoặc không cơ bản. Ket lập topic này ra, nếu bác nào trong quá trình gặp 1 lần lỗi xin hãy post vào đây để tổng hợp lại, giúp những người đi sau không vấp phải nữa.
(p/s : cũng na ná topic Các lỗi oái ăm trong lisp của bác DVH, nhưng ở mức cơ bản, rồi ket sẽ gộp lại)
Em mở phát súng đầu tiên :
- 1 :
(defun c:test (/d)...)
+ Nguyên nhận : không để khoảng trống giữa / và tham số trong khai báo defun.
+ Báo lỗi : ** Error: too few arguments **
+ Giải quyết : (defun c:test (/ d)...)

- 2 :
(+1 2) hoặc (-1 2) hoặc (/1 2)
+ Nguyên nhân : không để khoảng trống giữa hàm số học và số,lỗi tương tự với các hàm cần đối số khác khi không để khoảng trống giữa tên hàm và tên đối số
+ Báo lỗi ** Error: bad function: 1 **
+ Giải quyết : (+ 1 2) hoặc (- 1 2) hoặc (/ 1 2)

- 3 :
(+ 1 .34)
+ Nguyên nhân : không ghi đủ số thực trong biểu thức
+ Báo lỗi : ** Error: misplaced dot on input **
+ Giải quyết : (+ 1 0.34)
- 4 :
(setq 1 a)
+ Nguyên nhân : gán biến cho hằng
+ Báo lỗi : ** Error: syntax error **
+ Giải quyết : (setq a 1)
- 5 :
List - Quote và '
List, quote, và ' đều có chung một chức năng là tạo list, tuy nhiên có 1 khác biệt nhỏ, nếu nhầm lẫn có thể dẫn tới "không hiểu tại sao lại không được"
+ List : tạo 1 danh sách có định giá trị
+ Quote : tạo 1 danh sách không định giá trị, có thể sử dụng trong commandline
+ ' : tương tự quote nhưng không sử dụng trong commandline
+ Ví dụ : (setq a 1 b 2 c 3)
=> (list a b c) sẽ trả về (1 2 3), các đối số a,b,c lần lượt được định giá trị trước khi tạo list
'(a b c) hoặc (quote (a b c)) sẽ chỉ trả về list ký tự (a b c)
+ Giải quyết : nếu tạo list có biến số bên trong, hãy dùng list

- 6 :
Getangle - Angle
+ Hàm Getangle luôn trả về kết quả dưới dạng Radian, cho dù nhập vào là giá trị góc tính bằng độ. Tương tự với Angle
+ Giải quyết : muốn làm việc với độ, hãy xử lý dữ liệu thu được ^^ . Có thể dùng Getorient thay cho Getangle khi muốn tránh ảnh hưởng của các biến Angbase, Angdir

- 7 :
distof - atof và atoi
+ Ta đã biết sơ qua công dụng của atof và distof đều là chuyển string về dạng số thực, tuy nhiên cách hành xử của 2 hàm này lại khá khác nhau
+ distof : nếu string không tuân theo quy định của Mode, ngay lập tức ta sẽ có Nil
+ atof : Kiểu gì từ 1 string ta cũng thu về được 1 số. Nếu xuất hiện số ở đầu, nó sẽ lấy thằng này. Nếu không, ta thu được kết quả 0
=> với 1 lisp tính tổng các text, nên dùng atof thay vì kiểm tra điều kiện (if (distof..)) (thừa) hoặc bị mắc lỗi (distof string mode) khi có 1 text trả về nil (không thể tính tổng 1 số với nil)
+ atoi : Hàm chuyển từ string về số nguyên, tuy nhiên, khác với 2 hàm trên, atoi không thể nhận biết được ký tự e. => (atoi 5.1e03) sẽ chỉ trả về 5. Chú ý điều này để tránh mắc lỗi ^^

8. ; error: extra right paren on input
+ Nguyên nhân : thừa dấu ")". Tương tự với việc thiếu dấu ngoặc, lisp không nhận hàm
+ Giải quyết : tốt nhất là khi bắt đầu viết 1 hàm, 1 biểu thức.., hãy đóng ngoặc luôn để chắc chắn rằng mình không bị Lost in Stupid Parentheses :)

(Mong mọi người bổ sung hàng ngày ^^)
  • 15

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#2 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 09 June 2011 - 11:51 PM

Ketxu lập ra Topic này hay lém. Tích dấu "+" nào pà kon ơi. :lol:
  • 2



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#3 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 10 June 2011 - 10:27 AM

Dù giỏi mấy thì giỏi cũng có lúc gặp những lỗi sai cơ bản - hoặc không cơ bản. Ket lập topic này ra, nếu bác nào trong quá trình gặp 1 lần lỗi xin hãy post vào đây để tổng hợp lại, giúp những người đi sau không vấp phải nữa.
(p/s : cũng na ná topic Các lỗi oái ăm trong lisp của bác DVH, nhưng ở mức cơ bản, rồi ket sẽ gộp lại)
Em mở phát súng đầu tiên :
- 1 :
(defun c:test (/d)...)
+ Nguyên nhận : không để khoảng trống giữa / và tham số trong khai báo defun.
+ Báo lỗi : ** Error: too few arguments **
+ Giải quyết : (defun c:test (/ d)...)

- 2 :
(+1 2) hoặc (-1 2) hoặc (/1 2)
+ Nguyên nhân : không để khoảng trống giữa hàm số học và số,lỗi tương tự với các hàm cần đối số khác khi không để khoảng trống giữa tên hàm và tên đối số
+ Báo lỗi ** Error: bad function: 1 **
+ Giải quyết : (+ 1 2) hoặc (- 1 2) hoặc (/ 1 2)

- 3 :
(+ 1 .34)
+ Nguyên nhân : không ghi đủ số thực trong biểu thức
+ Báo lỗi : ** Error: misplaced dot on input **
+ Giải quyết : (+ 1 0.34)
- 4 :
(setq 1 a)
+ Nguyên nhân : gán biến cho hằng
+ Báo lỗi : ** Error: syntax error **
+ Giải quyết : (setq a 1)
- 5 :
List - Quote và '
List, quote, và ' đều có chung một chức năng là tạo list, tuy nhiên có 1 khác biệt nhỏ, nếu nhầm lẫn có thể dẫn tới "không hiểu tại sao lại không được"
+ List : tạo 1 danh sách có định giá trị
+ Quote : tạo 1 danh sách không định giá trị, có thể sử dụng trong commandline
+ ' : tương tự quote nhưng không sử dụng trong commandline
+ Ví dụ : (setq a 1 b 2 c 3)
=> (list a b c) sẽ trả về (1 2 3), các đối số a,b,c lần lượt được định giá trị trước khi tạo list
'(a b c) hoặc (quote (a b c)) sẽ chỉ trả về list ký tự (a b c)
+ Giải quyết : nếu tạo list có biến số bên trong, hãy dùng list

- 6 :
Getangle - Angle
+ Hàm Getangle luôn trả về kết quả dưới dạng Radian, cho dù nhập vào là giá trị góc tính bằng độ. Tương tự với Angle
+ Giải quyết : muốn làm việc với độ, hãy xử lý dữ liệu thu được ^^ . Có thể dùng Getorient thay cho Getangle khi muốn tránh ảnh hưởng của các biến Angbase, Angdir

- 7 :
distof - atof và atoi
+ Ta đã biết sơ qua công dụng của atof và distof đều là chuyển string về dạng số thực, tuy nhiên cách hành xử của 2 hàm này lại khá khác nhau
+ distof : nếu string không tuân theo quy định của Mode, ngay lập tức ta sẽ có Nil
+ atof : Kiểu gì từ 1 string ta cũng thu về được 1 số. Nếu xuất hiện số ở đầu, nó sẽ lấy thằng này. Nếu không, ta thu được kết quả 0
=> với 1 lisp tính tổng các text, nên dùng atof thay vì kiểm tra điều kiện (if (distof..)) (thừa) hoặc bị mắc lỗi (distof string mode) khi có 1 text trả về nil (không thể tính tổng 1 số với nil)
+ atoi : Hàm chuyển từ string về số nguyên, tuy nhiên, khác với 2 hàm trên, atoi không thể nhận biết được ký tự e. => (atoi 5.1e03) sẽ chỉ trả về 5. Chú ý điều này để tránh mắc lỗi ^^

8. ; error: extra right paren on input
+ Nguyên nhân : thừa dấu ")". Tương tự với việc thiếu dấu ngoặc, lisp không nhận hàm
+ Giải quyết : tốt nhất là khi bắt đầu viết 1 hàm, 1 biểu thức.., hãy đóng ngoặc luôn để chắc chắn rằng mình không bị Lost in Stupid Parentheses :)

(Mong mọi người bổ sung hàng ngày ^^)

Phát súng thứ 2: gom lại một số vấn đề (có bổ sung) mà trước đây tôi đã đưa vào topic "Các lỗi oái oăm trong lisp" và "Lisp vui":
9. Nếu a = nil thì (< a 100) = T và (> a 100) = nil
Nguyên nhân: giá trị nil thì nhỏ hơn mọi số.
Giải quyết: trước khi so sánh cần phải kiểm tra chúng có nil không đã.
10. (cos (/ pi 2))=6.12303E-017 ; (sin (/ pi 2)=1 ; do đó: (= (cos (/ pi 2)) 0)=nil, còn (= (sin (/ pi 2)) 1)=T
Nguyên nhân: có thể do máy tính tính cos, sin... bằng cách khai triển chuỗi nên chỉ gần đúng (trong Excel cũng tương tự...).
Giải quyết: khi xét tính vuông góc nên dùng hàm sin cho chắc ăn.
11. (/ (* (* 10000 3500) 365) 365)=-301101
Nguyên nhân: Số nguyên (integer) hợp lệ trong lisp phải nằm trong khoảng +2,147,483,647 đến -2,147,483,648 (SSG). Nếu vượt ra ngoài khoảng đó sẽ tràn bộ nhớ nên kết quả sai bét.
Giải quyết: chuyển qua dạng số thực (real).
12. Dùng "t" làm biến trong hàm, ví dụ:
(defun C:HA(/ t)
(setq t 5)
(if (= t 5) "OK" "NO"))
command: HA
; error: incorrect object to bind: T
Nguyên nhân: t được lisp định nghĩa là giá trị True, nên không thể dùng làm biến trong hàm.
Giải quyết: tên này phạm húy, quý vị đừng đặt, chặt đầu như chơi.
13. Biểu thức trong hàm "Action" không được viết dài quá. Nếu dài quá, thì đặt hàm con cho ngắn lại.
Dài bao nhiêu thì tôi chưa đo được, và không biết tại sao lại bị lỗi ấy.
  • 3

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#4 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 11 June 2011 - 08:06 AM

Phát súng thứ 2: gom lại một số vấn đề (có bổ sung) mà trước đây tôi đã đưa vào topic "Các lỗi oái oăm trong lisp" và "Lisp vui":
......
10. (cos (/ pi 2))=6.12303E-017 ; (sin (/ pi 2)=1 ; do đó: (= (cos (/ pi 2)) 0)=nil, còn (= (sin (/ pi 2)) 1)=T
Nguyên nhân: có thể do máy tính tính cos, sin... bằng cách khai triển chuỗi nên chỉ gần đúng (trong Excel cũng tương tự...).
Giải quyết: khi xét tính vuông góc nên dùng hàm sin cho chắc ăn.
......
12. Dùng "t" làm biến trong hàm, ví dụ:
(defun C:HA(/ t)
(setq t 5)
(if (= t 5) "OK" "NO"))
command: HA
; error: incorrect object to bind: T
Nguyên nhân: t được lisp định nghĩa là giá trị True, nên không thể dùng làm biến trong hàm.
Giải quyết: tên này phạm húy, quý vị đừng đặt, chặt đầu như chơi.
....

10. Có thể giải quyết bằng hàm equal thay cho hàm =, sử dụng hàm gì sin hay cos gì cũng được. Khi so sánh 2 số thực với nhau thì nên sử dụng equal để tránh mắc lỗi. So sánh số nguyên thì sử dụng hàm = hay equal đều được

12./ Sử dụng Visual Lisp editor từ nào màu xanh lá thì đó là từ khóa => đừng đặt. T là từ khóa có màu xanh lá -> thì đừng đặt

Thêm 1 lỗi khó hiểu về hàm Fix :
http://www.cadviet.c...c=13203&st=2900
  • 1

#5 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 11 June 2011 - 08:54 AM

10. Có thể giải quyết bằng hàm equal thay cho hàm =, sử dụng hàm gì sin hay cos gì cũng được. Khi so sánh 2 số thực với nhau thì nên sử dụng equal để tránh mắc lỗi. So sánh số nguyên thì sử dụng hàm = hay equal đều được

Theo tôi nghĩ, sử dụng equal trong trường hợp này là bất đắc dĩ bác ạ. Chẳng hạn, nếu dùng (equal (cos (/ pi 2)) 0.0001) thì khi cái góc nào đó "gần vuông", như 89d59'59" chẳng hạn, thì nó cũng vuông luôn.
(equal (cos (angtof "89d59'59\"")) 0 0.0001)=T
Không biết vậy có đúng không bác?
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#6 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 11 June 2011 - 09:07 AM

Theo tôi nghĩ, sử dụng equal trong trường hợp này là bất đắc dĩ bác ạ. Chẳng hạn, nếu dùng (equal (cos (/ pi 2)) 0.0001) thì khi cái góc nào đó "gần vuông", như 89d59'59" chẳng hạn, thì nó cũng vuông luôn.
(equal (cos (angtof "89d59'59\"")) 0 0.0001)=T
Không biết vậy có đúng không bác?

Equal sử dụng sao gọi là bất đắc dĩ được??
Cos của góc 90 độ xấp xỉ 0.0 và nó có 1 sai số rất nhỏ.
Sai số 0.0001 của bạn viết là chưa đủ nhỏ.
Bạn thử dòng này xem :
(equal (cos (angtof "89d59'59\"")) 0.0 1.e-11) -> NIL
  • 0

#7 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 11 June 2011 - 02:11 PM

Equal sử dụng sao gọi là bất đắc dĩ được??
Cos của góc 90 độ xấp xỉ 0.0 và nó có 1 sai số rất nhỏ.
Sai số 0.0001 của bạn viết là chưa đủ nhỏ.
Bạn thử dòng này xem :
(equal (cos (angtof "89d59'59\"")) 0.0 1.e-11) -> NIL

Bác không cho là bất đắc dĩ thì thôi, dù (equal (cos (angtof "89d59'59.999999\"")) 0.0 1.e-11)=T
Chi bằng chơi thằng sin nó khỏe!
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#8 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 11 June 2011 - 06:34 PM

Bác không cho là bất đắc dĩ thì thôi, dù (equal (cos (angtof "89d59'59.999999\"")) 0.0 1.e-11)=T
Chi bằng chơi thằng sin nó khỏe!

Cũng do thói quen cách viết code của mình thôi. Nếu bạn viết góc "89d59'59.999999\"" thì có thể xem như nó = 90 độ không? Mình nghĩ sai số này rất nhỏ có thể chấp nhận được. Còn nếu bạn không muốn chấp nhận góc "89d59'59.999999\""là góc vuông bạn có thể tăng độ lệch trong hàm equal lên. (số 1.e-11 bạn có thể tăng lên 1.e-17 chẳng hạn)

Thói quen của mình là khi so sánh 2 số thực, hay sử dụng equal để viết, tránh sử dụng hàm = khi so sánh 2 số thực với nhau, tránh mắc những lỗi đáng tiếc mà bản thân đã từng gặp. Đây là lời khuyên vậy :rolleyes:
  • 0

#9 pdle

pdle

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 286 Bài viết
Điểm đánh giá: 124 (tàm tạm)

Đã gửi 11 June 2011 - 06:44 PM

Theo tôi nghĩ, sử dụng equal trong trường hợp này là bất đắc dĩ bác ạ. Chẳng hạn, nếu dùng (equal (cos (/ pi 2)) 0.0001) thì khi cái góc nào đó "gần vuông", như 89d59'59" chẳng hạn, thì nó cũng vuông luôn.
(equal (cos (angtof "89d59'59\"")) 0 0.0001)=T
Không biết vậy có đúng không bác?


Em thử cái này :
Command: (= (sin (- (/ pi 2) 0.00000001)) 1.0)
T


Vậy là đâu chỉ có sin pi/2 mới bằng 1.0 đâu ạ :D
  • 1
Share your knowledge. It is a way to achieve immortality !

***

PS: Nếu bài viết của mình có ích, xin hãy "Bình chọn cho bài viết này" nhé :D

#10 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 11 June 2011 - 07:36 PM

Em thử cái này :
Command: (= (sin (- (/ pi 2) 0.00000001)) 1.0)
T


Vậy là đâu chỉ có sin pi/2 mới bằng 1.0 đâu ạ :D

Đúng vậy!
Thêm cả cái thằng fix mà bác Tue_NV đã nói ở trên nữa:
(- (- 5.1 (fix 5.1) 0.1))=3.60822e-016
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#11 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5679 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 11 June 2011 - 10:25 PM

13. (/ 1 2)
+ Kết quả trả về 0
+ Nguyên nhân : khi thực hiện phép tính giữa số nguyên -> kết quả trả về số nguyên
+ Giải quyết : (/ 1 2.0)
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#12 pdle

pdle

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 286 Bài viết
Điểm đánh giá: 124 (tàm tạm)

Đã gửi 12 June 2011 - 04:41 AM

Em đang tập tành với Vla-GetBoundingBox, và phát hiện ra:
(defun c:dvt(/ c d ss minpt maxpt)
(setq ss (vlax-ename->vla-object (car (entsel))))
(vla-GetBoundingBox ss minpt maxpt)
(setq c (vlax-safearray->list minpt) d (vlax-safearray->list maxpt))
)
Không chạy được, nhưng:
(defun c:dvt(/ c d ss minpt maxpt)
(setq ss (vlax-ename->vla-object (car (entsel))))
(vla-GetBoundingBox ss 'minpt 'maxpt)
(setq c (vlax-safearray->list minpt) d (vlax-safearray->list maxpt))
)
Lại chạy bình thường.

Nguyên nhân: (theo ngu ý của em), do minpt là kiểu variant, trả về 3 phần tử của mảng dạng double, vì thế 'minpt sẽ tạo ra một safearray chứa 3 phần tử đó và có tên là minpt. Còn nếu dùng minpt (trường hợp 1), em không biết nó sẽ trả về cái gì?
Mong mọi người cho ý kiến!
  • 0
Share your knowledge. It is a way to achieve immortality !

***

PS: Nếu bài viết của mình có ích, xin hãy "Bình chọn cho bài viết này" nhé :D

#13 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 12 June 2011 - 12:45 PM

Sở dĩ dùng 'minpt 'maxpt vì bản thân trong hàm này nó đòi hỏi ta phải nhập tên 2 biến, và nó sẽ gán giá trị cho 2 biến này. Giống như hàm set ý mà. Ví dụ (mapcar 'set (list 'a 'b 'c) (list 5 4 3))
  • 2

#14 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5679 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 12 June 2011 - 01:00 PM

Em đang tập tành với Vla-GetBoundingBox, và phát hiện ra:

(defun c:dvt(/ c d ss minpt maxpt)
(setq ss (vlax-ename->vla-object (car (entsel))))
(vla-GetBoundingBox ss minpt maxpt)
(setq c (vlax-safearray->list minpt) d (vlax-safearray->list maxpt))
)
Không chạy được, nhưng:
(defun c:dvt(/ c d ss minpt maxpt)
(setq ss (vlax-ename->vla-object (car (entsel))))
(vla-GetBoundingBox ss 'minpt 'maxpt)
(setq c (vlax-safearray->list minpt) d (vlax-safearray->list maxpt))
)
Lại chạy bình thường.

Nguyên nhân: (theo ngu ý của em), do minpt là kiểu variant, trả về 3 phần tử của mảng dạng double, vì thế 'minpt sẽ tạo ra một safearray chứa 3 phần tử đó và có tên là minpt. Còn nếu dùng minpt (trường hợp 1), em không biết nó sẽ trả về cái gì?

Nil vì sai cấu trúc ^^
Thêm dấu ' là để tạo ra 2 biến không định giá trị làm tham số cho hàm vla-getboundingbox, sau khi thực hiện xong hàm này minpt và maxpt mới được định giá trị. Nếu để không, hàm sẽ định giá trị cho đối số trước khi thực hiện, nó sẽ tương đương với việc bạn viết hàm (vla-GetBoundingBox ss Nil Nil) => chẳng thu được gì cả
(Đã trình bày trong lỗi List - quote và ')

P/S : tương tự bác nataca nói về sự khác nhau giữa hàm Set và Setq (Set + quote )
command và vl-cmdf vậy
(theo ngu ý của mình)
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#15 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 13 June 2011 - 08:36 AM

13. (/ 1 2)
+ Kết quả trả về 0
+ Nguyên nhân : khi thực hiện phép tính giữa số nguyên -> kết quả trả về số nguyên
+ Giải quyết : (/ 1 2.0)

Đó là trường hợp số
Cách giải quyết với trường hợp là biến
(setq a 1)
(setq b 2)
(/ a b )
Cách giải quyết :
1. (/ a b 1.0)
2. (/ (float a) (float b ))

Hàm fix có thể thay bằng hàm con
(defun fixR (s) (fix(atof(rtos s))))
  • 0

#16 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 13 June 2011 - 02:50 PM

hạn chế đổi hệ trục toạ độ trong code, việc đổi hệ trục toạ độ sẽ khiến lisp của bạn lỗi ngay tại dòng lệnh (command "ucs"...) nếu bạn sử dụng lisp đó trong các Editor mặc định chỉ sử dụng OCS. Ví dụ trong block editor chẳng hạn.
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#17 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5679 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 14 June 2011 - 07:14 AM

- Giải quyết hàm Fix : e có hỏi mấy anh Tây, các anh ý nói là : (Tiếng Anh bằng A hơi ẹ, các bác đừng cười e ^^)
What wrong in fix
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#18 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5679 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 10 July 2011 - 10:01 PM

Tiếp tục 1 lỗi oái ăm :

Command: (- 8.2 2.2)
6.0

Command: (- 8.1 2.1)
6.0
;;Kiểm tra :
Command: (fix (- 8.2 2.2))
5

Command: (fix (- 8.1 2.1))
6

;;
Command: (= 6.0 (- 8.2 2.2))

nil

Command: (eq 6.0 (- 8.2 6.2))
nil

Command: (equal 6.0 (- 8.2 2.2))
nil

Command: (= 6.0 (- 8.1 2.1))

T

Command: (equal 6.0 (- 8.2 2.2) 0.01)
T


Nguyên nhân : do máy tính đấy :wacko:
Khắc phục : cảnh giác với số thực, khi so sánh nên dùng equal + fuzz. Hạn chế dùng hàm fix
  • 2

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#19 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 11 July 2011 - 02:06 PM

Tiếp tục 1 lỗi oái ăm :
...
Nguyên nhân : do máy tính đấy :wacko:
Khắc phục : cảnh giác với số thực, khi so sánh nên dùng equal + fuzz. Hạn chế dùng hàm fix

Quá oái oăm luôn. Tưởng chỉ có hàm Sin, Cos... mới tính gần đúng, ai dè hàm "-" cũng gần đúng luôn:
(- 6.0 (- 8.2 2.2)) = 8.88178e-016
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#20 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 11 July 2011 - 04:01 PM

Quá oái oăm luôn. Tưởng chỉ có hàm Sin, Cos... mới tính gần đúng, ai dè hàm "-" cũng gần đúng luôn:
(- 6.0 (- 8.2 2.2)) = 8.88178e-016

-->>>

Cũng do thói quen cách viết code của mình thôi. Nếu bạn viết góc "89d59'59.999999\"" thì có thể xem như nó = 90 độ không? Mình nghĩ sai số này rất nhỏ có thể chấp nhận được. Còn nếu bạn không muốn chấp nhận góc "89d59'59.999999\""là góc vuông bạn có thể tăng độ lệch trong hàm equal lên. (số 1.e-11 bạn có thể tăng lên 1.e-17 chẳng hạn)

Thói quen của mình là khi so sánh 2 số thực, hay sử dụng equal để viết, tránh sử dụng hàm = khi so sánh 2 số thực với nhau, tránh mắc những lỗi đáng tiếc mà bản thân đã từng gặp. Đây là lời khuyên vậy :rolleyes:


  • 0