O data merge bine de cateva ori prost Ce lipseste

Creat de costincalin_66, Feb 05, 2013, 07:08 PM

« precedentul - următorul »

costincalin_66

Practic este primul meu program.

(setq h (getreal "Inaltimea scarii: "))
(setq L (getreal "Lungimea scarii: "))
(setq nr (getreal "Nr de trepte: "))      
;  (setq h 200.0 L 360.0 nr 5.0 p1 (list 0.0 0.0) i 0)
(setq p1 (getpoint "Punctul de plecare: "))
(setq i 1)
(while (<= i nr)  
 (princ p1)
 (setq p2 (list (car p1) (+ (cadr p1) (/ h nr))))
 (princ p2)
 (setq p3 (list (+ (car p2) (/ L (- nr 1))) (cadr p2)))
 (princ p3)
 (command "pline" p1 p2 p3 "")
 (setq p1 p3)
 (setq i(+ 1 i))   )
(princ "     OK Scara!")

Cateodata a functionat bine. Dar in rest desi calculeaza bine, traseaza prost. La fel face si cu "line". Acum traseaza doar prima treapta iar in rest o linie de la p1 la p3, p2 fiind asimilat in unul din el
De ce?

Modificat de costincalin_66 (05-02-2013 17:09:31)

costincalin_66

Nu am reusit sa folosesc visual lisp ul.
Am tot incercat. Am mai lucrat in pascal sau C cu astfel de debug-ere. Dar asta nu am reusit sa-l clintesc, sa-l fac sa interpreteze linie cu linie sau cum o face el, nici macar un pas.

John Doe

#2
Daca apesi F2, vezi ce mesaj de eroare iti da, si poti cauta de unde provine.
M-am straduit putin si mi-a dat "divide by zero", si cautand am vazut ca la un moment dat lungimea scarii se imparte la numarul de trepte minus unu. Daca numarul de trepte este una, normal ca asa iese.

In principiu, dupa ce ai scris o aplicatie incerci sa-ti dai seama cam ce erori ar putea sa-ti dea, considerând ca userul introduce ce valori are el chef, si incerci sa le previi.

La numarul asta de trepte, ai putea scrie de exemplu:
(setq nr 1)
(while (<= nr 1)
(setq nr (getreal "Nr de trepte: "))
);;;WHILE

Mai departe cauta tu, poate mai sunt si altele.
Eu folosesc ca editor Notepad++, e foarte bun - e free, gasesti pe Net. Spor !

zamfy

#3
In primul rand, programul tau nu are definita nicio functie. Aceasta trebuie definita la inceputul programului prin defun (nume_functie) (argumentele in paranteze). In al doilea rand, algoritmul tau calculeaza eronat lungimea scarii. Am refacut programul tau si l-am si testat de cateva ori si e ok.
Acesta este programul refacut:

(defun c:test (/ p1 p2 p3 h L nr)
(setvar "CMDECHO" 0)
(command "_.undo" "_begin")
(setq h (getreal "\nInaltimea scarii: "))
(setq L (getreal "\nLungimea scarii: "))
(setq nr (getint "\nNr de trepte: "))     
;  (setq h 200.0 L 360.0 nr 5.0 p1 (list 0.0 0.0) i 0)
(setq p1 (getpoint "Punctul de plecare: "))
(repeat  nr 
  (setq p2 (list (car p1) (+ (cadr p1) (/ h nr))))
  (setq p3 (list (+ (car p1) (/ L nr)) (+ (cadr p1) (/ h nr))))
  (command "pline" p1 p2 p3 "")
  (setq p1 p3)
  )
 (command "_.undo" "_end")
(princ)
  )

Salvezi codul intr-un lisp si cand il incarci, folosesti comanda test. Dupa defun c: poti pune ce denumire vrei, in loc de "test". Oricum, pentru primul program in lisp, e destul de bine. Succes!

Modificat de zamfy (05-02-2013 20:51:43)

zamfy

Poti folosi si functia initget in combinatie cu getkword pentru a forta utilizatorul sa introduca doar anumite valori.

John Doe

