㈠ 完全零基礎自學編程,應該選擇哪個入門方向
完全零基礎自學編程,應該選擇哪個入門方向 首先明確你的學習方向和學習目的。
目的性,你得明白你是追求技術的卓越還是為了職業需求,或者興趣使然。學編程絕非一朝一夕所能達成的事情,期間肯定會遇到各種各樣困難,有時候你會想放棄。但看你個人能不能堅持。
如果你是為了追求技術的卓越,那麼我建議你首先從c入門。c是現在幾乎所有的高等語言的「父親」。然而,c也是公認的復雜。由於c的操作對象往往是硬體級別的,因此對硬體的把我尤其需要到位。c之後,你可以嘗試學習c++,c++之後,基本所有的語言,你可以看興趣學習了。
方向性,你的明白你學習什麼。編程從發明之初到現在,已經出現很大的分流。從以前的單一單片機開發,發展到現在的人工智慧、網路開發、應用開發、游戲開發、科學計算等。你得明白你要選擇的方向是哪個。常用的選擇方向就是應用開發和網路開發,應用開發又分為移動app和桌面級app開發,網路開發又分為web開發,雲開發等。因此,你得明確自己的開發目的。不同的開發所學習的語言一般不同,例如:安卓開發使用java,ios開發使用swift,windows開發是最多的,幾乎所有語言都可以開發windows。web看開發前端使用javascript,,css等,後端的選擇更多,ruby、php、nodejs等。
編程語言是沒有廉價之別的,只要你喜歡,你甚至可以用vb開發出比c++開發更優秀的軟體。
當你明確你自己的開發方向和開發目的之後,你才能確定自己的入門方向,否則,非但學不會,還會更迷茫。
如果你明確自己的目的性和方向性,請回復我,我進一步給你作答。
個人感覺還是web好一些
原因如下
web主要是前段和後端
前段HTML+css+javascript,
後端需要PHP或者python,或者比較新潮的node.js, 還要懂一些linux
操作系統太難,電腦軟體也不是一朝一夕可以出師的,無盡的bug
相對來說,web的上手難度較低,但是學精也不是很容易的事
web的代碼很容易找到,也有無數的網站可以參考
IOS/安卓也比較熱門,上手也不難,也有很多源代碼和課程可以學習
也是很不錯的
也就是HTML5和app之爭了。
如果只是基於個人興趣的話
個人覺得學習python比較好
python語法靈活,功能強大,可以在操作系統,web,數據處理,游戲開發等各方面應用
是最好的腳本語言,沒有之一
雖然不太適合大型項目,但是lz估計對大項目也沒什麼興趣
網上的包也很多,和linux絕配
lz可以考慮一下,學linux+python
純C語言編輯器,幾乎沒有了,都是c++,向下兼容C
主要有ms家的vs,有免費的社區版本
然後就是gun的g,linux自帶
還有就是clang,BSD和mac的默認編譯器
編譯功能是ms最好,但是目前ms不支持其他平台
g和clang都差不多,g流行一些,clang支持更多的c++特性
零基礎學編程應該選哪個語音
將來想做程序員的話,最好是首先從java學起,這就好比,學習使用一種餐具,首先學習筷子,然後再學使用什麼勺子刀叉就手到擒來
自學編程怎麼入門(零基礎)
因為你說是因為愛好才學,我便回一回這問題。
建議:去書店買一本c語言入門書籍看看。把書上的代碼手工往電腦上錄入,調試(我用了四個月,所有工作之餘的所有時間都在看、想……四個月勉強入門……),學會了這一種語言,其它的語言都很容易過渡的。
之後,再學數據結構,充分認識點,線、樹、圖形等等……這里我用的時間太多,但數基礎不行,還有些都沒有學會……
之後,你自己就知道怎麼辦了……
我也因為愛好才學的,也是自學。
你是高中生,比我好多了,我是初中生,你比我學習起來更容易。
你好~自學JAVA零基礎應該選什麼書入門。謝謝
初級JAVA的基礎知識:
1、首先要學習java的基礎知識。
不要被新技術迷惑,所謂萬變不離其宗,新技術都是基於java的基礎之上,如果基礎不扎實,對於這些新技術的理解也是一知半解,學不到根源。
2、做一個java項目
在學習完java的基礎知識之後,做一個java項目來鞏固一下,在項目中會發現很多問題,通過解決問題,加深基礎知識的掌握。
3、學習資料庫的基礎知識和開發應用
軟體開發離不了資料庫,掌握幾種流行的資料庫:Oracle、SQL
server、MySQL等。
4、JEE基礎
在這里首先要學習網站基礎,包括HTML、DHTML、JavaScript;接著要學習XML,XML JAXP;然後學習JEE基礎,包括JEE開發環境,RMI/IIOP、JNDI;最後學習JDBC資料庫的應用開發。
5、web開發
全面的JEE的web開發知識:Servlet JSP javaBean TagLib,到這里做一個完整的web應用項目開發。
6、EJB開發
包含全面的EJB知識:1)EJB入門和無狀態會話Bean;2)有狀態會話Bean;3)BMP和CMP是實體Bean;4)jms和MessageDrivenBean;5)事物和安全(JTA、JTS和JAAS);6)WebService的開發和應用;
7、開源框架的學習
學習幾種現在流行的開源框架:Struts、Spring、Hibernian、Webwork等。完整的學習這些框架的開發和應用。如果有興趣還可以學習Ibati框架、AJAX技術和DWR框架的開發和應用。
8、JEE項目
綜合應用JEE的知識來開發一個完整的應用。
9、面向對象分析與設計
java是一種面向對象的語言,所以要深入學習面向對象的分析與設計,另外還要學習UML統一建模語言。
10、接下來就是系統設計與架構
這里要學習的是Java設計模式、EJB設計模式、JEE核心設計模式、JEE應用程序框架設計。
11、軟體工程
軟體工程基本理論知識的學習,還有Rup和極限編程。
12、技術研究
學習搜索引擎技術:如Lucene等、工作流技術:包含Shark、JBPM等、SOA架構和應用。
13、綜合項目實戰
實現一個企業級的應用。
零基礎,學習python哪個方向入門快
Python學得倒不用很深,循環跟函數還有類學完就可以搞深度學習了。 新手用深度學習庫先跑跑,真要進階還要修改的話,你會發現瓶頸其實在數學,不在Python
零基礎自學編程 應該怎麼學?
當然不晚。
入門的話,建議從學c語言開始,而且要從最簡單的書本開始,比如《c程序設計》,
先把基礎打牢,畢竟任何哪一種編程語言都是有相似之處的,學透一門,就可以很快上手另一門。
然後再深入學習資料庫、數據結構、操作系統、軟體工程等等很多相關的知識。
然後你還要考慮學編程的目的是什麼。如果是為了開發軟體什麼的,那就選一門面向對象的編程語言,比如java、c#等等。如果是為了當黑客之類的,那最好還有接觸匯編和底層開發。
以上僅個人見解。
求VBS編程零基礎入門
有個軟體叫做vbsedit,寫vbs很不錯,強烈推薦
注意下載時,防病毒
零基礎自學編程。
如果是零基礎的話, 建議你從 Javascript 入手, 為期一個月 (無必要太長時間, 除非你准備向 web 發展 ).
首先你要知道一件事, 就是編程的編緝軟體 -- 我們叫 IDE ( Integrated Development Environment, 集成開發環境 ) 其實也很有學問, 比如你想寫 Java, 你首先要裝個 Java 的 SDK ( Sofare Development Kit , 即是 jvm ) , 然後再裝個 Eclipse 或者 Netbeans , 進入 IDE 後, 你還得設置一輪專案相關的資訊, 才能開始寫你的第一句指令... ( 未見官先打八十, 有很多初學者來到這里已經意志殆盡了 )
Javascript 就最簡單了, 你用個記事本 ( 其實我會建議用 notepad++ ) 寫個 檔, 雙擊一下就可以在瀏覽器里跑出結果來了.. 不信你就試試
用記事本, 在桌面建一個叫 test. 的檔, 寫入以下內容
<script> document.write ( "Hello World!" ) alert ( '成功了!' )</script>
存檔後雙擊, 你的瀏覽器就是綳出來並展示結果. ( 如果走出來的是記事本的話, 那是你的副檔名出錯了 )
大多數編程語言的概念都是差不多的, 都是變數, 數組, 邏輯, 循環., 然後就是物件, 繼承, 多型繼承.. Javascript 可以給你一個很好的開始 ( 唯一是 javascript 不能讀寫檔案 ), 你可以先鍛鍊好編程者的思路. 再開始摸索其他的語言, 你會更知道你需要的是甚麼.
我想自學吉他,應該從哪入門,零基礎
磨好你的左手指尖肚,要不然摁琴弦的時候嗷嗷疼。買本自學教材什麼一本通啊,好學。我自學的,也能彈個什麼丁香花啊那些花兒啊,可是後來很久不練,手指肚軟了,再摁賊疼,索性就不玩了。
㈡ 「Keil C51」下如何讓編譯器優先使用片內「RAM」
C51內存結構深度剖析x0dx0a在編寫應用程序時,定義一個變數,一個數組,或是說一個固定表格,到底存儲在什麼地方;當定義變數大小超過MCU的內存范圍時怎麼辦;如何控制變數定義不超過存儲范圍;以及如何定義變數才能使得變數訪問速度最快,寫出的程序運行效率最高。以下將一一解答。x0dx0ax0dx0a1 六類關鍵字(六類存儲類型)x0dx0adata idata xdata pdata code bdatax0dx0ax0dx0a code: code memory (程序存儲器也即只讀存儲器)用來保存常量或是程序。code memory 採用16位地址線編碼,可以是在片內,或是片外,大小被限制在64KBx0dx0a 作用:定義常量,如八段數碼表或是編程使用的常,在定義時加上code 或明確指明定義的常量保存到code memory(只讀)x0dx0a 使用方法:x0dx0a char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};x0dx0a 此關鍵字的使用方法等同於constx0dx0ax0dx0adata data memory (數據存儲區)只能用於聲明變數,不能用來聲明函數,該區域位於片內,採用8位地址線編碼,具有最快的存儲速度,但是數量被限制在128byte或更少。x0dx0a 使用方法:x0dx0a unsigned char data fast_variable=0;x0dx0ax0dx0a idata idata memory(數據存儲區)只能用於聲明變數,不能用來聲明函數. 該區域位於片內,採用8位地址線編碼,內存大小被限制在256byte或更少。該區域的低地址區與data memory地址一致;高地址區域是52系列在51系列基礎上擴展的並與特殊功能寄存器具有相同地址編碼的區域。即:data memory是idata memory的一個子集。x0dx0a x0dx0a xdata xdata memory 只能用於聲明變數,不能用來聲明函數,該區域位於MCUx0dx0a 外部,採用16位地址線進行編碼,存儲大小被限制在64KB以內。x0dx0a 使用方法:x0dx0a unsigned char xdata count=0;x0dx0ax0dx0apdata pdata memory 只能用於聲明變數,不能用來聲明函數,該區域位於MCU外部,採用8位地址線進行編碼。存儲大小限制在256byte. 是xdata memory的低256byte。為其子集。x0dx0a 使用方法x0dx0a unsigned char pdata count=0;x0dx0ax0dx0a bdata bdata memory 只能用於聲明變數,不能用來聲明函數。該區域位於8051內部位數據地址。定義的量保存在內部位地址空間,可用位指令直接讀寫。x0dx0a 使用方法:x0dx0a unsigned char bdata varab=0x0dx0ax0dx0a 註:有些資料講,定義字元型變數時,在預設unsigned 時,字元型變數,默認為無符號,與標准C不同,但我在Keil uVision3中測試的時候發現並非如此。在預設的情況下默認為有符號。或許在以前的編譯器是默認為無符號。所以看到有的資料上面這樣講的時候,要注意一下,不同的編譯器或許不同。所以我們在寫程序的時候,還是乖乖的把unsigned signed 加上,咱也別偷這個懶。x0dx0a 2函數的參數和局部變數的存儲模式x0dx0a C51 編譯器允許採用三種存儲器模式:SMALL,COMPACT 和LARGE。一個函數的存儲器模式確定了函數的參數的局部變數在內存中的地址空間。處於SMALL模式下的函數參數和局部變數位於8051單片機內部RAM中,處於COMPACT和LARGE模式下的函數參數和局部變數則使用單片機外部RAM。在定義一個函數時可以明確指定該函數的存儲器模式。方法是在形參表列的後面加上一存儲模式。x0dx0a x0dx0a 示例如下:x0dx0a #pragma large //此預編譯必須放在所有頭文前面x0dx0a int func0(char x,y) small;x0dx0a char func1(int x) large;x0dx0a int func2(char x);x0dx0a 註:x0dx0a 上面例子在第一行用了一個預編譯命令#pragma 它的意思是告訴c51編譯器在對程序進行編譯時,按該預編譯命令後面給出的編譯控制指令LARGE進行編譯,即本常式序編譯時的默認存儲模式為LARGE.隨後定義了三個函數,第一個定義為SMALL存儲模式,第二個函數定義為LARGE第三個函數未指定,在用C51進行編譯時,只有最後一個函數按LARGE存儲器模式處理,其它則分別按它們各自指定的存儲器模式處理。x0dx0a 本例說明,C51編譯器允許採用所謂的存儲器混合模式,即允許在一個程序中將一些函數使用一種存儲模式,而其它一些則按另一種存儲器模式,採用存儲器混合模式編程,可以充分利用8051系列單片機中有限的存儲器空間,同時還可以加快程序的執行速度。x0dx0ax0dx0a3絕對地址訪問 absacc.h(相當重要)x0dx0ax0dx0a#define CBYTE ((unsigned char volatile code *) 0)x0dx0a#define DBYTE ((unsigned char volatile data *) 0)x0dx0a#define PBYTE ((unsigned char volatile pdata *) 0)x0dx0a#define XBYTE ((unsigned char volatile xdata *) 0)x0dx0a 功能:CBYTE 定址 CODE區x0dx0a DBYTE 定址 DATA區x0dx0a PBYTE 定址 XDATA(低256)區x0dx0a XBYTE 定址 XDATA區x0dx0a 例: 如下指令在對外部存儲器區域訪問地址0x1000x0dx0a xvar=XBYTE[0x1000];x0dx0a XBYTE[0x1000]=20;x0dx0ax0dx0a#define CWORD ((unsigned int volatile code *) 0)x0dx0a#define DWORD ((unsigned int volatile data *) 0)x0dx0a#define PWORD ((unsigned int volatile pdata *) 0)x0dx0a#define XWORD ((unsigned int volatile xdata *) 0)x0dx0ax0dx0a 功能:與前面的一個宏相似,只是它們指定的數據類型為unsigned int .。x0dx0a 通過靈活運用不同的數據類型,所有的8051地址空間都是可以進行訪問。x0dx0a 如x0dx0aDWORD[0x0004]=0x12F8;x0dx0a即內部數據存儲器中(0x08)=0x12; (0x09)=0xF8x0dx0ax0dx0a註:用以上八個函數,可以完成對單片機內部任意ROM和RAM進行訪問,非常方便。還有一種方法,那就是用指鍾,後面會對C51的指針有詳細的介紹。x0dx0ax0dx0a4寄存器變數(register)x0dx0a 為了提高程序的執行效率,C語言允許將一些頻率最高的那些變數,定義為能夠直接使用硬體寄存器的所謂的寄存器變數。定義一個變數時,在變數類型名前冠以「register」 即將該變數定義成為了寄存器變數。寄存器變數可以認為是一自動變數的一種。有效作用范圍也自動變數相同。由於計算機寄存器中寄存器是有限的。不能將所有變數都定義成為寄存器變數,通常在程序中定義寄存器變數時,只是給編譯器一個建議,該變數是否真正成為寄存器變數,要由編譯器根據實際情況來確定。另一方面,C51編譯器能夠識別程序中使用頻率最高的變數,在可能的情況下,即使程序中並未將該變數定義為寄存器變數,編譯器也會自動將其作為寄存器變數處理。被定義的變數是否真正能成為寄存器變數,最終是由編譯器決定的。x0dx0ax0dx0a5內存訪問雜談x0dx0a 1指鍾x0dx0a指鍾本身是一個變數,其中存放的內容是變數的地址,也即特定的數據。8051的地址是16位的,所以指針變數本身佔用兩個存儲單元。指針的說明與變數的說明類似,僅在指針名前加上「*」即可。x0dx0a 如 int *int_point; 聲明一個整型指針x0dx0a char *char_point; 聲明一個字元型指針x0dx0a 利用指針可以間接存取變數。實現這一點要用到兩個特殊運算符x0dx0a & 取變數地址x0dx0a * 取指針指向單元的數據x0dx0ax0dx0a示例一:x0dx0aint a,b;x0dx0a int *int_point; //定義一個指向整型變數的指針x0dx0a a=15;x0dx0a int_point=&a; //int_point指向 ax0dx0a *int_point=5; //給int_point指向的變數a 賦值5 等同於a=5; x0dx0a示例二:x0dx0a char i,table[6],*char_point;x0dx0a char_point=table;x0dx0a for(i=0;i<6;i++)x0dx0a {x0dx0a char_point=i;x0dx0a char_point++;x0dx0a}x0dx0a註:x0dx0a 指針可以進行運算,它可以與整數進行加減運算(移動指針)。但要注意,移動指針後,其地址的增減量是隨指針類型而異的,如,浮點指針進行自增後,其內部將在原有的基礎上加4,而字元指針當進生自增的時候,其內容將加1。原因是浮點數,佔4個內存單元,而字元佔一個位元組。x0dx0ax0dx0a宏晶科技最新一代STC12C5A360S2系列,每一個單片機出廠時都有全球唯一身份證號碼(ID號),用戶可以在單片機上電後讀取內部RAM單元F1H~F7H的數值,來獲取此單片機的唯一身份證號碼。使用MOV @Ri 指令來讀取。下面介紹C51 獲取方法:x0dx0a char id[7]={0};x0dx0a char i;x0dx0a char idata *point;x0dx0a for(i=0;i<7;i++)x0dx0a {x0dx0a id[i]=*point;x0dx0a point++;x0dx0a}x0dx0a x0dx0a(此處只是對指針做一個小的介紹,達到訪問內部任何空間的方式,後述有對指針使用的詳細介紹)x0dx0a2對SFR,RAM ,ROM的直接存取x0dx0aC51提供了一組可以直接對其操作的擴展函數x0dx0a若源程序中,用#include包含頭文件,io51.h 後,就可以在擴展函數中使用特殊功能寄存器的地址名,以增強程序的可讀性:x0dx0ax0dx0a 注 此方法對SFR,RAM,ROM的直接存取不建議使用.因為,淡io51.h這個頭文件在KEIL中無法打開,可用指針,或是採用absacc.h頭文件,
㈢ 怎麼用c語言實現matlab中的功能
通過把耗時長的函數用c語言實現,並編譯成mex函數可以加快執行速度。Matlab本身是不帶c語言的編譯器的,所以要求你的機器上已經安裝有VC,BC或Watcom
C中的一種。如果你在安裝Matlab時已經設置過編譯器,那麼現在你應該就可以使用mex命令來編譯c語言的程序了。如果當時沒有選,就在Matlab里鍵入mex
-setup,下面只要根據提示一步步設置就可以了。需要注意的是,較低版本的在設置編譯器路徑時,只能使用路徑名稱的8字元形式。比如我用的VC裝在路徑C:\PROGRAM
FILES\DEVSTUDIO下,那在設置路徑時就要寫成:「C:\PROGRA~1」這樣設置完之後,mex就可以執行了。為了測試你的路徑設置正確與否,把下面的程序存為hello.c。
/*hello.c*/
#include
"mex.h"
void
mexFunction(int
nlhs,
mxArray
*plhs[],
int
nrhs,
const
mxArray
*prhs[])
{
mexPrintf("hello,world!\n");
}
假設你把hello.c放在了C:\TEST\下,在Matlab里用CD
C:\TEST\
將當前目錄改為C:\
TEST\(注意,僅將C:\TEST\加入搜索路徑是沒有用的)。現在敲:
mex
hello.c
如果一切順利,編譯應該在出現編譯器提示信息後正常退出。如果你已將C:\TEST\加
入了搜索路徑,現在鍵入hello,程序會在屏幕上打出一行:
hello,world!
看看C\TEST\目錄下,你會發現多了一個文件:HELLO.DLL。這樣,第一個mex函數就算完成了。分析hello.c,可以看到程序的結構是十分簡單的,整個程序由一個介面子過程
mexFunction構成。
void
mexFunction(int
nlhs,
mxArray
*plhs[],
int
nrhs,
const
mxArray
*prhs[])
前面提到過,Matlab的mex函數有一定的介面規范,就是指這
nlhs:輸出參數數目
plhs:指向輸出參數的指針
nrhs:輸入參數數目
例如,使用
[a,b]=test(c,d,e)
調用mex函數test時,傳給test的這四個參數分別是
2,plhs,3,prhs
其中:
prhs[0]=c
prhs[1]=d
prhs[2]=e
當函數返回時,將會把你放在plhs[0],plhs[1]里的地址賦給a和b,達到返回數據的目的。
細心的你也許已經注意到,prhs[i]和plhs[i]都是指向類型mxArray類型數據的指針。
這個類型是在mex.h中定義的,事實上,在Matlab里大多數數據都是以這種類型存在。當然還有其他的數據類型,可以參考Apiguide.pdf里的介紹。
為了讓大家能更直觀地了解參數傳遞的過程,我們把hello.c改寫一下,使它能根據輸
入參數的變化給出不同的屏幕輸出:
//hello.c
2.0
#include
"mex.h"
void
mexFunction(int
nlhs,
mxArray
*plhs[],
int
nrhs,
const
mxArray
*prhs[])
{
int
i;
i=mxGetScalar(prhs[0]);
if(i==1)
mexPrintf("hello,world!\n");
else
mexPrintf("大家好!\n");
}
將這個程序編譯通過後,執行hello(1),屏幕上會打出:
hello,world!
而hello(0)將會得到:
大家好!
現在,程序hello已經可以根據輸入參數來給出相應的屏幕輸出。在這個程序里,除了用到了屏幕輸出函數mexPrintf(用法跟c里的printf函數幾乎完全一樣)外,還用到了一個函數:mxGetScalar,調用方式如下:
i=mxGetScalar(prhs[0]);
"Scalar"就是標量的意思。在Matlab里數據都是以數組的形式存在的,mxGetScalar的作用就是把通過prhs[0]傳遞進來的mxArray類型的指針指向的數據(標量)賦給C程序里的變數。這個變數本來應該是double類型的,通過強制類型轉換賦給了整形變數i。既然有標量,顯然還應該有矢量,否則矩陣就沒法傳了。看下面的程序:
//hello.c
2.1
#include
"mex.h"
void
mexFunction(int
nlhs,
mxArray
*plhs[],
int
nrhs,
const
mxArray
*prhs[])
{
int
*i;
i=mxGetPr(prhs[0]);
if(i[0]==1)
mexPrintf("hello,world!\n");
else
mexPrintf("大家好!\n");
}
這樣,就通過mxGetPr函數從指向mxArray類型數據的prhs[0]獲得了指向double類型的指針。
但是,還有個問題,如果輸入的不是單個的數據,而是向量或矩陣,那該怎麼處理呢
?通過mxGetPr只能得到指向這個矩陣的指針,如果我們不知道這個矩陣的確切大小,就
沒法對它進行計算。
為了解決這個問題,Matlab提供了兩個函數mxGetM和mxGetN來獲得傳進來參數的行數
和列數。下面常式的功能很簡單,就是獲得輸入的矩陣,把它在屏幕上顯示出來:
//show.c
1.0
#include
"mex.h"
#include
"mex.h"
void
mexFunction(int
nlhs,
mxArray
*plhs[],
int
nrhs,
const
mxArray
*prhs[])
{
double
*data;
int
M,N;
int
i,j;
data=mxGetPr(prhs[0]);
//獲得指向矩陣的指針
M=mxGetM(prhs[0]);
//獲得矩陣的行數
N=mxGetN(prhs[0]);
//獲得矩陣的列數
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
mexPrintf("%4.3f
",data[j*M+i]);
mexPrintf("\n");
}
}
編譯完成後,用下面的命令測試一下:
a=1:10;
b=[a;a+1];
show(a)
show(b)
需要注意的是,在Matlab里,矩陣第一行是從1開始的,而在C語言中,第一行的序數為零,Matlab里的矩陣元素b(i,j)在傳遞到C中的一維數組大data後對應於data[j*M+i]
。
輸入數據是在函數調用之前已經在Matlab里申請了內存的,由於mex函數與Matlab共用同一個地址空間,因而在prhs[]里傳遞指針就可以達到參數傳遞的目的。但是,輸出參數卻需要在mex函數內申請到內存空間,才能將指針放在plhs[]中傳遞出去。由於返回指針類型必須是mxArray,所以Matlab專門提供了一個函數:mxCreateDoubleMatrix來實現內存的申請,函數原型如下:
mxArray
*mxCreateDoubleMatrix(int
m,
int
n,
mxComplexity
ComplexFlag)
m:待申請矩陣的行數
n:待申請矩陣的列數
為矩陣申請內存後,得到的是mxArray類型的指針,就可以放在plhs[]里傳遞回去了。但是對這個新矩陣的處理,卻要在函數內完成,這時就需要用到前面介紹的mxGetPr。使用
mxGetPr獲得指向這個矩陣中數據區的指針(double類型)後,就可以對這個矩陣進行各種操作和運算了。下面的程序是在上面的show.c的基礎上稍作改變得到的,功能是將輸
//reverse.c
1.0
#include
"mex.h"
void
mexFunction(int
nlhs,
mxArray
*plhs[],
int
nrhs,
const
mxArray
*prhs[])
{
double
*inData;
double
*outData;
int
M,N;
int
i,j;
inData=mxGetPr(prhs[0]);
M=mxGetM(prhs[0]);
N=mxGetN(prhs[0]);
plhs[0]=mxCreateDoubleMatrix(M,N,mxREAL);
outData=mxGetPr(plhs[0]);
for(i=0;i<M;i++)
for(j=0;j<N;j++)
outData[j*M+i]=inData[(N-1-j)*M+i];
}
當然,Matlab里使用到的並不是只有double類型這一種矩陣,還有字元串類型、稀疏矩陣、結構類型矩陣等等,並提供了相應的處理函數。本文用到編制mex程序中最經常遇到的一些函數,其餘的詳細情況清參考Apiref.pdf。
通過前面兩部分的介紹,大家對參數的輸入和輸出方法應該有了基本的了解。具備了這些知識,就能夠滿足一般的編程需要了。但這些程序還有些小的缺陷,以前面介紹的re由於前面的常式中沒有對輸入、輸出參數的數目及類型進行檢查,導致程序的容錯性很差,以下程序則容錯性較好
#include
"mex.h"
void
mexFunction(int
nlhs,
mxArray
*plhs[],
int
nrhs,
const
mxArray
*prhs[])
{
double
*inData;
double
*outData;
int
M,N;
//異常處理
//異常處理
if(nrhs!=1)
mexErrMsgTxt("USAGE:
b=reverse(a)\n");
if(!mxIsDouble(prhs[0]))
mexErrMsgTxt("the
Input
Matrix
must
be
double!\n");
inData=mxGetPr(prhs[0]);
M=mxGetM(prhs[0]);
N=mxGetN(prhs[0]);
plhs[0]=mxCreateDoubleMatrix(M,N,mxREAL);
outData=mxGetPr(plhs[0]);
for(i=0;i<M;i++)
for(j=0;j<N;j++)
outData[j*M+i]=inData[(N-1-j)*M+i];
}
在上面的異常處理中,使用了兩個新的函數:mexErrMsgTxt和mxIsDouble。MexErrMsgTxt在給出出錯提示的同時退出當前程序的運行。MxIsDouble則用於判斷mxArray中的數據是否double類型。當然Matlab還提供了許多用於判斷其他數據類型的函數,這里不加詳述。
需要說明的是,Matlab提供的API中,函數前綴有mex-和mx-兩種。帶mx-前綴的大多是對mxArray數據進行操作的函數,如mxIsDouble,mxCreateDoubleMatrix等等。而帶mx前綴的則大多是與Matlab環境進行交互的函數,如mexPrintf,mxErrMsgTxt等等。了解了這一點,對在Apiref.pdf中查找所需的函數很有幫助。
至此為止,使用C編寫mex函數的基本過程已經介紹完了。
㈣ AutoCAD二次開發工具有哪些
下面是我找到的資料,希望對你有用。AutoCAD二次開發工具綜述
AutoCAD是目前微機上應用最為廣泛的通用的互動式計算機輔助繪圖與設計軟體包。AutoCAD的強大生命力在於它的通用性、多種工業標准和開放的體系結構。其通用性使得它在機械、電子、航空、輪船、建築、服裝等領域得到了極為廣泛的應用。但是,不同的行業標准使得各領域在使用AutoCAD的過程中均需根據自身特點進行定製或開發。Autodesk公司為滿足廣大用戶的需求,自AutoCAD v2.18版至AutoCAD 2000的短短十幾年間,就相繼推出了三代二次開發工具,如圖1示。可以說,AutoCAD的通用性為其二次開發提供了必要條件,而AutoCAD開放的體系結構則使其二次開發成為可能。
下面對AutoCAD的三代開發工具進行淺析。
一、第一代開發工具——AutoLISP
AutoLISP是1986年隨AutoCAD v2.18提供的二次開發工具。它是一種人工智慧語言,是嵌入AutoCAD內部的COMMON LISP的一個子集。在AutoCAD的二次開發工具中,它是唯一的一種解釋型語言。使用AutoLISP可直接調用幾乎所有的AutoCAD命令。
AutoLISP語言最典型的應用之一是實現參數化繪圖程序設計,包括尺寸驅動程序和滑鼠拖動程序等。另一個典型應用就是驅動AutoCAD提供PDB模塊構成DCL(Dialog Control Language)文件創建自己的對話框。
AutoLISP具有以下優點:(1)語言規則十分簡單,易學易用;(2)直接針對AutoCAD,易於交互;(3)解釋執行,立竿見影。
AutoLISP的缺點是:(1)功能單一,綜合處理能力差;(2)解釋執行,程序運行速度慢;(3)缺乏很好的保護機制,源程序保密性差;(4)LISP用表來描述一切,並不能很好地反映現實世界和過程,跟人的思維方式也不一致;(5)不能直接訪問硬體設備、進行二進制文件的讀寫。
AutoLISP的這些特點,使其僅適合於有能力的終端用戶完成一些自己的開發任務。
二、第二代開發工具——ADS
ADS(AutoCAD Development System)是AutoCAD R11開始支持的一種基於C語言的靈活的開發環境。ADS可直接利用用戶熟悉的C編譯器,將應用程序編譯成可執行文件後在AutoCAD環境下運行,從而既利用了AutoCAD環境的強大功能,又利用了C語言的結構化編程、運行效率高的優勢。
與AutoLISP 相比,ADS優越之處在於:(1)具備錯綜復雜的大規模處理能力;(2)編譯成機器代碼後執行速度快;(3)編譯時可以檢查出程序設計語言的邏輯錯誤;(4)程序源代碼的可讀性好於AutoLISP。 而其不便之處在於:(1)C語言比LISP語言難於掌握和熟練應用;(2)ADS程序的隱藏錯誤往往導致AutoCAD,乃至操作系統的崩潰;(3)需要編譯才能運行,不易見到代碼的效果;(4)同樣功能ADS程序源代碼比AutoLISP代碼長很多。
三、第三代開發工具——Visual LISP,ARX及基於ActiveX Automation技術的VBA等
1.Visual LISP(VLISP)
VLISP是AutoLISP的換代產品。它與AutoLISP完全兼容,並提供它所有的功能,是新一代的AutoCAD LISP語言。VLISP對語言進行了擴展,可以通過Microsoft ActiveX Automation介面與對象交互。同時,通過實現反應器函數,還擴展AutoLISP響應事件的能力。作為開發工具,VLISP提供了一個完整的集成開發環境(IDE),包括編譯器、調試器和其他工具,可以提高二次開發的效率 。另外,VLISP還提供了工具用於發布獨立的應用程序。
2.ARX
ARX(AutoCAD Runtime eXtension)是AutoCAD R13之後推出的一個以C++語言為基礎的面向對象的開發環境和應用程序介面。ARX程序本質上Windows動態連接庫(DLL)程序,與AutoCAD共享地址空間,直接調用AutoCAD的核心函數,可直接訪問AutoCAD資料庫的核心數據結構和代碼,以便能夠在運行期間擴展AutoCAD固有的類及其功能,創建能夠全面享受AutoCAD固有命令特權的新命令。ARX程序與AutoCAD、Windows之間均採用Windows消息傳遞機制直接通訊。
AutoLISP、ADS、ARX都是AutoCAD提供的內嵌式編程語言。AutoLISP和ADS都是通過內部進程通訊(IPC)來和AutoCAD通訊,它們與AutoCAD是相互分離的過程,而ARX以DLL形式與AutoCAD共享地址空間,如圖2示。因此,與前兩者相比,其速度更快、運行更穩定、更簡單。由於是在Windows及VC++編程環境里運行,所以,對開發者的編程能力要求較高。
ObjectARX應用程序以C++為基本開發語言,具有面向對象編程方式的數據可封裝性、可繼承性及多態性的特點,用其開發的CAD軟體具有模塊性好、獨立性強、連接簡單、使用方便、內部功能高效實現以及代碼可重用性強等特點,並且支持MFC基本類庫,能簡潔高效地實現許多復雜功能。
這里順便提一下ADSRX。AutoCAD R14的開發環境ADSRX是ARX的一個子集,它等效於ADS。使用ADSRX,能夠用C語言編寫基於AutoCAD的程序,也能很方便地將ADS程序移植為ARX程序。
圖3比較了AutoLISP、ADS、ADSRX和ARX的關於速度、暴露性、功能和要求使用每個API的編程經驗等方面的編程介面。「暴露性」參數顯示了用戶編程錯誤的可能嚴重性。盡管ARX介面是四個API中最強有力的,它也具有產生嚴重編程錯誤的最大潛在性,如破壞AutoCAD數據結構等。其它編程環境要求較少的編程經驗,但提供的功能和范圍也較小。
可以說,AutoLISP著眼於應用程序的交互性,ADS C/C++著眼於應用程序的綜合性,而ARX則著眼於應用程序的智能性。
3.基於ActiveX Automation技術的VBA等開發工具
ActiveX Automation是一套微軟標准,以前稱為OLE Automation技術。該標准允許通過外顯的對象由一個Windows應用程序控制另一個Windows應用程序,這也是面向對象編程技術的精髓所在。AutoCAD從R14開始增加了作為ActiveX Automation伺服器應用程序的功能,使得許多面向對象編譯語言和應用程序可以通過ActiveX與AutoCAD進行通信,並操縱AutoCAD的許多功能,如圖4示。
ActiveX Automation伺服器應用程序是通過自身對象的屬性、方法、事件外顯其功能。對象是伺服器應用程序的簡單而抽象的代表。不管是用VB、VC、OFFICE VBA等從外部,還是用AutoCAD VBA從內部對AutoCAD進行二次開發,都是通過調用AutoCAD的對象體系結構來進行的。AutoCAD 2000 ActiveX Automation技術將AutoCAD 2000的各種功能封裝在AutoCAD ActiveX對象中,供編程使用。AutoCAD 2000中提供的所有對象組成一個樹形結構,如圖5示,最高層是Application對象,其它對象都是它的後代。為了得到一個特定的對象,必須從Application對象對其子孫進行遍歷,直到找到該特定的對象。
ActiveX Automation技術的完全面向對象化編程的特點,使其開發環境具備了強大的開發能力和簡單易用的優良特點,開發工具的選擇也具有很大的靈活性。所以,利用ActiveX Automation技術,是極具潛力的一種開發手段。
四、結束語
以上對AutoCAD的三代開發工具分別作了簡要介紹。從中可以看出,AutoCAD的二次開發工具真是「長江後浪推前浪,一代更比一代強」。目前,第一代的AutoLISP已能被第三代的VLISP完全替代;第二代的ADS在AutoCAD 2000中已不再支持;所以,第三代開發工具將成為今後AutoCAD二次開發的必然選擇。而在第三代工具中具體選擇哪一種,筆者認為,主要還應根據用戶應用程序的需要和開發人員的編程經驗。
按照筆者的觀點,就目前在AutoCAD 中的狀況而言:
1)Visual LISP
適於描述人機交互操作的過程,善於編寫模擬設計師思路的專業設計程序。對於各種用戶輸入的接收、錯誤識別與恢復等操作具有相當優秀的功能,尤其是善於充分發揮CAGD功能的巨大作用,充分利用交互操作的技巧。相比之下,具有最多樣式的程序運行模式。不同版本的程序,相比之下,具有最好的兼容性,甚至可以直接運行。
這種程序設計可以找到大的資源,包括書籍、程序實例、英特網上的資源和技術交流。
過去AutoLISP 最大的不足是不能編譯,較大的程序包沒有「工程(Project)」的概念,這無疑對較大規模的程序設計造成了困難。而這些現在已經被 VLISP 圓滿解決了,編譯成VLX 的老的AutoLISP 程序,其效率也會比解釋運行條件下提高5~8倍。
2)ADS
曾經是在 AutoLISP 之後的一種程序設計模式,在 R14 之前的AutoLISP 程序雖然是解釋運行,仍比ADS程序快一些,因為實際上ADS是用AutoLISP與AutoCAD交互。從AutoCAD R14起,Autodesk已經不再支持和發展 ADS程序設計模式,同時卻增加了Visual LISP,以進一步提高AutoLISP 的整體性能,同時用ObjectARX取代了ADS。
3)VBA
自 R14開始嵌套在AutoCAD 之中的程序設計方法,VBA是根據微軟公司的規則,在每一個Windows下的應用軟體都必須具有的功能。
其優點是可以很容易地使用Windows系統資源,使AutoCAD能容易地與其他Windows下的應用軟體交互。VBA 對話框設計能力比DCL好得多,多圖檔環境下的應用程序也比也比VLISP提供了更多的支持。但由於它是使用ActiveX與AutoCAD交互,程序設計比較復雜。會成為與VLISP並列的另一種專業用戶程序設計語言,不太容易學會。因為VBA並不就是VB,所以熟悉VB的人,在使用VBA作AutoCAD程序設計時,也需要新學大量的東西,只不過VBA的規則與VB充分相近。
在設計過程模擬類的程序設計中,VBA明顯不如 AutoLISP那樣順利,畢竟 AutoLISP 脫胎於人工智慧語言。另外,如果 VBA 作者因為「疏忽」,沒有提供相應的方法和屬性,老的AutoLISP能夠訪問的對象數據、能夠激活的某些AutoCAD對話框,VBA卻不能。VBA雖然不是編譯運行,數據結構和程序寫法卻像ARX一樣相當嚴格,這對於工程師來說,需要有一個適應過程,你只能按照VBA的可能去組織自己的數據,而不能像VLISP那樣按照專業設計要求去創建數據結構。
比較明顯的幾個缺憾是:
VBA中不能像VLISP那樣幾乎隨心所欲地使用AutoCAD命令,只能象腳本文件的模式,以字串方式向AutoCAD命令行發送一串響應,這個字串的內容也只好在自己的程序中生成和進行數據轉換。這樣,許多交互操作的技巧,在VBA中不能直接借用。
VBA是以對象作為數據處理的基本單元,在VLISP中堪稱特色的CAGD程序設計技術,在VBA中則無法實現。因此像Trim、Extend、Dim-Diameter之類的命令都不能真正實施,要想完成這樣的操作,相關數據只能在程序中自己計算。這樣,程序設計就不能充分利用AutoCAD的操作技巧,必然復雜和羅嗦。放著AutoCAD優秀的資料庫,卻不能充分發揮它的作用;本來能用AutoCAD完成的動作,卻要自己編程實現。這就是VBA最大的缺憾。
VBA 另外的問題是不能編譯,源程序始終以相當容易接近的方式,暴露在最終用戶面前。很容易由於用戶的誤操作,使曾經正常的應用程序出錯甚至崩潰。這正好是老的 AutoLISP 的致命缺點,使用 VLISP 的程序包編譯功能,目前還不能將 VBA 包裝進去之後解決源代碼加密的問題。VBA的源代碼加密目前只有使用 PassWord。
VBA與Visual LISP 之間僅有比較簡單的內部數據通道,例如處理簡單的點位表。從這方面說,VBA的作者好像不太了解AutoCAD的特色功能,也不太了解用戶們將會怎樣使用AutoCAD進行自己的專業設計。
擴充VBA的功能可以用 VC++ / ARX 程序,但是相當復雜,對於一般工程師來說,很難掌握。對VBA的完善和擴充,只能等待Autodesk的工作結果。
4)ObjectARX
在Autodesk內部或增值軟體開發商中使用。由於ARX是使用Visual C++作為基本程序設計語言,無論其效率、數據處理和軟硬體的控制能力都是最好的,是唯一圓滿地針對多圖檔環境的程序設計方法。是從根本上擴展 VLISP / VBA 的程序設計方法。
但是,與AutoCAD命令交互和對象資料庫訪問功能,ARX與VBA並沒有實質性的區別,就是說,同樣很難借用AutoCAD強大的CAGD功能和交互操作的技巧。另外,要想真正發揮這種開發模式的作用,對於程序設計者的要求(計算機專業知識、軟體專業知識等等)也較高,而且程序運行風險較大。要求程序自己做好各種數據的測試,自己設計好各種條件下的出錯處理和恢復,否則ARX 程序的崩潰常常會連帶 AutoCAD、甚至操作系統一起崩潰。由於ARX技術是大部分開發商的工具,因此,真正有用的編程技巧也不太容易通過一般的交流得到。可見,這種開發模式不適於在專業設計工程師中間普及。
粗略地說:
ARX/VBA的特點在於以AutoCAD的對象、方法和屬性為基本操作數據,適合於「構建」AutoCAD的功能。實際上,一個對AutoCAD的操作並不熟練的人,只要充分理解了AutoCAD的對象模型結構,也能寫出操控AutoCAD的程序。就是說,這種程序設計模式,並不太依賴於程序設計者熟悉AutoCAD操作的程度如何。換句話說:對AutoCAD操作的熟練程度,對於ARX/VBA程序設計並沒有明顯的幫助。
而VLISP則是靈活而充分地使用AutoCAD的現有功能,適合於「組合使用」AutoCAD的現有功能。這樣,程序設計著對AutoCAD操作的數量程度,就明顯地影響著程序設計的結果。就是說,這種程序設計模式,將能充分利用程序設計著使用AutoCAD的經驗和技巧。當然,用VLISP按照ARX/VBA的ActiveX模式寫程序,也是可以的。在本書中有不少這樣的實例。但是這不是VLISP的特長。
作為 CAD 系統,通常由三個層次的軟體組合而成:
1)設計軟體的底台:提供界面、環境、核心演算法、資料庫等基礎設施。現在我們是在 AutoCAD這個底台上進行工作。
2)設計支持軟體,提供與設計需要相關的,比較專業的支持軟體:國標圖庫、通用設計工具、設計手冊等等。這些軟體多數是由增值軟體開發商完成的。
3)專業設計軟體,提供窄范圍、大深度的專業設計自動化或者輔助系統:例如:發動機裝配工具設計、膠印機控制凸輪設計、組合機主軸箱設計等等。
實際上,CAD系統能否真正體現出它的存在價值,最明顯的標志就是上述專業設計軟體。這些軟體真正起到了「設計」的作用。實踐證明,在某個專業性很強的設計上,它確實能夠替代工程師!
對於1)和2),可以由一些不必很了解設計,而軟體知識較多的人來寫。當然,應當由現場工程師進行測評,防止寫成「學院派」的設計支持軟體。而對於3),就只能由設計師直接參與來寫,這樣的題目范圍較小,幾乎是開發商永遠的「盲區」。由於專業性太強,知識結構太偏,對於工科大學畢業,沒有在這個行業里,做過幾個真正的設計的人,很難聽懂專業設計師的敘述,要求他完成這個程序,就太過分了。
可見,必須有一個能夠被專業設計師所掌握,又能夠發揮他們的長處(熟悉設計和交互操作),避開他們的短處(軟體知識較少)的開發方法。這就是AutoLISP。
可以在AutoLISP程序中引用AutoCAD的幾乎所有的功能,進行圖形處理的自動化,尤其是較深層的應用~對象資料庫的操作。
在Visual LISP的協助下,從對AutoCAD進行操作的功能上討論,僅比ARX少幾個功能:自定義AutoCAD對象、多圖檔的深入管理等。從目前的情況看,AutoLISP是AutoCAD中幾乎所有的應用程序的「總管、大管家」,而且目前只有AutoLISP 表達式,才能以添加在腳本文件、對話框程序、菜單、甚至VBA程序的ThisDrawing.SendCommand …中,更可以直接用在AutoCAD的命令行中響應幾乎所有的命令。
(5)其它性能
LISP是典型的結構化程序設計語言,AutoLISP是解釋運行,源程序保密性差,巨量數據的復雜運算效率較低,文件管理功能簡單,但可以在絕大多數源程序內容不變的條件下,用Visual LISP將其編譯成VLX程序包或者FAS程序,這樣處理之後的AutoLISP程序,將具有與ARX程序相同的高保密性能,也將具有比解釋運行明顯提高的運行效率。而且,AutoLISP程序設計的復雜程度和運行風險大大低與ARX,絕少在程序崩潰後連帶AutoCAD崩潰。來源: http://www.jxcad.com.cn/read-htm-tid-92949.html
㈤ 用c語言可以編成一個手機的rom(在安卓的基礎上,深度開發的手機系統)嗎
我是這樣理解的。首先Android所謂的rom是說支持手機運行的系統軟體環境。包括如bootloader,kernel,system等。
這裡面很大程度是c開發的,比如內核kernel,system裡面的部分模塊。但是還有一些系統軟體apk,框架層由Java開發。
理論上,用c肯定是能開發一個手機rom的。但是如果要在Android上,看你需要從哪裡切入。如果你就只想改一下系統軟體或者改改框架層,用Java就可以。也可以與c結合開發。具體的可以看看Java應用開發。然後把應用放到rom包裡面
而如果要深度定製一些服務,或者添加一些內核模塊,就得再好好研究一下Android系統源碼。具體選定在那一層進行修改。
㈥ windows下怎樣運行dos編輯C程序
Windows下是無法運行DOS的,這是兩個不同的操作系統(DOS下可以運行早期的Windows,那時Windows還只是一個DOS程序)。
可以在Windows的命令行程序中運行部分DOS程序,Ctrl+R,在彈出窗口中輸入cmd即可啟動命令行程序。
Windows不帶C語言編譯器,需要另外安裝,可用Turbo C、Dev-C++,也可以用mingw、cygwin等環境(如masm、nasm、tasm等是匯編器,不能編譯C語言)。
如果真的想直接編輯C程序,可以用UltraEdit等16位編輯器;只是想編輯C源代碼,可以隨便找一個純文本編輯器(UltraEdit、notepad等,但Word不行)。