在嵌入開發板上做了一段時間的C語言開發后,今天突然心血來潮,想起大學時期在TurboC和TC3下寫代碼的情形。大一時宿舍里有台386(在當時是算比較先進的了),大一大二基本上都在玩DOS和WIN31、WIN32、WIN95,那時的編程工具也只有BASIC和TC。當然還有dBASE和foxBASE,但我認為那些是數據庫,不是編程語言了。后來在WIN95、WIN98下就有VB、BC++和CBuilder了,再后來又接觸到Delphi、VC和JAVA了。再后來就發現到處都是編程語言了。
接觸到CBuilder和Delphi后,才發現原來WINDOWS編程可以這么簡單,所以就拋棄了BC++和VC。那時有句名言:真正的程序員用C,但聰明的程序員用Delphi。可見Delphi對編程史的沖擊有多大,足可以跟C語言相提並論了。Delphi本身只是個工具,它擴展了Pascal語言,封裝了WINDOWS的API,形成非常優雅和強大的編程風格。后來有人認為C就是VC,拿VC跟Delphi比,這在一定程度上是可以理解的,畢竟VC和Delphi都只是工具;但其實VC着重的是C++,而不是C,可以說只會VC的話還是有點夠不上“真正的程序員”那句話的標准的。
我一直有保存代碼的習慣,因此大學時期寫的比較象樣的代碼我基本都有保存。一開始是保存在五吋盤上,后來就是三吋盤,畢業時就把所有內容壓在幾張三吋盤上了。工作后買了電腦,就一直保存在硬盤里了。TC2和TC3這兩個經典的編程工具,我也一直都有。於是趁着今天有點時間,好好的懷舊了一把。
我找了個大三時寫的小游戲的代碼,准備編譯運行一把。當時C&C(后來發展成紅警)非常流行,我也就隨大流寫了個模仿C&C的小游戲。由於該游戲用了DOS下的EGA圖形界面,所以不能直接在XP以上的WINDOWS下運行,只能在DOS環境下跑了。我機上有MSDOS6.22的VMWARE虛擬機,把它開起來,裝了個TC3,配置好路徑和選擇,編譯一下,結果報了個全局變量太大的錯失敗了。因為我這個游戲代碼只有一個C文件,內容較大,用TC2編譯不了,記得當時還是用TC3的在WIN32下才能編譯通過,不然就要改代碼,去掉一部分不是必須的功能(如地圖編輯)。
改了一下,發現在里面用TC編寫代碼真是無法接受,連常用的選擇塊、復制粘貼都相當別扭,習慣差太遠了(真不知以前沒WINDOWS的時候是怎么過來的,要記住多少快捷鍵啊)。實在受不了,還是把VMWARE虛擬機關了,決定用Visual Studio來編寫。懷舊一下:用VC(VS2008)編譯DOS下TurboC(TC3)的C程序 http://hovertree.com/menu/c/
把TC3和代碼解到E盤DOS目錄下,照着我前面寫的《在Visual Studio下維護嵌入式系統C源碼的一個實例》一文的步驟,在VS下建了個vsyt工程。由於WINDOWS下是可以直接運行DOS命令的,因此寫了個編譯的批處理命令gen_yt.bat:
E:
cd /dos/tc3/src/yt
set PATH=E:/dos/tc3/bin;%PATH%
../../bin/tcc -mh -Y -f87 -IE:/dos/tc3/include/ -LE:/dos/tc3/lib yt.c GRAPHICS.LIB
將該批處理命令設置為工程的“生成”命令行,然后執行生成,VS輸出窗口顯示編譯錯誤:
------ 已啟動生成: 項目: vsyt, 配置: Debug Win32 ------
正在執行生成文件項目操作
Turbo C++ Version 3.00 Copyright (c) 1992 Borland International
yt.c:
Error yt.c 4272: Too much global data defined in file in function doenimy
*** 1 errors in Compile ***
Available memory 3624520
生成日志保存在“file://e:/dos/TC3/src/yt/Debug/BuildLog.htm”
vsyt - 0 個錯誤,0 個警告
========== 生成: 成功 1 個,失敗 0 個,最新 0 個,跳過 0 個 ==========
VisualStudio報告是成功了,其實看日志就知道是編譯失敗了,只是VS沒截到錯誤而已。以前總也弄不明白,這個錯誤該如何修改代碼避免,只會不斷的修改內存模式。這個問題困擾我很多年,我知道是程序太大了,但一直都沒有時間去搞懂具體原因。現在想來,應該是DOS下程序大小有640K限制,堆棧則是64K的限制,編譯單個C文件也相應地會有代碼大小的限制,而全局變量的限制則更低。因此首先把C文件分解成多個,用extern聲明各函數在外部實現。再相應修改編譯批處理命令:
E:
cd /dos/tc3/src/yt
set PATH=E:/dos/tc3/bin;%PATH%
tcc -mh -Y -f87 -IE:/dos/tc3/include/ -LE:/dos/tc3/lib yt.c bmp.c draw.c game.c YMenu.c Run.c GRAPHICS.LIB
一番試驗修改后,編譯通過:
------ 已啟動生成: 項目: vsyt, 配置: Debug Win32 ------
正在執行生成文件項目操作
Turbo C++ Version 3.00 Copyright (c) 1992 Borland International
yt.c:
bmp.c:
draw.c:
game.c:
ymenu.c:
run.c:
Turbo Link Version 5.0 Copyright (c) 1992 Borland International
Available memory 3598664
生成日志保存在“file://e:/dos/TC3/src/yt/Debug/BuildLog.htm”
vsyt - 0 個錯誤,0 個警告
========== 生成: 成功 1 個,失敗 0 個,最新 0 個,跳過 0 個 ==========