@zamfy: voiam sa-l las pe el sa se prinda la tipul de variabila... te banez... :D

diagodose2009

#6
CitatNu am reusit sa folosesc visual lisp ul.
Am tot incercat. Am mai lucrat in pascal sau C cu astfel de debug-ere. Dar asta nu am reusit sa-l clintesc, sa-l fac sa interpreteze linie cu linie sau cum o face el, nici macar un pas.


Salut...
Tu inveti aici : cum rulezi "VISUAL-LISP editor" in modul "debug" pas cu pas
Operatiile nu sunt grele, doar ca sunt cateva operatii , care trebuie urmate obligatoriu (similar cu la soferie : cedeaza trecerea, trecere peste bariera)


http://lisp2arx.3xforum.ro//redir.php?http://www.puiubrat.3x.ro//adve2012/ameapi/vlide_userbreak.rar
Program de vizualizare: BsPlayer.exe dela webtech(c)
Atentie filmul are size=200MB si rezolutie 800x600(aproximativ).

=D

Modificat de diagodose2009 (06-02-2013 13:02:41)

costincalin_66

#7
CitatAm refacut programul tau si l-am si testat de cateva ori si e ok.

(defun c:test (/ p1 p2 p3 h L nr)
(setvar "CMDECHO" 0)
(command "_.undo" "_begin")
(setq h (getreal "\nInaltimea scarii: "))
(setq L (getreal "\nLungimea scarii: "))
(setq nr (getint "\nNr de trepte: "))      
;  (setq h 200.0 L 360.0 nr 5.0 p1 (list 0.0 0.0) i 0)
(setq p1 (getpoint "Punctul de plecare: "))
(repeat  nr  
  (setq p2 (list (car p1) (+ (cadr p1) (/ h nr))))
  (setq p3 (list (+ (car p1) (/ L nr)) (+ (cadr p1) (/ h nr))))
  (command "pline" p1 p2 p3 "")
  (setq p1 p3)
  )
 (command "_.undo" "_end")
(princ)
  )


Salvezi codul intr-un lisp si cand il incarci, folosesti comanda test. Dupa defun c: poti pune ce denumire vrei, in loc de "test". Oricum, pentru primul program in lisp, e destul de bine. Succes!

Prima mea impresie ramane. Am o setare care imi produce haosul asta. Am executat functia astfel definita de trei ori la rand cu aceleasi date introduse si am pus poza ecranului. Astfel poate devine evidenta problema.

Alta problema, ar mai fi cum trag toata scara intr-o singura pline (adica sa nu iasa intrerupta, treapta cu trteapta). Cum poate sa ma astepte  (command "pline" p1 p2 p3 ) pana mai fac un ciclu repeat.


582/210px 21.8KB

costincalin_66

#8
Sper ca aici se vede mai bine


581/291px 26.8KB

costincalin_66

#9
Citat din: John DoeDaca apesi F2, vezi ce mesaj de eroare iti da, si poti cauta de unde provine.
M-am straduit putin si mi-a dat "divide by zero", si cautand am vazut ca la un moment dat lungimea scarii se imparte la numarul de trepte minus unu. Daca numarul de trepte este una, normal ca asa iese.

In principiu, dupa ce ai scris o aplicatie incerci sa-ti dai seama cam ce erori ar putea sa-ti dea, considerând ca userul introduce ce valori are el chef, si incerci sa le previi.

La numarul asta de trepte, ai putea scrie de exemplu:
(setq nr 1)
(while (<= nr 1)
(setq nr (getreal "Nr de trepte: "))
);;;WHILE

Mai departe cauta tu, poate mai sunt si altele.
Eu folosesc ca editor Notepad++, e foarte bun - e free, gasesti pe Net. Spor !

E inca in dezvoltare programul si fiind primul l-am facut cat mai simplu, urmand sa-l slefuiesc treptat. Am folosit mult timp o linia care este acum comentariu ca sa nu introduc la fiecare rulare toate datele(si interogarile erau comentarii). Practic cand am reinceput sa folosesc interogarea a inceput sa mearga prost.( ca in poza)

