中介管理系統源碼
A. 求c語言房屋中介系統源代碼
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
#define ESC 27
#define NULL0
#define LEN sizeof(struct applicant)
#define LENB sizeof(struct job)
#define L sizeof(info1)
#define LB sizeof(info2)
int n,k;
char filename1[10];
char filename2[10];
struct applicant
{
long anum;
char aname[10];
char id[18];
char cert[20];
char rqurjob[20];
struct applicant * next1;
}applcnt[60],info1;
struct job
{
long jnum;
char jname[20];
int need;
struct job * next2;
}jb[100],info2;
/*------------color--------------*/
color()
{
int x1=20,y1=5,x2=60,y2=40,i;
clrscr();
textmode(3);
textbackground(2);
window(x1,y1,x2,y2);
for(i=1;i <=21;i++)
{
gotoxy(1,i);cprintf( " ");}
}
/*-------------menu-----------*/
menu()
{
char c;
color(); textcolor(19); gotoxy(17,3);cprintf( "MENU "); textcolor(4);
gotoxy(9,5);cprintf( "1 --input applicant record ");
gotoxy(9,6);cprintf( "2 --output applicant record ");
gotoxy(9,7);cprintf( "3 --delete applicant record ");
gotoxy(9,8);cprintf( "4 --insert applicant record ");
gotoxy(9,9);cprintf( "5 --search applicant record ");
gotoxy(9,10);cprintf( "6 --open applicant record ");
gotoxy(9,11);cprintf( "7 --input job record ");
gotoxy(9,12);cprintf( "8 --output job record ");
gotoxy(9,13);cprintf( "9 --delete job record ");
gotoxy(9,14);cprintf( "10 --search jobe record ");
gotoxy(9,17);cprintf( "0 --exit ");
gotoxy(15,20);cprintf( "Please Select: ");
c=getch();
if(ESC==c)exit(0);
return(c);
}
/*---------------create applicant information---------------*/
struct applicant * create1(void)
{
struct applicant * p1, * p2; struct applicant * head1;
struct applicant * load1(void);
struct applicant * arrange1(struct applicant * head1);
char c;
color();
n=0;
p1=p2=(struct applicant * )malloc(LEN);
textcolor(14);
gotoxy(7,3);cprintf( "Please Enter Record: ");
textcolor(1);
gotoxy(5,5);cprintf( "Enter Num: "); scanf( "%1d ",&p1-> anum);
if(p1-> anum==0){head1=NULL;goto end;}
gotoxy(5,7);cprintf( "Enter Name: "); scanf( "%s ",p1-> aname);
gotoxy(5,9);cprintf( "Enter Your ID Number: "); scanf( "%s ",p1-> id);
gotoxy(5,11);cprintf( "Enter Your Certification: "); scanf( "%s ",p1-> cert);
gotoxy(5,13);cprintf( "Enter Your Ideal Job: "); scanf( "%s ",p1-> rqurjob);
head1=NULL;
while(p1-> anum!=0)
{
n=n+1;
if(n==1)head1=p1;
else p2-> next1=p1;
p2=p1;
p1=(struct applicant *)malloc(LEN);
color();
textcolor(14);
gotoxy(6,3);cprintf( "Please Enter Record: ");
textcolor(1);
gotoxy(5,5);cprintf( "Enter Num: "); scanf( "%1d ",&p1-> anum);
if(p1-> anum==0) goto end;
gotoxy(5,7);cprintf( "Enter Name: "); scanf( "%s ",p1-> aname);
gotoxy(5,9);cprintf( "Enter Your ID number: "); scanf( "%s ",p1-> id);
gotoxy(5,11);cprintf( "Enter Your Certification: "); scanf( "%s ",p1-> cert);
gotoxy(5,13);cprintf( "Enter Your Ideal Job: "); scanf( "%s ",p1-> rqurjob);
}
end:p2-> next1=NULL;
head1=arrange1(head1);
gotoxy(5,16);cprintf( "Save(Y.or,N)? ");
c=getch();
if(c== 'Y '||c== 'y ')save1(head1);
else head1=load1();
return(head1);
}
/*---------------------create job information----------------------*/
struct job *create2(void)
{
struct job * p3, * p4; struct job * head2;
struct job *load2(void);
struct job *arrange2(struct job * head2);
char d;
color();
k=0;
p3=p4=(struct job *)malloc(LENB);
textcolor(14);
gotoxy(7,3);cprintf( "Please Enter Record: ");
textcolor(1);
gotoxy(5,5);cprintf( "Enter Job Number: "); scanf( "%1d ",&p3-> jnum);
if(p3-> jnum==0){head2=NULL;goto end;}
gotoxy(5,7);cprintf( "Enter Job Name: "); scanf( "%s ",p3-> jname);
gotoxy(5,9);cprintf( "Enter The Amount Of The Job Needs: "); scanf( "%i ",p3-> need);
head2=NULL;
while(p3-> jnum!=0)
{
k=k+1;
if(k==1)head2=p3;
else p4-> next2=p3;
p4=p3;
p3=(struct job * )malloc(LENB);
color();
textcolor(14);
gotoxy(7,3);cprintf( "Please Enter Record: ");
textcolor(1);
gotoxy(5,5);cprintf( "Enter Job Number: "); scanf( "%1d ",&p3-> jnum);
if(p3-> jnum==0) goto end;
gotoxy(5,7);cprintf( "Enter Job Name: "); scanf( "%s ",p3-> jname);
gotoxy(5,9);cprintf( "Enter The Amount Of The Job Needs: "); scanf( "%i ",p3-> need);
}
end:p4-> next2=NULL;
head2=arrange2(head2);
gotoxy(5,12);cprintf( "Save(Y.Or,N)? ");
d=getch();
if(d== 'Y '||d== 'y ')save2(head2);
else head2=load2();
return(head2);
}
/*--------------print applicant information----------------*/
void print1(struct applicant * head1)
{
struct applicant * p5;int i=0;
color();textcolor(14);
p5=head1; textcolor(4);
if(head1-> anum==0)
{ gotoxy(4,4);cprintf( "NO info. of applicant! "); }
else
{
gotoxy(2,2);cprintf( "Number of Records:%d ",n);
textcolor(0);
gotoxy(5,4);cprintf( "Num Name ID Certification Required job ");
if(head1!=NULL)textcolor(1);
do{
gotoxy(5,5+i);cprintf( "%1d ",p5-> anum);
gotoxy(18,5+i);cprintf( "%s ",p5-> aname);
gotoxy(32,5+i);cprintf( "%s ",p5-> id);
gotoxy(50,5+i);cprintf( "%s ",p5-> cert);
gotoxy(75,5+i);cprintf( "%s ",p5-> rqurjob);
i++;
p5=p5-> next1;
}while(p5!=NULL);
}
textcolor(14);
gotoxy(15,20);cprintf( "Any Key Back! ");
getch();
}
/*--------------print job information----------------*/
void print2(struct job * head2)
{
struct job * p7;int k=0;
color();textcolor(14);
p7=head2; textcolor(4);
if(head2-> jnum==0)
{ gotoxy(4,4);cprintf( "NO info. of student! "); }
else
{
gotoxy(2,2);cprintf( "Number of Records:%d ",k);
textcolor(0);
gotoxy(5,4);cprintf( "Job Number Job name Amount of Person in need ");
if(head2!=NULL)textcolor(1);
do{
gotoxy(5,5+k);cprintf( "%1d ",p7-> jnum);
gotoxy(18,5+k);cprintf( "%s ",p7-> jname);
gotoxy(43,5+k);cprintf( "%i ",p7-> need);
k++;
p7=p7-> next2;
}while(p7!=NULL);
}
textcolor(14);
gotoxy(15,20);cprintf( "Any Key Back! ");
getch();
}
/*----------delelte applicant-----------*/
struct applicant *del1(struct applicant * head1)
{
struct applicant * p1, * p2;long anum;char c;
color();textcolor(14);
gotoxy(7,3);cprintf( "Eneter Delete Applicant Number: ");
scanf( "%1d ",&anum);
textcolor(128+4);
if(head1==NULL) {gotoxy(12,7);printf( "List Null!) ");goto end; }
p1=head1;
while(anum!=p1-> anum&&p1-> next1!=NULL)
{ p2=p1;p1=p1-> next1;}
if(anum==p1-> anum)
{
if(p1==head1)head1=p1-> next1;
else p2-> next1=p1-> next1;
gotoxy(11,7);
cprintf( "%1d Has Been Deleted! ",anum);
n=n-1;
textcolor(14);
gotoxy(5,12);cprintf( "Save(Y.orN)? ");
c=getch();
if(c== 'Y '|| c== 'y ')save1(head1);
}
else
{
textcolor(128+4);gotoxy(11,7);
cprintf( "%1d Not Been Found! ",anum);
end:textcolor(14);
gotoxy(15,14);cprintf( "Any Key Back! ");getch();
}
}
/*---------------delete job-----------*/
struct job *del2(struct job * head2)
{
struct job * p3, * p4;long jnum;char d;
color();textcolor(14);
gotoxy(7,3);cprintf( "Eneter Delete job Number: ");
scanf( "%1d ",&jnum);
textcolor(128+4);
if(head2==NULL) {gotoxy(12,7);printf( "List Null!) ");goto end; }
p3=head2;
while(jnum!=p3-> jnum&&p3-> next2!=NULL)
{ p4=p3;p3=p3-> next2;}
if(jnum==p3-> jnum)
{
if(p3==head2)head2=p3-> next2;
else p4-> next2=p3-> next2;
gotoxy(11,7);
cprintf( "%1d Has Been Deleted! ",jnum);
k=k-1;
textcolor(14);
gotoxy(5,12);cprintf( "Save(Y.orN)? ");
d=getch();
if(d== 'Y '|| d== 'y ')save2(head2);
}
else
{
textcolor(128+4);gotoxy(11,7);
cprintf( "%1d Not Been Found! ",jnum);
end:textcolor(14);
gotoxy(15,14);cprintf( "Any Key Back! ");getch();
}
}
/*---------------------arrange applicant--------*/
struct applicant *arrange1(struct applicant *head1)
{
int i,j;struct applicant * p5;
p5=head1;
for(i=0;i <n;i++) {applcnt[i]= * p5;p5=p5-> next1;}
for(j=1;j <n-1;j++)
{
for(i=1;i <=n-j;i++)
if(applcnt[i-1].anum> applcnt[i].anum)
{info1=applcnt[i-1];applcnt[i-1]=applcnt[i];applcnt[i]=info1; }
}
p5=&applcnt[0];
for(i=1;i <n;i++)
{ p5-> next1=&applcnt[i];p5=p5-> next1;}
p5-> next1=NULL;head1=&applcnt[0];
return(head1);
}
/*-----------------arrange job-------------------*/
struct job *arrange2(struct job *head2)
{
int r,f;struct job * p7;
p7=head2;
for(r=0;r <k;r++) {jb[r]= * p7;p7=p7-> next2;}
for(f=1;f <k-1;f++)
{
for(r=1;r <=k-f;r++)
if(jb[r-1].jnum> jb[r].jnum)
{info2=jb[r-1];jb[r-1]=jb[r];jb[r]=info2; }
}
p7=&jb[0];
for(r=1;r <k;r++)
{ p7-> next2=&jb[r];p7=p7-> next2;}
p7-> next2=NULL;head2=&jb[0];
return(head2);
}
/*--------------------insert applicant-----------------*/
struct applicant *insert1(struct applicant *head1)
{
struct applicant * p0, * p1, * p2, * applcnt;char c;
color();
applcnt=(struct applicant * )malloc(LEN);
textcolor(14);
gotoxy(7,3);cprintf( "Please Enter Record: ");
textcolor(1);
gotoxy(5,5);cprintf( "Enter Num: "); scanf( "%1d ",&applcnt-> anum);
gotoxy(5,7);cprintf( "Enter Name: "); scanf( "%s ",applcnt-> aname);
gotoxy(5,9);cprintf( "Enter Your ID Number: "); scanf( "%s ",applcnt-> id);
gotoxy(5,11);cprintf( "Enter Your Certification: "); scanf( "%s ",applcnt-> cert);
gotoxy(5,13);cprintf( "Enter Your Ideal Job: "); scanf( "%s ",applcnt-> rqurjob);
p1=head1; p0=applcnt;
if(head1=NULL)
{ head1=p0;p0-> next1=NULL;}
else
while((p0-> anum> p1-> anum)&&(p1-> next1!=NULL))
{ p2=p1; p1=p1-> next1;}
if(p0-> anum <=p1-> anum)
{
if(head1==p1)head1=p0;
else p2-> next1=p0; p0-> next1=p1;
}
else {p1-> next1=p0;p0-> next1=NULL;}
n=n+1;
textcolor(14);
gotoxy(5,16);cprintf( "Save(Y.or,N)? ");
c=getch();
if(c== 'Y '||c== 'y ')save1(head1);
head1=load1();
return(head1);
}
/*------------------insert job----------------------*/
struct job *insert2(struct job * head2)
{
struct job * q0, * p3, * p4, * jb;char d;
color();
jb=(struct job *)malloc(LENB);
textcolor(14);
gotoxy(7,3);cprintf( "Please Enter Job Num: ");
textcolor(1);
gotoxy(5,5);cprintf( "Enter Job Number: "); scanf( "%1d ",&jb-> jnum);
gotoxy(5,7);cprintf( "Enter Job Name: "); scanf( "%s ",jb-> jname);
gotoxy(5,9);cprintf( "Enter The Amount Of The Job Needs: "); scanf( "%i ",jb-> need);
p3=head2; q0=jb;
if(head2==NULL)
{ head2=q0;q0-> next2=NULL;}
else
while((q0-> jnum> p3-> jnum)&&(p3-> next2!=NULL))
{ p4=p3; p3=p3-> next2;}
if(q0-> jnum <=p3-> jnum)
{
if(head2==p3)head2=q0;
else p4-> next2=q0; q0-> next2=p3;
}
else { p3-> next2=q0;q0-> next2=NULL;}
k=k+1;
textcolor(14);
gotoxy(5,12);cprintf( "Save(Y.or,N)? ");
d=getch();
if(d== 'Y '||d== 'y ')save2(head2);
head2=load2();
return(head2);
}
/*----------------------load applicant------------------------*/
struct applicant *load1(void)
{
struct applicant *p1, * p2, * head1;
FILE * fp;
color();textcolor(14);
gotoxy(3,5);cprintf( "Please Enter Loaded Applicant File Name: ");
scanf( "%s ",filename1);
fp=fopen( "filename1.dat ", "r ");
fscanf(fp, "%s ",filename1);
fclose(fp);
if((fp=fopen(filename1, "rb "))==NULL)
{
textcolor(128+4);gotoxy(3,4);
cprintf( "Info1. been not found from %s ! ",filename1);
goto end;
}
p2=p1=(struct applicant * )malloc(LEN);
n=0;
while(! feof(fp))
{
n=n+1;if(n==1)head1=p1;
fread(p1,LEN,1,fp);
p2=p1;
p1=(struct applicant * )malloc(LEN);
p2-> next1=p1;
}
fclose(fp);
n=n-1;
p2-> next1=NULL;
for(p1=head1;p1-> next1-> next1!=NULL;p1=p1-> next1);
p1-> next1=NULL;
clrscr(); textcolor(128+4);
gotoxy(3,5);cprintf( "Info1 Has Been Loaded from %s! ",filename1);
end:textcolor(14);
gotoxy(15,14);cprintf( "Any Key Back! ");
getch();
return(head1);
}
/*--------------load job-------------------*/
struct job *load2(void)
{
struct job * p3, * p4, * head2;
FILE *fp;
color();textcolor(14);
gotoxy(3,5);cprintf( "Please Enter Loaded Job File Name: ");
scanf( "%s ",filename2);
fp=fopen( "filename2.dat ", "r ");
fscanf(fp, "%s ",filename2);
fclose(fp);
if((fp=fopen(filename2, "rb "))==NULL)
{
textcolor(128+4);gotoxy(3,4);
cprintf( "Info2. been not found from %s ! ",filename2);
goto end;
}
p4=p3=(struct job * )malloc(LENB);
k=0;
while(! feof(fp))
{
k=k+1;if(k==1)head2=p3;
fread(p3,LENB,1,fp);
p4=p3;
p3=(struct job * )malloc(LENB);
p4-> next2=p3;
}
fclose(fp);
k=k-1;
p4-> next2=NULL;
for(p3=head2;p3-> next2-> next2!=NULL;p3=p3-> next2);
p3-> next2=NULL;
clrscr(); textcolor(128+4);
gotoxy(3,5);cprintf( "Info2 Has Been Loaded From %s! ",filename2);
end:textcolor(14);
gotoxy(15,14);cprintf( "Any Key Back! ");
getch();
return(head2);
}
/*---------------------save applicant------------------------*/
save1(struct applicant * head1)
{
FILE * fp; struct applicant * p5;
color();textcolor(14);
p5=head1;
gotoxy(3,5);cprintf( "Please Enter Saved Applicant File Name: ");
scanf( "%s ",filename1);
fp=fopen( "filename1.dat ", "w ");
fprintf(fp, "%s ",filename1);
fclose(fp);
fp=fopen(filename1, "wb ");
while(p5=NULL){ fwrite(p5,LEN,1,fp);p5=p5-> next1;}
fclose(fp);
textcolor(128+4);clrscr();
gotoxy(2,3);
cprintf( "%d Applicant Record Has Been Saved To %s ! ",n,filename1);
textcolor(14);
gotoxy(15,14);cprintf( "Any Key Back! ");getch();
}
/*------------------save job------------------------*/
save2(struct job * head2)
{
FILE * fp; struct job * p7;
color();textcolor(14);
p7=head2;
gotoxy(3,5);cprintf( "Pleas Enter Saved Job File Name: ");
scanf( "%s ",filename2);
fp=fopen( "filename2.dat ", "w ");
fprintf(fp, "%s ",filename2);
fclose(fp);
fp=fopen(filename2, "wb ");
while(p7=NULL){ fwrite(p7,LENB,1,fp);p7=p7-> next2;}
fclose(fp);
textcolor(128+4);clrscr();
gotoxy(2,3);
cprintf( "%d Job Record Has Been Saved To %s ! ",k,filename2);
textcolor(14);
gotoxy(15,14);cprintf( "Any Key Back! ");getch();
}
/*------------------------main-------------------------*/
main()
{
char m,c;
struct applicant * head1;
struct job * head2;
textmode(7);textmode(3); textbackground(11);
color();textcolor(14);
gotoxy(12,5);cprintf( "Welcome To Use ");
textcolor(14);
gotoxy(7,7);cprintf( "Intermediary Information Management System ");
gotoxy(12,9);cprintf( "Written By Aaron Harvey ");
textcolor(128+11); gotoxy(2,14);
cprintf( " Any Key Continue! ESC to exit ");
c=getch();
if(ESC==c)exit(0);
menu:
m=menu();
switch(m)
{
case '1 ':head1=create1(); break;
case '2 ':print1(head1); break;
case '3 ':head1=del1(head1); break;
case '4 ':head1=insert1(head1); break;
case '5 ':head1=load1(); break;
case '6 ':head2=create2(); break;
case '7 ':print2(head2); break;
case '8 ':head2=del2(head2); break;
case '9 ':head2=insert2(head2); break;
case '10 ':head2=load2(); break;
case '0 ':textmode(11); exit(0);
}
goto menu;
}
B. 什麼叫中間語言
中間語言MSIT
在.Net框架中,公共語言基礎結構使用公共語言規范來綁定不同的語言。通過要求不同的語言至少要實現公共類型系統(CTS)包含在公共語言規范中的部分,公共語言基礎結構允許不同的語言使用.Net框架。因此在.Net框架中,所有的語言(C#,VB.Net,Effil.Net等)最後都被轉換為了一種通用語言:微軟中間語言(MSIL)。
MSIL是將.Net代碼轉化為機器語言的一個中間過程。它是一種介於高級語言和基於Intel的匯編語言的偽匯編語言。當用戶編譯一個.Net程序時,編譯器將源代碼翻譯成一組可以有效地轉換為本機代碼且獨立於CPU 的指令。當執行這些指令時,實時(JIT)編譯器將它們轉化為CPU特定的代碼。由於公共語言運行庫支持多種實時編譯器,因此同一段MSIL代碼可以被不同的編譯器實時編譯並運行在不同的結構上。從理論上來說,MSIL將消除多年以來業界中不同語言之間的紛爭。在.Net的世界中可能出現下面的情況:一部分代碼可以用Effil實現,另一部分代碼使用C#或VB完成的,但是最後這些代碼都將被轉換為中間語言。這給程序員提供了極大的靈活性,程序員可以選擇自己熟悉的語言,並且再也不用為學習不斷推出的新語言而煩惱了。
解密微軟中間語言的系列文章將通過一些簡單易懂的方式來揭示中間語言的復雜原理。這些原理通過詳細的例子來闡述。在一些例子中同時給出了源代碼和中間代碼,通過比較源代碼和中間代碼,我們可以更好地理解編譯器的局限性,指導我們編寫出更好更快的代碼。
微軟中間語言概述 1.用中間語言編寫的一個簡單程序
讓我們從經典的Hello World例子開始。首先在一個文本編輯器中輸入以下的代碼,並保存為HelloWorld.il:
.assembly HelloWorldIL {}
.method static void HelloWorld() {
.entrypoint
ldstr "Hello World."
call void [mscorlib]System.Console::WriteLine(class System.String)
ret
}
在一個中間語言程序中,如果某一行以「.」開始,則代表這是一個傳輸給匯編工具的指令,該指令要求匯編工具執行某些操作,例如生成一個函數或類。而沒有以「.」開始的行是中間語言的代碼。在中間語言中方法通過匯編命令method來定義,匯編命令後跟方法的返回值、名稱和參數。方法體被包含在{}中。例子中的ret代表該方法的結束。
一個中間語言文件可以包含很多函數,匯編工具沒有辦法分辨應該首先執行哪一個方法。在諸如C#或VB這一類高級語言中,程序的入口方法通常都有特定的名稱,例如在C#中的public static void Main()。這就是上面的匯編工具發出錯誤提示的原因。在中間語言中,第一個被執行的方法被稱為入口函數(EntryPoint Function)。為了告訴匯編工具HelloWorld是入口函數,我們需要在代碼中增加一條匯編命令entrypoint,該命令可以放在方法體中的任何位置。需要注意的是在一個程序集中只能有一個入口函數。
中間語言代碼通常被編譯成一個模塊,該模塊隸屬於一個程序集。在.Net中模塊和程序集的概念非常重要,因此開發人員需要很清楚地了解它們。在後面的文章中我們將詳細討論.Net程序的結構。通過在代碼中加入assembly命令,可以告訴匯編工具中間代碼隸屬於那個程序集。assembly命令的格式如下:
.assembly <程序集名稱> {}
需要注意在method命令後加入了static關鍵字,這是因為每個入口函數必須是靜態的,例如在C#中我們將Main方法定義為public static void Main()。
接下來我們需要調用WriteLine方法將HelloWorld字元串輸出到屏幕。通過使用call指令(Instruction)我們可以達到這個目的。指令的格式如下:
call <return type> <namespace>.<class name>::<method name>
這里我們可以看到當調用一個方法時,中間語言和其他的編程語言有很大的區別。在中間語言中,如果需要調用一個方法,需要指定方法的全名,包括他的名稱域(namespace)、類名、返回值類型和參數的數據類型。這樣就保證了匯編工具能夠找到正確的方法。
在調用WriteLine方法時需要一個字元串參數。所有傳遞給方法或函數的參數都被保存在內存的堆棧中。在中間語言中有一個指令ldstr可以從堆棧中載入一個字元串。(堆棧是內存中的一塊區域,它被用於將參數傳輸給方法,在後面我們會詳細討論堆棧的問題)。所有的方法都從堆棧中獲取它們的參數,因此ldstr指令是必不可少的。ldstr指令的格式如下所示:
ldstr <parameter string>
我們可以用ILAsm.exe來編譯這個程序。在運行ILAsm.exe之前,首先需要確認一下該程序已經包含在了Windows操作系統的Path環境變數中。ILAsm.exe 可在下面的路徑中找到:
%windir%\Microsoft.NET\Framework\v1.0.xxxx
其中xxxx是正在使用的.NET框架的內部版本號。例如我使用的版本號是3705,則應該如下設置Path環境變數:
Set Path = %Path%;c:\Windows\Microsoft.NET\Framework\v1.0.3705
然後運行cmd.exe(開始->運行->輸入cmd->按下確認鍵)。在彈出的命令窗口中輸入:
J:\Testcode>ilasm HelloWorld.il
匯編代碼後運行程序就可以看到Hello World.的輸出。
通過上面的例子,我們了解了中間語言的程序結構,一些命令和指令。同時需要提醒大家的是中間語言是區分大小寫的。
2.改進的HelloWorld例子
在.Net中的所有語言都是面向對象的語言,但是上面的HelloWorld例子是一個結構化的例子。下面讓我們來看一下如何將它轉化為面向對象的代碼。在面向對象的編程中,我們將操作定義在類中。為了將上面的HelloWorld例子轉化為面向對象的代碼,可以使用class命令:
.class HelloWorld { }
class命令後緊跟的是類的名稱。類的名稱在中間語言中是可選的。同時我們還需要為該指令添加一些屬性,例如存取控制類在內存中的布局和互用性等。這樣代碼就變成了:
.assembly HelloWorldIL {}
.class public auto ansi HelloWorld extends [mscorlib]System.Object {
.method public hidebysig static void HelloWorld() cil managed {
.entrypoint
ldstr "Hello World."
call void [mscorlib]System.Console::WriteLine(class System.String)
ret
}
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed {
ldarg.0
call instance void [mscorlib]System.Object::.ctor()
ret
}
}
在代碼中用到了三個屬性:
· public:public是訪問控制屬性,它表明了對於訪問該類的成員沒有限制。
· auto:auto屬性表明了當類被載入到內存中時,在內存中的布局是由公共運行庫而不是程序決定的。
· ansi:指定ansi屬性是為了在沒有被管理和被管理的代碼之間實現無縫的轉化。在.Net中,那些不可直接應用在公共語言基礎設施之上的代碼被稱為沒有被管理的代碼,例如C、C++和VB6的代碼。我們需要一個屬性來處理被管理的代碼和沒有被管理的代碼之間的互用性。在被管理的代碼中,字元串用雙位元組的Unicode字元表示,而在被管理的代碼中,字元串有可能用單位元組的ANSI字元表示。指定了ansi屬性就可以在不同的代碼間轉化字元串了。
我們知道在.Net框架中,所有的類都直接或間接地繼承了System.Object類。在代碼中我們明確指定了HelloWorld繼承了System.Object。
在HelloWorld方法中加入了public、hidebysig、cil managed屬性,下面是對這些屬性的解釋:
· public:在C#或VB.Net中,當我們定義一個方法時,需要指定方法的訪問修飾符。訪問修飾符可以是public、protected、internal或private 。
· hidebysig:一個類可以繼承其他的類,hidebysig屬性保證當前類中的方法在作為父類時不會被子類繼承。例如如果HelloWorldChild類繼承了HelloWorld類,在HelloWorldChild中不會看到HelloWorld方法。
· cil managed:該屬性將在後面討論。
在高級語言中(C#,VB.Net等),每個類必須有構造函數,而且構造函數的第一行需要調用基類的構造函數。如果類中沒有構造函數,基類的構造函數將被自動調用。通常這是由編譯器自動完成的,現在我們要在的代碼中加入構造函數,該構造函數通過.ctor命令調用基類的構造函數。
小結
本文我們從經典的Hello World例子開始,通過實例了解了微軟中間語言的基本語法規則以及中間語言與其他開發語言的關系。在下一篇文章中,我們將在此基礎上,運用實常式序講述.net應用程序的格式和結構等內容。
C. 關於也房產中介ASP源代碼的問題
很簡單,是資料庫沒有客戶訪問許可權。如果你現在是在調試:【控制目標】-【管理工具】-【Internet 信息服務】-..-..-【默認網站】右擊:【屬性】-【目錄安全性】-《匿名訪問和身份驗證控制》點擊【編輯】,選擇出(伺服器名)\IUSR_(伺服器名)【確定】即可。注意:IUSR是匿名訪問
D. 想買套房產中介網站源碼,本人不太懂這行,提高懸賞求助
本人做了個二手房網站源碼,用的是08CMS的房產源碼,用得不錯,功能很強大,最主要可根據自已愛好改改版什麼的,方便二次開發。08CMS房產源碼是採用PHP+MYSQL開發的,最近聽他們客服說08CMS房產源碼升級到V2.0功能上面肯定會更完善。
E. Android開發需要哪些技術
安卓開發需要學:
一、應用程序
Android以Java為編程語言,使介面到功能,都有層出不窮的變化,其中Activity等同於J2ME的MIDlet,一個Activity類負責創建視窗,一個活動中的Activity就是在foreground(前景)模式,背景運行的程序叫做Service。
二、中介軟體
操作系好亂絕統與應用程序的溝通橋梁,並用分為兩層:函數層(Library)和虛擬機(VirtualMachine)。Bionic是Android改良libc的版本。
Android同時包含了Webkit,所謂的Webkit就是AppleSafari瀏覽器背後的引擎。Surfaceflinger是就2D或3D的內容顯示到屏幕上。Android使用工具鏈(Toolchain)為Google自製的BionicLibc。
三、硬體抽像層
Android的HAL(硬體抽像層)是能以封閉源碼形式提供硬體驅動模塊。HAL
的目的是為了把Androidframework與Linuxkernel隔開。
讓Android不至過度依賴Linux
kernel,以達成友姿kernelindependent的概念,也讓Androidframework
的開發能在不考量驅動程序實現的前提下進行發展。
四、編程語言
Android是運行於Linuxkernel之上,但並不是陪吵GNU/Linux。因為在一般GNU/Linux里支持的功能,Android大都沒有支持。
包括Cairo、X11、Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。Android又以bionic取代Glibc、以Skia取代Cairo、再以opencore取代FFmpeg等等。
五、安全控制
目前Android的Linuxkernel控制包括安全(Security),存儲器管理(MemoryManagemeat),程序管理(ProcessManagement),網路堆棧(NetworkStack),驅動程序模型等。
下載Android源碼之前,先要安裝其構建工具Repo來初始化源碼。Repo是Android用來輔助Git工作的一個工具。
F. 做一個商城式的小程序,大概需要多少錢
開發一個商城式小程序價格幾把到幾萬不等,隨著線上的快速發展,微信小程序能力的升級,使小程序也存在多種類型,例如電商類、資訊類、預約類等等,每一個類型的小程序需要的功能是不一樣的,例如電商類需要購物車、下單、付款、物流查詢功能,預約類的小程序,需要展示、預定等功能。所以,功能也是影響價格的因素之一。另外還要看是什麼開發方式:
1、小程序定製開發
小程序定製開發,就是根據你提出來的功能要求,專門定製出來的,具有個性化、唯一性的特點,而且源碼也會掌握在自己手裡。
但是費用高,因為小程序系統所有的功能都是需要定製開發的,從零開發的,一般費用非常昂貴。畢竟技術人員工資大多是1萬起步,一個小程序最起碼有前端、後端、UI設計人員才能開發完成的小程序,假如耗時一個月的話,光工資就要四五萬。再加上租伺服器一年3000-4000的費用,整體算下來,一個月左右的小程序定製開發費用要在5萬左右,如果你的要求更復雜,十幾萬的費用也是存在的。
2、小程序模板開發
模板開發就是直接套用行業模板來進行開發的,由於是直接套用模板,因此開發工作並不復雜,所以價格上會便宜一點,一般都在千元左右,當然具體的價格得根據所處的行業來確定。
凡科輕站小程序,自定義設置,更加貼合不同業務場景預約時間精準到天或小時,設置靈活,合理配置預約時間,資源價值最大化。
400+精美小程序模板,點擊這里馬上獲取:凡科輕站小程序
G. 從c語言到fpga高手,我是怎麼煉成的
這些日子我一直在寫一個實時操作系統內核,已有小成了,等寫完我會全部公開,希望能夠為 國內IT的發展盡自己一份微薄的力量。最近看到很多學生朋友和我當年一樣沒有方向 ,所以把我的經歷寫出來與大家共勉,希望能給剛入行的朋友們一點點幫助。一轉眼我在IT行業學習工作已經七年多了,這期間我做過網頁,寫過MIS、數據 庫,應用程序,做過通信軟體、硬體驅動、協議棧,到現在做操作系統內核和 IC相關開發,這中間走了很多彎路,也吃了不少苦。
我上的是一個三流的高校,就連同一個城市的人多數都不知道。因為學校不好也就沒有指望能靠學校名氣找一個好工作。所有的希望都寄託在自己的努力上了, 大一開學前的假期我就開始了學習,記得我買的第一本書是《計算機基礎DOS3.0》,大家別嚇著了,其實當時已經普及了DOS6.22了,只是我在書店裡 看到了DOS4.0,5.0,6.0的書,以為像英語那樣是第四、五、六冊,記得當時到處找DOS1.0,現在想想也幸好我沒有找到:)開學前我學完了 PASCAL,那時既沒有計算機也沒有人可以請教,我連程序是什麼的概念都沒有,只好死記硬背代碼,然後拿紙寫,我一直到大三才有了一台486,在這之前 用紙寫了多少程序我也記不清楚了,只知道最長的一個我拿A4大小的草稿紙寫了30 多頁,我的C語言、C++ 、VC都是在這樣的條件下入門的。所以說條件是可以克服的,希望我的經歷多少給條件艱苦的同學們一點信心。第一次上機是在我姐夫的機房,我的心情激動的無 與倫比,但是一上機我立刻傻了眼,他們用的是英文版的Win3.1,我的那點DOS知識都見了鬼,上機提心吊膽的一陣瞎摸,一不小心把Word弄成了全 屏,怎麼都還不了原,當時真是心急如焚,我以為機器被我弄壞了。第一個C語言程序,就是那個經典的HelloWorld,我調了幾個星期,上機機會非常 少,也沒有書告訴我開發環境(TC2.0)需要設置,而且開始我都不知道有編譯器,我甚至自作聰明把寫好的程序擴展名從.c改成.exe,結果可想而知。 大一學完了C、X86的匯編、數據結構、C++。由於精力都花在自學上了,大一下四門課掛了彩,三類學校就是這點好,掛上一二十門也照樣畢業。不過扯遠點 說,我那麼刻苦都及不了格,可見我們國家的計算機教育有多死板。
大二准備學VC和BC,當時難以取捨,後來選了VC,不為別的,只為書店裡兩本書,VC 那本便宜6塊錢。我的努力在班上無人能及,學的日夜不分,大三有了計算機後更是如此,很多次父親半夜教訓我說我不要命了,我一直覺得自己基礎差,記憶又不 行,條件也不好,所以覺得只有多花點時間才能趕上別人。居然後來有許多朋友說我有學計算機的天賦,讓我哭笑不得。我用的是486,16M內存,1G硬碟, 當時同學們的配置都是P166MMX,我安裝 一個Windows NT4.0需要一個通宵,編譯一個BC5.0向導生成的程序需要近兩個小時,我的顯示器是個二手的,輻射非常大,開機屏幕冒火花,看起來很酷的:),有一 次程序寫的太久,覺得怎麼白色的編輯器背景變成了紫色,以為顯示器壞了,後來才發現眼睛不行了,不過說來也奇怪,到今天我的視力還能保持1.5,真是個奇 跡。但是就是那台破機器陪伴了我兩年,讓我學會了VC、Delphi、SQLServer等。後來那台機器給我阿姨打字用,據她說一天她正打的開心,一股 青煙夾著火苗從顯示器鑽出來,之後它才壽終正寢。
大三假期找了個機會在一個計算機研究所實習,與其說實習不如說是做義工,工作了兩個月一分錢沒有拿。但是這兩個月對我的發展幫助很大,讓我早一步了解 了社會,剛去的時候我當然是一竅不通,在那裡我熟悉了網路,學會了Delphi和Oracle。由於工作很認真,得到了比較好的評價,在一位長者的引薦 下,我開始和他們一起做項目,這使我在大三大四就有了自己的收入,大四又找了兩家MIS公司兼職,雖然錢不多,但是在學生期間有1000多的收入我已經非 常滿足了,我終於用自己賺的錢把計算機換了。大四下開始找工作,這時我的工作經驗已經比較多(當然現在想想非常幼稚),開始聽父母的想去那個研究所, 實習過那個部門也希望我能去,但是不知道為什麼最後不了了之,這種單位就是比較官僚,我一氣之下就到了我兼職的一個公司做MIS的TeamLeader。 在大三到畢業一年的時間,做過了各種MIS,從煤氣、煙廠、公安、鐵路、飲食到高校,什麼有錢做什麼,工作也很辛苦,經常加班和熬通宵,從跟客戶談需求到 設計、編碼、測試、交付都要上。那時覺得很有成就感,覺得自己還不錯,現在想想真是很膚淺。
剛走上工作崗位的學生很容易被誤導,各種開發工具讓人眼花繚亂,同時也覺得很受公司器重,但這樣工作永遠是一個低層次的開發者。不要跟我說什麼系統分 析有多麼多麼重要,多麼多麼難。你以為自己跟用戶談需求做設計就是系統分析和設計了嗎,國內又有幾個公司能夠做的很到位很規范?我是ISO9000內審 員,也在Rational公司受過多次培訓,拿了4個證書,還有一個公司讓我去做 CMM。這些我聽過很多,但是很多事情到國內就變了性質,一個公司不是通過了ISO9000或者CMM就能規范了,我現在在一家有幾十年歷史的外企工作, 裡面的管理不是一般國內企業能及的。作為一個畢業不久以前沒有步入過社會的學生,幾乎不可能在很短的時間掌握系統分析和設計,面向對象、UML只是一個工 具,關鍵是人本身的思想,不是說你熟悉了C++、Rose就能夠做出好的設計,相反如果你具備了很高的素質,你可以用C寫出比別人用C++更加模塊化的程 序。
話說遠一些,國內軟體開發行業有一個怪圈,很多人覺得VC > Delphi > VB,真是很搞笑。這幾個軟體我都做過開發,說白了他們都是工具,應該根據應用的需要選擇採用哪個,而不是覺得哪個上層次。如果你因為用某個開發工具很有 面子而選擇的話,只能說明你很淺薄。如果說層次,那麼這些工具都不上層次,因為它們用來用去都是一些系統的API,微軟的朋友不會因為你記住他們多少個 API或者多少個類就會覺得你很了不起,你永遠只是他們的客戶,他們看重的是你口袋裡的銀子。我也做過系統內核,我也封裝過很多API,同樣我也不會看重 那些使用這些API做二次開發的客戶,除非他能夠作出自己獨到的設計。
至於有人認為C++ > C那更是讓人笑掉大牙,不妨你去打聽一下,現在有幾個操作系統內核是用C++寫的,又有幾個實時系統用的是C++,當然我也不是說C++不好,但是目前的 內核和實時系統中C++還無法與C匹敵,至於說C++適合做應用系統的開發那是另外一回事。所以我的觀點是不在於你用什麼工具和語言,而在於你干什麼工 作。你的設計體現了你的技術層次。
這樣幹了一年我覺得非常苦悶,做的大多數都是熟練工種的活,個人技術上沒有太多的提高也看不到方向。所以決定離開這個城市去上海,尋求更好的發展,並且打算放棄我以前的MIS轉到通信行業。
寫到這里不能不提到我女朋友,我們是在來上海前半年認識的,她大四在我公司實習,公司派她給我寫文檔,我們的感情發展的很快。她告訴我很多事情,她家 原本是改革開放的第一批暴發戶,她母親愛打牌,輸掉了幾百萬,還欠了很多債,她有男朋友,但是她對他沒有感情,只因為他給了她母親兩萬多塊錢,後來還強迫 她寫了四萬塊的借條,她男朋友背叛過她並且不止一次打她,現在逼她結婚不然就要她還錢。這人居然還是一個高校的老師!她母親把父親給她的學費花了,因為拖 欠學費她沒有辦法拿到畢業證。她母親現在有病需要錢,我拿出了自己的一點積蓄並且跟朋友們借了一些,替她交了學費並給她母親看病(後來才知道看病的錢又不 知所終,就連她母親是不是有病我都不知道,但她也是沒有辦法)。這個時候我家知道了一些事情,堅決反對我和她在一起,她原來的男朋友也極力破壞。無奈之下 我們決定早一點離開這個傷心的城市,並且瞞著我們家。由於時間倉促,我只准備了4000塊錢,她僅有的幾百塊錢也被她母親要去了,我買了三張票,一張是中 午的,兩張是晚上的,中午我的家人把我送上船,他們一離開我就下了船,我和她乘坐晚上的船離開了這個我和她生活了很多年的城市,帶走的只是一身債務。沒有 來過上海的我們兩個性倔強,都不願意去麻煩同學和朋友。來到上海是傍晚6點半,我們都不知道該去哪裡,我們找了一個20塊錢的旅館,這個房間連窗戶都沒 有,7月份的天氣酷熱難耐,房間里非常悶熱。第二天我們開始租房子,因為身上的錢不多,我們基本都是步行,花了一個星期時間,不知道在浦東轉了多少圈後找 到了一個400塊的房子,但是我們都不了解上海是付三壓一,還要付半個月的中介費,買了一些鍋碗瓢盆後,我們身上只有800塊錢了,工作都還沒有著落,這 800塊錢要支持到我們拿到第一個月工資,為了省錢我們自己做飯,每天買菜只花兩塊錢,她非常喜歡吃(也可能她在大學經常挨餓的原因),看到她現在這樣省 吃儉用我真的很不忍心。她以前的男朋友也沒有放過她,經常打電話來騷擾,並且來上海看她,還說了不少恐嚇她的話,她過於善良,說他以前畢竟幫助過她,叫我 不要與他一般見識。以後的每天在家就是苦等面試通知,原本我想迅速找一家MIS公司解決眼前的困難,但是她堅持讓我不要放棄自己的理想,終於功夫不負有心 人,我找到了一家通信公司,4000塊的工資雖然趕不上MIS公司給我開出的價位,但也夠在上海生存。她也找到了工作,第一天上班她哭了,這是她來上海第 一次流淚,我心裡很難受也很感動。
由於是全新的行業,我把自己降到了零點,我學的VC、Delphi、資料庫派不上用場,擺在我面前的是嵌入式、協議、信令一些我從未接觸過的知識。我 知道我沒有退路,於是拚命的學習,我把自己當做一個應屆畢業生一樣,一分努力一分收獲,半年過去我終於熟悉了工作,並且得到了公司的表彰,薪水也加了一 級。後面的日子裡我們省吃儉用,把欠朋友的1萬多塊錢還了,日子終於上了正軌。這時女朋友告訴我她想考研究生,我也很支持,於是她辭職在家備考。
另外,在這里我要感謝我的ProjectManager,他原來是一個大通信公司的產品經理,對人非常和善,我從他那裡學到了很多知識,而且他也給了 我許許多多無私的幫助。在工作上他給我充分的空間和信任。記得公司安排我維護一個接入伺服器軟體,由於代碼量不算太小(5萬行),資料和文檔都不齊全,我 維護起來非常吃力,所以想重新把它做一遍,公司領導不太支持,可能覺得工作量太大,但是他極力支持我,私下裡他讓我放手去做,我的維護工作他擠時間做。在 他的支持下,我花了半年時間完成了接入伺服器的軟體,並且實現了一個相對完整的TCP/IP協議棧。在這里我學會了嵌入式系統設計、驅動開發、TCP /IP和很多通信的知識,我花了一年時間終於使自己從MIS開發轉到了通信行業,並且站穩了腳跟。我的開發大量是對硬體的直接操作,不再受微軟的操作系 統,VC、Delhpi這些開發工具的約束,我終於看到了另外一片天空。
我做事情喜歡追根問底,隨著開發的深入,軟體開發與硬體聯系越來越緊密,硬體知識的匱乏又對我的發展產生了障礙,而且晶元技術基本上掌握在國外公司的 手裡,這對做系統級設計是一個非常大的制約,一個新產品出來,第一道利潤(也往往是最豐厚的利潤)常常都被IC公司如Intel、Motorola賺去 了,國內的廠商只能喝點湯。所以我決心解決自己的硬體技術障礙,並打算離開通信行業,進入IC設計相關領域。
當然我明白如果我對硬體了解的非常少,沒有哪家IC公司會仁慈到招我這樣一個一竅不通的人來培訓。所以我必須努力打好基礎,學一些相關知識為以後做准 備。就像我開始從MIS轉到通信一樣,我看過大量通信方面的書,並且給一個ISP做過RADIUS計費分揀台,在這樣的背景下這家通信公司才給了我這個機 會。我在的通信公司是做系統設計的,有不少PCB Layout硬體人員,平常我就注意向他們學習,由於我做的是軟體,在公司看硬體資料不好意思,所以開始只好在家看,剛來上海工作我連續一年都在加班,後 來不加了,因為我要擠出時間學習,通常我12點左右睡,第二天5點半起,我上班比較早,地鐵上如果人不多我也用來看書。學習當然不會是一帆風順的,有些實 在不懂的問題就積累起來問硬體人員,他們的幫助使我學習進度快了很多,因為在沒有人點撥的情況下自學,我的一半時間是花在解決疑難問題上,但這種問題經常 是別人的一句話就可以讓我豁然開朗,我非常慶幸我有這樣的學習環境。在後面的一年裡,我學會了看硬體原理圖,學會了簡單的硬體設計(模擬電路方面還有不小 的差距),事情就是這樣的,當你安安份份做軟體,別人永遠認為你是軟體開發人員,在你開始學習硬體時別人未必會認同,有位中興通訊的朋友還對我說過,一個 人不可能把所有東西都學完。我也明白這一點,但我希望自己做的更好。但當你熟悉硬體後大家又會覺得你好像原本就是軟硬體都懂的,同事們也都習以為常了。這 個時候我可以把硬體資料堂堂正正的拿到公司看,沒有人再大驚小怪了。讓我比較自豪的是我通過自己的努力做了一個IAD(軟交換的終端設備)系統方案,包含 軟硬體的選型、設計等內容,這個方案得到了公司和同事們的認同,讓我感到非常欣慰。
技術是相輔相成的,當我的硬體有了一定的進步後,我的軟體設計也有了很大的提高,我可以從更深層次理解問題,我做的接入伺服器CPU是 Motorola PowerPC860,熟悉的朋友都知道860 QMC與軟體的批量數據傳輸通常採用BD表的方式,硬體人員做驅動的時候習慣採用固定BD表,每接收或發送數據都將數據從BD表拷貝到用戶Buffer, 或從用戶Buffer拷貝到BD表,由於理解的比較深入,我自己重新實現了這個過程,採用動態BD表的方式,驅動從一個網口接收數據,提交給我的軟體進行 三層交換,直至從另外的介面發送出去,沒有進行一次拷貝。這樣的設計大大提高了性能,使系統的指標接近理論值。軟硬體的結合使我的設計水平上了一個台階。 我現在寫的這個操作系統,編譯後我把程序反編譯成匯編,找出其中不優化的代碼,然後在C程序中進行調整。舉個例子,很多CPU沒有專門的乘法指令,這個大 家應該都知道,在這種CPU上進行一個乘法操作常常會花費大量的指令周期,有的朋友會說這個我知道,我會盡量避免採用×號,但是事情往往不是那麼簡單,你 知道 C語言中數組的下標操作是怎麼實現的嗎?仔細看看反匯編的代碼你就會明白,同樣是通過下標的定位操作,C編譯器會有時候會產生位移指令,但有時候會用乘法 實現,兩者效率往往是天壤之別,所以明白這些問題你才能將系統性能提升到極致。這些問題就不多說了,有興趣的話以後可以共同探討。
話說遠一點,我由衷的希望在軟體上做的比較深入的朋友們有機會學學硬體以及其它相關知識,尤其是做底層開發和嵌入式設計的。這對軟體技術的提高有非常 大的幫助,否則很多事情你只知道該這樣但不會明白為什麼該這樣。我這個觀點在我現在的IC公司Project Manager那裡也得到了驗證。他告訴我們公司現在的802.11晶元產品的軟體經理原本是做該晶元硬體設計的,某某某原本是做軟體的,現在在做IC, 類似的例子還有很多,只是在國內這樣的風氣不是非常流行。
我有一些心得體會與大家分享,只有當我干好本職工作後,我才會學習與工作關系不大的技術,這樣公司的上司才不至於反感,在入門階段的問題我通常不去問 那些資深人士,而是問一些資歷比較淺的朋友,比如剛畢業不久的學生,因為他們往往會跟你詳細的講解,而資深人士通常覺得你的問題太簡單,所以回答的也很簡 單,我又不好意思多問。等技術上了一定的層次後我才會問他們,他們也能給你比較深入的回答。另外,有些朋友說我機會比較好,他們也希望能從事新的工作可惜 沒有機會,我聽了只有苦笑,我的機會了解的人都應該知道,我沒有出生在什麼IT世家:)也沒有誰一路提拔我,所有的路都是自己走出來的,我母親去世比較 早,我的後母(我叫她阿姨)看著我努力過來的,一次她看我大年30還在寫程序,她說像我這樣努力木頭都能學出來。
我的最終目的是IC而不是PCB,所以我下一步的准備開始學習IC設計的知識。公司的同事沒有懂IC設計的,後面的路又要靠自己了,我買了不少相關的 書,在網上也查了很多的資料,我花了大量的時間去學習VHDL,並且用軟體進行了一些簡單的設計和模擬(沒有設計ASIC,只是針對FPGA),隨著學習 的深入,我漸漸明白了IC設計的基本流程,同時也明白了這條路的艱辛。這個時候我已經做好了跳槽的准備,我向一家業界有一定知名度的IC設計公司投了簡 歷,並通過了漫長的面試(4個多小時)。其他的一切我都比較滿意,唯獨薪資差強人意,我也明白原因,因為我是這個行業的新人,我沒有經驗,我再一次將自己 清零了。公司老闆問我6000多一個月能不能接受,我知道他也是照章辦事。想想我通信行業的朋友們,基本上都是年薪10萬以上,月薪過萬的也比比皆是,朋 友們也幫我介紹了不少待遇不錯的公司,我該怎麼選擇,當時我很猶豫,我熱愛我的事業,我嚮往我的追求,但我也是一個普通的人,我也需要養家糊口,我也想早 一點買房買車。生活給我出了一道難題。
愛因斯坦在63歲時說過「一個人沒有在30歲以前達成科學上的最大成就,那他永遠都不會有。」這句話給了我很大的壓力和震動,我馬上就26歲了,離 30隻有四年時間,我必須抓緊這幾年寶貴的時間,努力達到我技術上的最高峰。為了這個理想,為了能離自己的夢更近一些,我選擇了這家IC公司,我明白自己 的薪資和公司剛進來的碩士研究生相差無幾,但為了今後的發展只能忍受,一切又得重新開始。換行業是一個非常痛苦的過程,尤其從一個春風得意的位置換到一個 陌生的崗位,感覺象從溫暖的被子里鑽出來跳進冰水中,讓人難以接受。在原來那家通信公司,我是唯一兩年時間漲了五次工資的員工,公司和同事都給了我極大的 認可,工作上也常常被委以重任。但現在這一切都成了過去,在新的公司我只是一個新人,沒有人知道也沒有人在意我過去的成績。我決定重新開始,我把自己看作 新畢業的學生,我要用自己的努力得到公司的認可。進入新的行業是非常痛苦的,我告訴自己必須忍受這一切,雖然外面有很多誘惑,但是既然作出了選擇我就不允 許自己輕易放棄。
我現在已經在這家新公司上了一個多月的班,開始非常艱難,現在慢慢適應了。第一 個月結束時,Team Leader找我談話,說我是新進員工中最優秀的一個,我心裡很欣慰,這也算對我努力的一個肯定吧。在這里還要感謝我的女朋友,她給了我很大的支持和鼓 舞,每次在我動搖的時候她都在鼓勵我,讓我堅持自己的理想,剛來上海是她讓我不要勉強去做MIS,這次也是她讓我頂住了月薪過萬的誘惑,沒有她我可能不會 有今天的成績。現在的公司有自己的操作系統,自己的CPU、DSP和其它晶元,在這里我能學到世界上最先進的技術,我們的設計開發不再完全依賴別人的硬體 和系統,這讓我很開心。我打算等工作步入正軌後,全力學習新的知識,實現我的理想。在後面的兩年裡我給自己定下了幾個目標:
努力做好本職工作,在工作上得到公司和同事們的認同;
努力學習IC硬體設計知識,多向同事請教,並利用一切機會多實踐;
實現我的實時操作系統的主要部分,完成TCP/IP協議棧模塊,並免費發布源代碼;
和我女朋友結婚並買一套小房子,這是最重要的,因為我明白事業是可以重來的,但是珍貴的感情很難失而復得。
在這里提一下我現在開發的操作系統,它是一個實時嵌入式系統,目前支持:
a.時間片輪轉調度和基於優先順序調度,最多64個優先順序;
b.搶占式實時內核;
c.為了便於移植,主體用標准C實現;
d.匯編代碼非常少,不到100行;
e.支持任務管理,各任務有獨立的堆棧;
f.進程同步和通信目前完成了Semaphore,Message Queue正在調試;
g.實現了定時系統調用;
h.可以在windows上模擬調試
我還打算下一步實現優先順序反轉保護,Event Flag,Data Pipe,內存管理(以前實現過)、驅動介面等。 在這之後我還會努力完善它,比如加入文件系統,協議棧、調試介面等。希望朋友們提出自己的意見和建議,在此不勝感激!
就像有的朋友說的,我的經歷或許會給一些朋友產生誤導,在這里我必須說明一下。我來上海以前學習過於拚命,常常晚上只睡3個多小時,我身高1米71, 那時只有108斤(我現在130多),家人也說我這樣拚命活不過60歲,但是當時的我太固執,我對他們說只要能實現理想活50歲我就夠了。那時的拚命使我 的身體受到了影響,有一次早上突然腰肌劇痛難忍,痛的我倒在床上站不起來。雖然我現在已經比較注意,但有時候還會隱隱作痛。後來在女朋友說服了我,來上海 以後我不再如此。我經常引用父親的一句話,而且我也發現拚命不是辦法,我可以熬一兩個通宵,最多的一次我連續工作了三天三夜,但是我半個月都沒有恢復過 來,這樣是不是得不償失?
學習工作應該是一個長期的過程,像馬拉松而不是百米沖刺。我現在非常注意調整學習和工作的強度,我要保證每天盡量有相對充沛的精 力,一些年輕的朋友覺得自己也應該拚命努力,這讓我多少有些擔心,如果我的故事能讓你在學習工作上多一點興趣,我會感到很開心,但如果誤導了某些朋友,讓 你做一些不值得的付出,我會感到很內疚。