第一篇:Autolisp編程心得
[轉帖]Autolisp編程心得 養成良好的書寫習慣
眾所周知,Lisp是一種表結構語言,括號必須成對出現,在調試時往往為遺漏了一個括號大費周折,所以,養成一個好的編程習慣是學好Lisp所必須的。
⑴選擇一個較好的編輯器,這是一個基本條件,建議使用Visual Lisp編輯器或Lisplink等專用編輯器,此類編輯器可以對函數突出顯示。
⑵按Lisp(DCL)專有格式書寫,并經常對程序進行“格式化”,及時發現語法錯誤,并有利于調試是查找錯誤。
⑶使用自定義函數,并輔助以適當得注釋,在較大程序中按功能使用自定義函數可以使得程序條理化。
函數中循環與轉移的使用
在高級語言中一般有類似“goto”的語句實現轉移,在AutoLisp中沒有轉移的函數。我們可以使用自定義函數實現轉移,用if及cond輔助實現條件轉移。當我們需要實現在滿足一定條件時進行循環的功能,一般使用while函數,但有時需要判斷的條件較復雜時,使用while函數往往不能實現或使得程序不夠簡潔。這時我們可以使用“轉移”,將需要實現的功能作為(子)函數,使用恰當,可以在程序中任意“轉移”。一般認為,當一段代碼在不同處重復使用時,我們才會使用子函數定義,其實,利用函數的更大的優點是使得程序更加結構化。這就使得我們不必拘泥于程序中的循環語句,而使用函數的循環調用,輔助適當的判斷,實現“轉移”,如A->B->A。當然也可以進行自身調用,構成一個 “標準的”循環。如例一中,“程序執行完畢返回”與“空選返回”兩種情況如果使用循環語句,其條件是完全不同的,而將函數本身作為子函數調用,程序簡潔明了。
3.initget函數中關鍵字“ ”(空格)的使用
空格可以被用作關鍵字,一般多用來定義鼠標右鍵退出。
⑴當用戶輸入函數不支持控制位(如entsel、nentsel、nentselp)時,可直接使用 “(initget “ ”)”。
⑵當用戶輸入函數支持控制位(如getpoint等)時,可使用“(initget 1 “ ”)”禁止空輸入,而將回車等空輸入作為關鍵字使用。
⑶當同時使用其它關鍵字時,應該將空格作為一系列關鍵字的最后一個,用 “(initget “C ”)”(兩個空格)調用,否則無效。見例一。
************************************************;;例一(defun ett_ct()(initget “C ”);關鍵字“C”及空格
(setq s0(entsel “n設置顏色C / 選取文本:”))(cond((= s0 “C”)(ett_col));轉設置顏色子函數((= s0 “")nil);空格退出
((and(=(type s0)'LIST);選擇實體
(=(cdr(assoc 0(entget(car s0))))”TEXT“);判別文本)...;操作內容(ett_ct);編輯后返回選擇)(t(ett_ct));空選返回選擇))************************************************ 有時需要進行復雜的判斷,使用如“(= s0 ”“)”語句可能不能準確判別輸入的空格關鍵字與空選擇,可以使用“(=(type s0)'STR)”語句。
4.Lisp的暫停與while的特殊使用
Lisp一般在交互輸入時才會暫停,如果只需要實現屏幕顯示暫停,可使用grread函數,grread函數對所有合法的輸入設備均會作出反應,有時我們只希望對鍵盤有反應,可使用while函數進行循環。
*******************(princ ”nPress ENTER to continue:“)(while(/=(car(grread))2))******************* while用于滿足一定條件的循環,其標準語法為:(while testexpr [expr...])其中expr解釋為“在testexpr為nil之前要求值的一個或多個表達式”,為可選項(在R14之前沒有方括號,但仍為可選項)。正常我們使用while時,總會有expr項,更多的時候,我們是為了expr項才會使用這種循環語句,所有我們往往有expr項是不可缺少的感覺。這里我們使用while函數的語法是while函數的特例,即沒有expr項的情況。如果希望對鼠標右鍵同時反應,可以使用:
*******************(princ ”nPress ENTER to continue:“)(while(and(/=(setq a(car(grread)))2);鍵盤(/= a 11);鼠標右鍵(SHORTCUTMENU=0)(/= a 25);鼠標右鍵(SHORTCUTMENU≠0)))******************* 5.輸入距離
Lisp語言中輸入距離的函數為getdist,但我們有時需要輸入負值,有時需要在輸入距離的同時得到角度,使用getdist函數就顯得無能為力,這時,我們可以靈活使用其它交互輸入函數如getpoint、getcorner等,通過計算得到我們所需要的值。例二是一段輸入長度的同時得到默認角度的代碼,使用getpoint函數。
************************************************;;例二(setq pt0(getpoint ”n直線基點: “)pt1(getpoint pt0 ”n直線長度: “);長度及角度可用鍵盤或鼠標定位 dst(distance pt0 pt1);計算長度
ang(angle pt0 pt1);計算默認角度
ang1(getangle pt0(strcat ”n直線方向<“(angtos ang 1)”>: “)))************************************************ 例三是可以按陣列方式輸入行列間距的代碼,輸入距離為正值,修改部分代碼可輸入負值,使用getcorner函數,同時使用initget的控制位128。
************************************************;;例三
(defun lc_dist()(initget 128);允許任意輸入
(setq disr(getpoint ”n指定單位單元或輸入行間距: “))(if(=(type disr)'LIST);鼠標輸入
(progn(initget 1)(setq dis(getcorner disr ”n指定對角點: “);鼠標輸入對角
disc(abs(-(car dis)(car disr)));正值行距
disr(abs(-(cadr dis)(cadr disr)));正值列距);計算行列間距)(if(=(type disr)'STR);鍵盤輸入行距
(if(setq dis(distof disr));判斷輸入的是否距離
(progn(initget 6)(setq disc(getdist ”n輸入列間距: “));輸入列距)(progn;鍵盤輸入格式不符返回
(princ ”n需要正數值或兩個二維角點。“)(lc_dist)))(progn;空輸入返回
(princ ”n需要正數值或兩個二維角點。“)(lc_dist)))))************************************************ 6.數學運算函數的數量界限
在Lisp中對表中數據進行求和、求最大值等數學運算時,往往直觀的對表直接賦予運算函數,使用語句如“(eval(cons 'MAX numlist))”,一般都可以進行計算,但當表中數據數量大于255時,將會出現錯誤“bad argument value: does not fit in byte: 256”。
對于這種情況,我們不必對數據表進行分段,可以直接使用函數apply,語法更簡單:(apply 'MAX numlist)。apply可將數據表傳送給指定的函數進行求值而不受數據數量的影響。
受表中數據數量影響的數學運算函數有:+、-、*、/、max、min、logand及logior。
7.選擇集與表
選擇集是一種特殊結構的表,只能通過特定的函數進行操作,但這些函數對大量重復的操作
只能通過循環實現,顯得力不從心,不能體現Lisp語言表結構的優越性。其實我們只要通過存取實體名或實體句柄,將它們存為一個普通結構的表,完全可以通過常規表操作函數實現對實體的操作。
例四是一段使用apply、mapcar函數聯合求文本選擇集中文本基點最大y值得代碼,只是一個示例,如果結合VL-sort函數,可輕松實現對文本的排序。
************************************************;;例四
(setq sl nil i-1)(repeat(sslength(setq ss(ssget '((0.”TEXT“)))));選擇文本
(setq i(1+ i)en(ssname ss i);從選擇集中取出文本 sl(cons en sl);構造包含實體名的表)(setq maxy(apply 'max;求文本基點最大y值(mapcar '(lambda(x)(caddr(assoc 10(entget x))));提取y值)sl)))************************************************ 當然,選擇集也有其優勢的一面,比如對選擇集中實體的刪除操作非常簡單、選擇集中的實體不會重復及選擇集可以與Acad命令交互使用等特征是一般表所不具備的,所以,編程時應根據程序要求,靈活運用。
8.cal的使用與加載
Acad隨機附帶了一些外部定義命令,其中cal(計算器)命令是最常用的命令之一,在加載gromcal.arx后cal可以在Lisp程序中像其它函數一樣使用,這就使得我們在程序中對文本的四則運算處理變得簡單,如“(cal ”1+2/3“)”,其中字符串”1+2/3“可以從圖形的文本中提取,也可以是符合cal要求格式的任一字符串(詳見Acad聯機幫助)。
需要注意的是,在Acad中gromcal.arx只能加載一次,重復加載將使Acad以外退出(無提示)。
需要使用cal函數的Lisp程序,應在程序尾部加上以下代碼: *******************(if(or(=(type c:cal)'LIST);R14使用(=(type c:cal)'SUBR);R2000+使用)(arxload ”geomcal.arx“))******************* 9.Undo處理
一個完善的程序應該有較好的出錯處理,這是在所有Lisp教材上都提及的,但程序的Undo處理就說得很少或沒有提及。其實Undo處理對程序來說也是非常重要的,尤其對有較多輸出的復雜程序而言,不能解決Undo問題,使用起來會極不方便。
對于Undo問題的解決,一種方法是盡量少用或不用command函數,即不調用原始命令,這是一種較好的方法,但必須注意的是,一段程序必須至少有一次調用command函數,否則Undo命令將取消程序運行前的前一次命令,解決的方法是在程序運行的起始位置加一個無謂的command,如
“(command ”color“ ”“)”。
有時不使用command函數不能達到我們要求的一些功能,或使得程序過于復雜,我們可能需要使用一些command函數(原始命令),這是就應該在程序中進行Undo處理,即使用Undo命令的編組功能。
例五是一段程序出錯函數與Undo處理的示例。************************************************;;例五
(defun newerr(s);出錯函數(if s(progn(term_dialog);使用對話框時使用
(if olderr(setq *error* olderr));出錯函數恢復(if oldvar(setvar...oldvar));系統變量恢復(if olderr(setq *error* olderr));出錯函數恢復(command ”_.undo“ ”_e“);Undo編組結束))(princ))
(defun c:my(/...);主程序(主函數)(setvar ”cmdecho“ 0);取消命令回顯提示
(command ”_.undo“ ”_BE“);Undo編組開始(setq olderr *error* *error* newerr);調用自定義出錯函數
(setq oldvar(getvar...));保存相關系統變量
(setvar...;設置系統變量...;程序段...(setvar...oldvar);恢復系統變量(setq *error* olderr);恢復出錯函數(command ”_.undo“ ”_E“);結束Undo命令編組
(princ);取消程序返回值)************************************************ 10.程序調試是塊注釋的使用
我們經常會加上或屏蔽一段代碼輔助程序調試,此時最常用的是在需要暫時屏蔽的代碼前使用行注釋符號“;”,對于較多的代碼就需要使用塊注釋“;|——|;”,如果一段代碼需要頻繁屏蔽,將行注釋與塊注釋組合使用,可以帶來極大方便。
下圖是組合使用的示例。Vlisp編程技巧摘要(1);;;********************************************************** 1.如何獲取多義線上的所有頂點 Code:(defun C:getp(/ ent PLTYPE obj vtx vtxlst n ptlst)(vl-load-com)(setq ent(entsel ”n選取多線:n“))(if ent(progn(setq PLTYPE(cdr(assoc 0(entget(car ent)))))(if(or(= ”OLYLINE“ PLTYPE)(= ”LWPOLYLINE“ PLTYPE))(progn(setq obj(vlax-ename->vla-object(car ent)))(setq vtx(vla-get-Coordinates obj))(setq(vlax-variant-value vtx)))(setq n 0)(setq ptlst nil)(repeat(/(length vtxlst)2)(setq ptlst(append ptlst(list(list(nth n vtxlst)(nth(1+ n)vtxlst)))))(setq n(+ n 2)))(if ptlst ptlst nil))(prompt ”n選取實體不是多義線!“));if));if);;;********************************************************** 2.在對話框的文本欄里輸入,怎樣讓它實時顯示為密碼“ * ” ? A.設計對話框時,控件的屬性中加:password_char = ”*“;srt : dialog {
vtxlst
(vlax-safearray->list label = ”密碼“;: edit_box { label = ”輸入密碼(&S):“;key = ”password“;password_char = ”*“;fixed_width = true;width = 8;} ok_only;}(defun c:srt()(setq filename ”srt.dcl“)(if(>(setq index_value(load_dialog filename))0);裝載對話框
(progn(setq dlgname ”srt“)(if(not(new_dialog dlgname index_value))(exit));顯視對話框
(action_tile ”password“ ”(mypass)“)(action_tile ”ok“ ”(done_dialog 0)“)(start_dialog))(alert ”n不能載裝指定的DCL文件定義的對話框!“));;;END IF(princ))(defun mypass()(setq a1 $value))B.使用DOSLib輸入密碼的函數
;;;******************************************************** 3.怎樣可以實現不用工具中的選項,來調出屏幕菜單?
;;屏幕菜單切換(defun C:pmmenu()(vl-load-com)(setq sd(vla-get-display(vla-get-preferences(vlax-get-acad-object))))(if(=(vla-get-displayscreenmenu sd):vlax-true)(vla-put-displayscreenmenu sd :vlax-false)(vla-put-displayscreenmenu sd :vlax-true))(vlax-release-object sd)(princ));;******************************************************** 4.怎么樣用Vlisp來讀取AutoCAD中搜索路徑?(vla-get-supportpath(vlax-get-acad-object))))或:
(getenv ”ACAD“)或:
(acet-pref-supportpath-list)獲取支持路徑。
;;********************************************************
(vla-get-files
(vla-get-preferences 5.如何捕獲列表框(list_box)的雙擊操作?
在edit_box,list_box,image_button,slider中,有一個$reason變量,用來
表示你執行了什么操作。在list_box中,雙擊的變量值是4。可在你的代碼中加入判斷:
(action_tile ”listbox“ ”(fun1).....“)(defun fun1().....(if(= $reason 4).....).....)
;;******************************************************** 6.如何用VLISP創建目錄?
例如:
A.(vl-mkdir ”c:hqd9639“)
B.(setq SYS(vlax-create-object ”scripting.FileSystemObject“))(setq ”c:hqd9639“))
;;******************************************************** 7.如何用(entsel)亮顯選擇物體? code:(if(setq ent(entsel ”nPick Object“))(progn FOLDER
(vlax-invoke-method
SYS
'CREATEFOLDER(redraw(car ent)3);;(redraw(car ent)4);;;不亮顯));;******************************************************** 8.如何隱藏選擇實體? code:(if(setq ent(entsel ”nPick Object“))(progn(redraw(car ent)1);;;隱藏實體;;(redraw(car ent)2);;;顯示實體));;******************************************************** 9.狀態欄進度條的設計示例
(defun c:hqd1()(acet-ui-progress ”已經完成“ 100)(setq x 0)(while(< x 100)(princ(strcat ”n“(itoa x)))(acet-ui-progress-1)(setq x(1+ x)))(acet-ui-progress))
;;******************************************************** 10.如何用VLISP獲取所有配置文件(Profiles)列表? code:(defun c:getAllProfiles()(setq
a
(vla-get-profiles
(vla-get-preferences(vlax-get-acad-object))))(vla-GetAllProfileNames a 'hqd)(if hqd(setq lst(vlax-SafeArray->List hqd))))
;;******************************************************** 11.如何在CAD中插入時間和日期? Code:(defun C:inttime()(setq pt0(getpoint ”n請指定插入位置點 :“))(setq date0(menucmd ”M=$(edtime,$(getvar,date), DD.MM.YYYY hh:mm:ss)“))(command ”text“ ”j“ ”m“ pt0 5.0 0 date0)(princ))
;;******************************************************** 12.如何用LISP打開WINDOWS的選擇目錄對話框?
方法有5種: a.(setq bmpdir(xdrx_getdir ”選擇目錄“ ”“ ”請選取目錄“))b.(dos_getdir ”選擇目錄:“ ”c:“)c.(setq picdir(Odcl_BrowseFolder ”選取文件目錄“ ”“))d.(acet-ui-pickdir ”選擇目錄“ ”“ ”請指定目錄“)e: Code:(defun qf_getFolder(msg / WinShell shFolder path catchit)(vl-load-com)(setq winshell(vlax-create-object ”Shell.Application“));(vlax-dump-object winshell T)(setq shFolder(vlax-invoke-method WinShell 'BrowseForFolder 0 msg 1))(setq catchit(vl-catch-all-apply '(lambda()(setq shFolder(vlax-get-property shFolder 'self))(setq path(vlax-get-property shFolder 'path)))))(if(vl-catch-all-error-p catchit)nil path))
;;******************************************************** ************************************************;;例一
(defun ett_ct()(initget ”C “);關鍵字“C”及空格
(setq s0(entsel ”n設置顏色C / 選取文本:“))(cond((= s0 ”C“)(ett_col));轉設置顏色子函數((= s0 ”“)nil);空格退出((and(=(type s0)'LIST);選擇實體
(=(cdr(assoc 0(entget(car s0))))”TEXT“);判別文本)...;操作內容
(ett_ct);編輯后返回選擇)(t(ett_ct));空選返回選擇))************************************************ 其中(setq s0(entsel ”n設置顏色C / 選取文本:“))正確的寫法應該是:(setq s0(entsel ”n設置顏色C /< 選取文本>:“));;例五
(defun newerr(s);出錯函數(if s(progn(term_dialog);使用對話框時使用
(if olderr(setq *error* olderr));出錯函數恢復(if oldvar(setvar...oldvar));系統變量恢復(if olderr(setq *error* olderr));出錯函數恢復(command ”_.undo“ ”_e“);Undo編組結束))(princ))我認為if語句是不必要的 另外可以直接
(defun *error*(s).....)這句(setq olderr *error* *error* newerr)改為(setq olderr *error*)就可以了
1)加載程序之前應先判斷文件是否已經被加載
在調用用戶自己定義的函數之前,應先將包含該函數的文件調入內存(LOAD ”文件“).但如果每次調用前都加載該程序,則會浪費很多時間.因此判別文件是否已經調入內存,則是非常重要的,這種用法在菜單文件十分普遍
[RECTAN](if(not rectan)(load ”les2“));(rectan);在文件內同樣可以實現同樣的檢測 2)抑制函數運行后返回nil 在一個Autolisp函數運行結束后,它常會在命令行上返回一個nil,令人遺憾。其實只要我們問在該函數的最后一行加上(PRINC)語句后,即可抑制nil的產生。
當然如果對需要一個結果的函數,則不可采用此法。3)幾個自動執行函數 a)加載自動執行函數(defun s::startup()...)
一旦該函數在acad.lsp函數中定義,在autocad啟動時,就會自動加載該函數.b)存盤自動執行函數 定義
(defun S::save()....)該函數與(s::startup)相似,在存儲文件時將會被自動執行.例如:在保存文件時,對被保存文件生成備份文件等,就可能需要此功能文件
c)退出時自動執行文件 定義
(defun s::exit()...)4)怎樣判斷兩個實數相等
對于計算出來的實數,即使真的相等,但對計算機來說,其往往不是絕對相等(如2.00 與2.000就不等).因此判斷其相等就需要采用差值方法
(equal expr1 expr2 [FUZZ])其中任選項FUZZ指定表達式EXPR1 EXPR2 的最大允許差值.即如果實際差值小于FUZZ,則判斷結果為真,反之為假.(if(equal a b 0.001)(prompt ”These numbers are equal“)(prompt ”These numbers are not equal“))5)取系統的環境變量
對編制自己的系統來說,最好將自己的所有編制程序集中在自己獨立的目錄下,如acadlisp等.然后在將該目錄添加到ACAD環境中.在自己編制的程序中,為了確保所要調用函數或文件在AUTOCAD的搜索路徑下,就需要判斷自己編制的程序目錄是否在ACAD環境內.此時就要用(getnev)函數
如(setq nev(getenv ”acad“))其將返
回
ACAD
系
統
環
境,如”C:ACADSUPPORT;C:ACADFONTS;C:ACADLISP 當你把開發的帶有DCL文件的LSP程轉交給他人使用時,一般要把兩個文件分別交付。如果直接在LSP程序中創建DCL文件(一般也都比較小),再編譯成FAS,然后再交給他人,那就只有一個文件了,而且表面上還可以對DCL文件加密(當然,程序運行時會泄密的,但不好好想想也不是那么容易發現的。)
簡單舉例:
(setq filename(vl-filename-mktemp “test.dcl”));創建DCL文件(setq dclfile(open filename “a”))(princ “test :dialog{ :edit_box{ key = ”eb1“;} :edit_box{ key = ”eb2“;} :slider{ key =”sld“;} :button{ label= ”OK“;key = ”ok“;is_default=true;} }” dclfile);寫DCL文件(close dclfile);主程序
(setq dcl_id1(load_dialog filename))(new_dialog “test” dcl_id1)(action_tile “eb1” “(alert ”edit_box1回調!“)”)(action_tile “eb2” “(alert ”edit_box2回調!“)”)(action_tile “sld” “(alert ”slider回調!“)”)(action_tile “ok” “(done_dialog)”)(start_dialog)(unload_dialog dcl_id1)(vl-file-delete filename);刪除DCL文件
第二篇:編程心得
1. 對于液晶點陣,做任何圖形的子函數,一定要注意,必須為整數,即像素必須為整數,否則將出現錯誤,比如劃三角形,必須讓三角形的斜率為直線,不然不能得到預期的結果。
2. 對于變量的定義,如果在條件語句里面必須放在語句最前面,如果在整個函數的里面,必須放在整個函數的最前面。
3. GDB來調試已經生成的可執行程序hello.命令如下:Gdbhello ,參數-d指示源代碼所
在的目錄去搜尋。一旦出現GDB的命令提示符(gdb),就表明GDB已經準備好接收來自用戶的各種調試命令了。如果想在調試環境下運行這個程序,可以使用GDB提供的“run”命令,而程序在正常運行時所需的各種參數可以作為“run”命令的參數傳入,或者使用單獨的“set args”命令進行設置。如果在執行“run”命令時沒有給出任何參數,GDB將使用上一次“run”或“set args”命令指定的參數。如果想取消上次設置的參數,可以執行不帶任何參數的“set args”命令。
GDB是一個源代碼級的調試器,使用“list”命令可以查看當前調試對象的源代碼。該命令的通用格式為“list [m,n]”,表示顯示從m行開始到n行結束的代碼段,而不帶任何參數的“list”命令將顯示最近10行源代碼。
要根據行號設置斷點,可以使用“ break linenum”命令。要根據函數名設置斷點,則應該使用“break funcname”命令。
條件斷點允許當一定條件滿足時暫時停止程序的執行。它對于調試來講非常有用。設置條件斷點的正確語法如下:
break linenum if expr
break funcname if expr
使用“continue”命令繼續執行程序,直到遇到下一個斷點。如果在調試時設置了很多斷點,可以隨時使用“info breakpoints”命令來查看設置的斷點。此外,開發人員還可以使用“delete”命令刪除斷點,或者使用“disable”命令來使設置的斷點暫時無效。被設置為無效的斷點在需要的時候可以用“enable”命令使其重新生效。
為了單步跟蹤代碼,可以使用單步跟蹤命令“step”,它每次執行源代碼中的一行。
4、程序調試過程中,如果出現segment,一般來說是指針沒有賦值,找不到原型。比如線程里面如果要調用screen_mm,那么必須傳遞參數screen_mm,而且需要在線程里面定義參數。
5、如果線程里面用到串口的操作,則最好把串口初始化程序放到線程里面進行。也可以把初始化作成模塊,這樣不會影響串口的收發數據。如果將串口初始化放到主程序里面,則最后將初始化程序放在線程的屬性定義和建立線程之前,否則其他地方可能導致串口收發數據產生問題。還有對于串口操作的定義最好放在所有變量定義的最前面。
6、對于段錯誤這種問題。可以分析以下原因:
(1):指針非法,比如使用沒有初始化的指針(沒有為此指針指向的對象分配空間),或著Free掉之后再次使用。
(2):數組訪問越界,訪問的元素下標超過數組圍長
(3):緩存溢出,對于這種while(1){do}的程序,這個問題最容易發生,多此sprintf或著strcat有可能將某個
buff填滿,溢出,所以每次使用前,最好memset一下,不過要是一開始就是段錯誤,而不是運行了一會兒出現的,(3)的可能性就比較小。
第三篇:編程培訓心得
編程培訓心得3篇
篇一:軟件編程學_心得
軟件編程學_心得
隨著計算機技術的發展和工作的需要,為了能夠更好的維護公司生產管理系統;公司安排我們到北大青鳥APTECH進修。我們選擇了時下最流行、發展速度較快的語言C#。C#學_共分三個階段,目前我只學_了第一個階段;現將我在北大青鳥學_第一階段為期兩個月的學_心得總結如下:
C#是一種新的面向對象的編程語言,專門用于.NET運行時。C#編譯器只能生成受管制的代碼,也可以使用.NET基類。C#語言自C/C++演變而來。但是,它具有簡單、現代、完全面向對象和類型安全等諸多特性。下面就簡單說說簡單和現代其中兩種特性。
1、簡單
C#具有C++所沒有的一個優勢就是學_簡單。該語言首要的目標就是簡單。很多功能(還不如說是缺少了C++的一些功能)有助于C#全方位的簡單。
在C#中,沒有C++中流行的指針。默認地,您工作在受管理的代碼中,在那里不允許如直接存取內存等不安全的操作。我想沒有C++程序員可以聲稱,從沒有使用指針訪問過不屬于他們的內存。
C#棄用其它操作符,名字空間、成員和引用僅使用單個操作符
.。現在一個程序員所需要理解的就是嵌套名字的注解了。
C#使用統一的類型系統。這種系統充許您把各種類型作為一個對象查看,它是一個原始類型還是一個full-blown
類。和其它編程語言相比,由于加框(boxing)和消框(unboxing)的機制,把簡單類型當作對象處理并不能獲得性能的改善。稍后將詳細解釋加框和消框,但基本上僅當需要時才使用對象訪問簡單類型這種技術。
2、現代
投入學_C#的努力是一筆大投資,因為C#是為編寫NGWS
應用程序的主要語言而。很多用C++可以實現或者很費力實現的功能,在C#中不過是一部分基本的功能而已。根據應用程序的特殊需求,可以很容易地創建出新的一種數據類型。
指針不再是編程武器的一部分。運行時NGWS提供了一個垃圾收集器,負責C#程序中的內存管理。因內存和應用程序都受到管理,所以很必要增強類型安全,以確保應用的穩定性。
異常處理是C#的主要功能。C#的異常處理與C++的不同點在于它是交叉語言的(運行時的另一個功能)。在沒有C#之前,您必須處理怪異的HRESULTs,但現在由于使用了基于異常的健壯的出錯處理,這一切都結束了。
對于現代的應用程序,安全是首要的,C#也不會例外。它提供了元數據語法,用于聲明下述NGWS安全模式的能力和許可。元數據是NGWS運行時的一個關鍵的概念。
通兩個多月學_,我能夠很好的掌握C#語言的基本語句、語法以及老師補充的一些要點;能夠編寫簡單的應用程序,例如電子郵件的收發等,為接下來的第二、第三階段學_打下了良好的基礎。
篇二:編程心得體會
篇一:java編程心得體會
java編程心得
計算機3班
竇金霞
4773
最近幾周一直在弄程序,說實話真的很累,但累中也有成功的快樂。我覺得學到了很多東西,這是只看課本知識所不能學到的。
說實話,以前我一直沒學過java雖然我也知道java的重要性,可是即使上課聽了,不實踐還是掌握不了。因為種種原因,今年我沒有買筆記本。沒有機器,僅僅靠每周一次的上機練_是絕對不夠的。所以我就插空調程序,在舍友們不用的時候自己再接她們的電腦調。
調上一個web版的通訊錄程序時我已經感覺到學的很吃力,好多東西都不懂。這次做的這個學生成績管理系統更復雜了,所以一開始調的時候感覺特別吃力.所以我告訴自己不能放棄,慢慢來,就這樣我從最基本的sql語句session對象開始學起,我覺得我還有太多不懂得所以要比別人付出更多的努力。就這樣我一點一點的學著??
說心里話,在做上一個web版的通訊錄時,我就感覺到成功的喜悅。好多地方我都是一點一點的問的,在問的過程中,我也學會了很多,像:servlet和jsp之間跳不過去時有兩種解決辦法,一是關閉底層類中的db.close;二是將servlet中的throws
exception改成try
catch以捕捉異常;我還學到了集中查找錯誤的方法,可以加上兩個雙斜杠“//”將具體的方法屏蔽掉,一檢查是方法錯誤還是servlet錯誤,還有就是寫上system.out.println()將獲得的數據輸出,用來檢查數據傳輸過程有沒有錯誤等等。
雖然在別人看來,這些方法可能都很常規,但是確實我自己學會的,我覺得很有成就感。我已經做好了,暑假的時候去買本本用自己的本本練_一下java,雖然下學期不學java了,但是我對java的熱情不會因為這個而削減的!
做完這個學生成績管理系統后,我覺得我對java的看法已經改變了。一前總以為java很繁瑣很難,聽同學說java不好學,開始又有一些聽不懂,所以一直很畏懼java。但真正做了這個系統以后我才感覺到其實任何事都沒有難與不難之分,只要你肯努力的去做,世上無難事只怕有心人!
我現在對java學_充滿了熱情,我知道我還有很多的不足還有很多需要努力的地方,所以我的java之旅將繼續進行??篇二:程序設計體會
程序設計
【收獲及體會】
通過兩個星期的折騰,總算把課程設計給完成了,這是一個堅苦而又漫長的過程。是啊,讀了那么多年的書,課程設計可是第一次。看著勞動成果,很欣慰!雖然這不是我一個人做的,是大家的共同努力得來的。
剛開始,可以說是沒有頭緒,于是就去圖書館找資料,找到了一些關于畫圖方面的,可是這點小進展遠遠不夠,這只是一個小小的開始。下一步是上網查,找到了些與我們題目相似的,那時我們每個人都很高興,可是那還不是我們要的,于是又上網查到了些有關的函數等等,終于在我們大家的努力下,完成了這個程序。
雖然對著電腦做程序,有點累有點熱,可是當看到勞動成果時,真是別有一番滋味在心頭啊!世上無難事,只怕有心人,的確如此。做完這個程序最大的收獲就是感受到了集體的力量,當然個人的智慧也是很重要的哦!
做完這個課程設計,我們的自信一下子提高了,我們也會寫程序了;盡管對于有些人這種程序會很簡單,可對我們c語言初學者來說,已經很不容易了。這次體驗為以后的學_計算機的我們增強了信心。享受勞動成果的滋味實在很美妙啊!
——姜*
【收獲及體會】
忙碌了一個多星期,在大家的共同努力下,我們總算將此程序設計出來。盡管不是自己獨立完成,但仍然很高興,因為在設計的過程中,讓我了解到要設計一個大型程序,查找資料是至關重要的,在他人的基礎上,再根據自己所學進行修改與調試,最后設計
第四篇:PLC編程心得
即使是同一個項目,同一個人,要他重新寫一次,也會與原來的不同,我只是看別人的一種思路,是怎樣把程序去組織好,如何規范合理分配好元件,我看簡單也不一定好,我的編程習慣是要求流程要清晰,即使多花點步數也好。所以我現在一般都不用一個梯形圖完成,而是用SFC去編排組織梯形圖的執行順序,這樣就不用擔心什么互鎖連鎖的問題,我現在在編寫的程序我估計在18000步左右,若是用單一的梯形圖來編,我估計對以后的維護和修改會做成很大的困難。
現在工控制軟件大部份是可以破解,但如果不想別看懂的程序的話,把里面最好不放常數,全部是數據寄存器,多用一些功能指令,拿出點技術來,要把哭程序寫少而精,不要多而雜。我不鼓歡太亂的程序。如果你把技巧都定上去啦,相信不是一般的高手都沒辦法看懂,那樣別人是服了你的技術,而不是服你的亂!我一向都不怕別人看程序,我也不喜歡看別人程序,這就是這的風格!單一!寧可少而精,不可多而雜
上是高手啊,我公司有一臺設備的PLC程序真的不放常數,全部是數據寄存器,下載下來的程序在另外一臺PLC就不能使用!
我們公司有幾臺設備都是意大利進口的,都是幾千萬的設備,老外的程序都沒見有常數,應用了好多數據塊,一般的工程師都看不懂的
第五篇:C++編程心得
緊張忙碌的一周過去了,在這個星期里我們小組勝利地將我們選定的課題研究出來,我為我的小組驕傲,也為自己驕傲。
我們的題目是銀行定期存款管理系統,在編程過程中,我預訂的任務是學習并掌握MFC,并將其運用到我們的程序中。學習MFC的過程是我認為非常痛苦的事,因為完全都是自學,并且因為圖書館中的相關書籍全部被借閱出去,所以沒有太多的自學資料,因此雖然費了很大的精力,但仍是無果。經過了很多的小組討論和自己的心理斗爭后最終決定放棄MFC而將自己能力以內的程序盡可能地優化,就這樣,我開始在半路階段加入了程序優化的工作,一遍遍的調試程序,遇到某個攻堅問題,幾個人一起在網上查詢,一起想解決的辦法,就這樣,我們團結地將我們現在認為將近完美的程序呈現給老師和同學。
一開始學習MFC時,我總是不能很好的轉換思維,不能將自己以前的編程思想和以前的一些不良編程習慣甩掉,因此很多的程序都聯系不起來,反而是自己學會了好多的零碎的片面卻無法將程序大樓豎起來。在困惑很久后,我選擇了詢問老師,老師耐心地將MFC的思維方式講給了我聽,這讓我受益匪淺,雖然我最后沒能將MFC成功的做出來,但我認為我從MFC中才直接地感受到了C++中面向對象編程的封裝性。以前用C++編程時總是將類中的變量隨便規定屬性,甚至在編程的過程中突然需要加一個變量,為了省事直接將其放于public中,在學習了解MFC后,深刻地感受到自己以前的編程習慣是多么的不科學,而那些習慣又是多么的重要。
我們這一次是以團隊的形式來做這個項目,并且作為這個小組的組長,我感覺自己的壓力很大,因為團隊合作不僅講求整體的團結而且為了團隊工作的高效又要有明確的分工。在我們的小組工作中每個人都一刻不放松自己手里的工作,而一些時候我們又配合地很密切,尤其是當我們遇到程序的瓶頸時,我們都是在宿舍里你一句我一句地出謀劃策,在遇到一個提取時間的程序時,大家紛紛查詢各種輔導書,上網查各種資料,在遇到定期存款支取問題時甚至打電話給家長,尋求“場外支持”,種種的配合都給我們這個部門協調的運作提供了動力。我感謝我的團隊,他們讓我有一種很舒服的做事情的感覺。
最終決定放棄MFC,我承認自己有一種如釋重負的感覺,但是也有一絲慚愧,無論老師要求與否,既然自己決定了就應該走下去,但是我最后退卻了,感覺很遺憾也很羞愧,因為我認為對自己降低要求就是放縱自己墮落。
短學期實習,我著實收獲了很多,不僅僅是知識上,而且是思考事情方法,我感激這次的實習,也感謝給予我們很多幫助的老師,更感謝我團結的團隊。