Ms, am luat notepadu

costincalin_66

#10
Citat din: zamfy(command "_.undo" "_begin")
...
(command "_.undo" "_end")

Oricum, pentru primul program in lisp, e destul de bine. Succes!

Nu imi dau seama ce face undo begin (continut) undo end pentru continut

O fi in lisp primul, dar in tinerete am scris mult pascal, basic. Ms

Modificat de costincalin_66 (06-02-2013 17:06:34)

costincalin_66

#11
Citat din: diagodose2009
Citat din: costincalin_66Nu am reusit sa folosesc visual lisp ul.
Am tot incercat. Am mai lucrat in pascal sau C cu astfel de debug-ere. Dar asta nu am reusit sa-l clintesc, sa-l fac sa interpreteze linie cu linie sau cum o face el, nici macar un pas.


Salut...
Tu inveti aici : cum rulezi "VISUAL-LISP editor" in modul "debug" pas cu pas
Operatiile nu sunt grele, doar ca sunt cateva operatii , care trebuie urmate obligatoriu (similar cu la soferie : cedeaza trecerea, trecere peste bariera)


http://lisp2arx.3xforum.ro//redir.php?http://www.puiubrat.3x.ro//adve2012/ameapi/vlide_userbreak.rar
Program de vizualizare: BsPlayer.exe dela webtech(c)
Atentie filmul are size=200MB si rezolutie 800x600(aproximativ).

 =D

Ms. Am sa-l studiez

adrianc

_.undo -> begin - apeleaza inceputul functiei undo. De aici incolo se considera o singura operatie.
_.undo -> end - sfarseste inregistrarea din funcita undo.
De exemplu, daca nu as apela treaba asta, daca nu-mi convine ce iese, trebuie sa dau undo de n ori (in cazul lispului de fata de nr ori, sau nr-1 ori..)
Daca folosim _.undo, tot ce se intampla intre begin si end este tratat in bloc. Am rulat, nu-mi place, un singur undo si dispare.
La muncă! nu la întins mâna.

zamfy

Comanda "undo-begin" si "undo-end" a devenit un standard in toate programele pe care le fac. Explicatia lui adrianc este foarte logica si limpede. In visual lisp, poti folosi si functiile vl-startundomark si vl-endundomark (daca faci programul si pt. Bricscad de ex.).
Lisp-ul meu l-am testat pe AutoCAD 2007 si merge perfect. Un mic sfat: incearca sa reinstalezi versiunea de AutoCAD, poate ca ai niscaiva erori prin registri.
In "tinerete" (pe la 17 ani adica :) ), m-am jucat si eu putin in C++, dar Lisp-ul mi se pare aproape la fel de usor de invatat ca html.

zamfy

#14
Citat din: costincalin_66Alta problema, ar mai fi cum trag toata scara intr-o singura pline (adica sa nu iasa intrerupta, treapta cu trteapta). Cum poate sa ma astepte  (command "pline" p1 p2 p3 ) pana mai fac un ciclu repeat.
Am modificat programul ca sa faca si acest lucru:

(defun c:test (/ p1 p2 p3 h L nr list1)
(setvar "CMDECHO" 0)
(command "_.undo" "_begin")
(setq h (getreal "\nInaltimea scarii: "))
(setq L (getreal "\nLungimea scarii: "))
(setq nr (getint "\nNr de trepte: "))     
;  (setq h 200.0 L 360.0 nr 5.0 p1 (list 0.0 0.0) i 0)
(setq p1 (getpoint "Punctul de plecare: "))
(repeat  nr 
  (setq p2 (list (car p1) (+ (cadr p1) (/ h nr)) 0.0))
  (setq p3 (list (+ (car p1) (/ L nr)) (+ (cadr p1) (/ h nr)) 0.0))
  (setq list1 (append (list (list (car p3) (cadr p3)) (list (car p2) (cadr p2)) (list (car p1) (cadr p1))) list1))
  (setq p1 p3)
  )
  (command "_.pline")
  (mapcar 'command list1)
  (command "")
 (command "_.undo" "_end")
(princ)
  )