Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
ketxu

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

Các bài được khuyến nghị

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 ^^)

  • Vote tăng 15

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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.

  • Vote tăng 3

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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.com/forum/index.php?showtopic=13203&st=2900

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khá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?

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

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khá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

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!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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:

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khá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?

 

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

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khá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

Đú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

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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))

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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)

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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))))

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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:

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

-->>>

Ồ, không phải bác Tue_NV à! Đây chỉ là minh họa theo ý của Ketxu thôi. Với tôi, chắc từ nay cũng phải đi theo con đường equal thôi. Khổ nỗi, không biết bao nhiêu lsp trước đây mình viết liệu có dính thằng nào không? Mà tìm nó ra để kêu án thì CS113 chắc không tìm nỗi vì nó nhiều.

Chán thật!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Thêm một lỗi "oái oăm" nữa đây!

Các bạn load file đính kèm và dùng thử 4 lệnh HA1, HA2, HA3, HA4 sẽ thấy ngay.

Xử lý: khi nhập 1 số nằm ngoài đoạn [32768 32767] thì nên nhập kiểu real cho chắc ăn.

(defun C:HA1()		;Lenh HA1 bi loi.
(setq r 50000 p (list 0 0))
(command "circle" p r))
(defun C:HA2()		;Lenh HA2 ve duoc nhung ket qua sai.
(setq r 90000 p (list 0 0))
(command "circle" p r))
(defun C:HA3()		;Lenh HA3 ve dung voi moi gia tri r khong phai la so nguyen.
(setq r 50000.0 p (list 0 0))
(command "circle" p r))
(defun C:HA4()		;Lenh HA4 ve dung voi moi gia tri r.
(setq r 50000 p (list 0 0))
(entmake (list (cons 0 "circle") (cons 10 p) (cons 40 r))))

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Một lỗi mà nhiều người khi coding thường gặp phải :

Lấy ví dụ trong bài post của Ketxu gần đây :

http://www.cadviet.c...ndpost&p=167455

Điều gì sẽ xảy ra khi chạy lại hàm lần thứ 2 ??

Cách khắc phục : Luôn chú ý loại bỏ biến tạm

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Hề hề hề,

Mình vừa gặp một lỗi thực tình là cũng phải mất khá khá thời gian mới mò ra và hiểu được nên post lên đây để mọi người phân tích và cùng rút kinh nghiệm:

Hàm (ssadd e ss)

Khi viết (setq ss (ssadd e ss)) thì luôn bị trả về nil với lỗi lentityp nil. mặc dầu trước đó đã có hàm (setq ss (ssadd))

 

Đến khi phát hiện ra lỗi đọc lại Help mới vỡ ra là: hàm chỉ có tác dụng: Adds an object (entity) to a selection set, or creates a new selection set (Tạm dịch là: Thêm đối tượng vào một tập chọn cũ hoặc tạo ra tập chọn mới.)

 

Do đó khi viết (setq ss (ssadd e ss)) được hiểu là đặt tên mới cho một tập chọn cũ nên nó biểu là hổng được và trả về nil.

 

Trường hợp này chỉ cần (ssadd e ss) là đủ tức là chỉ thêm một đối tượng vào tập chọn cũ chứ chả thay tên của nó.

 

Vậy mong mọi người cho thêm ý kiến về cái lỗi này và tránh mắc cái lỗi nớ....

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Hề hề hề,

Mình vừa gặp một lỗi thực tình là cũng phải mất khá khá thời gian mới mò ra và hiểu được nên post lên đây để mọi người phân tích và cùng rút kinh nghiệm:

Hàm (ssadd e ss)

Khi viết (setq ss (ssadd e ss)) thì luôn bị trả về nil với lỗi lentityp nil. mặc dầu trước đó đã có hàm (setq ss (ssadd))

 

Đến khi phát hiện ra lỗi đọc lại Help mới vỡ ra là: hàm chỉ có tác dụng: Adds an object (entity) to a selection set, or creates a new selection set (Tạm dịch là: Thêm đối tượng vào một tập chọn cũ hoặc tạo ra tập chọn mới.)

 

Do đó khi viết (setq ss (ssadd e ss)) được hiểu là đặt tên mới cho một tập chọn cũ nên nó biểu là hổng được và trả về nil.

 

Trường hợp này chỉ cần (ssadd e ss) là đủ tức là chỉ thêm một đối tượng vào tập chọn cũ chứ chả thay tên của nó.

 

Vậy mong mọi người cho thêm ý kiến về cái lỗi này và tránh mắc cái lỗi nớ....

 

Sao ngộ vậy ta! Tôi cứ vô tư, chả bị gì là sao???

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay


×