程式整合篇

原始文件

說明:

  在 Windows 95/NT 系統下, MS-DOS 模式屬執行後不理之型式,以至程式若在 MS-DOS 模式下執行時,會造成程式整合之困難度增加,及程式結束後系統資源釋放不完整,因此本計畫請相關程式發展者一律將程式編譯成 Windows 執行檔,相關技術如附件所載。另為了簡化程式整合所需時間,請相關程式發展者將程式調整支援命令列,並將必要手動輸入參數置入命令列中,相關技術如附件所載。

附件

編譯 Windows 之執行檔

  可利用 Microsoft Fortran PowerStation 4.0 或 Digital Visual Fortran 5.0 或相容之編譯軟體進行,本文利用 Digital Visual Fortran 5.0 (以下簡稱 DF) 進行說明。

  DF 支援四種 Windows 32 位元模式執行檔,唯其中兩種模式 (Win32 [Console] Application) 需以 WinMain 模組為啟動模組,與本系所之程式撰寫習慣不盡相同,本文不加說明。本文僅針對 QuickWin ApplicationStandard Graphics Application 修改方式加以說明。

  QuickWin Application 為多重文件介面 (MDI) ,一般建議傳統 Fortran 程式撰寫者採用本模式進入 Windows 系統, Standard Graphics Application (SDI) 為單一文件介面,其修改法與 QuickWin Application 同,以下說明僅針對 QuickWin Application 說明之。將原程式修正方式很單純,首先,利用 File 選單下的 New 子選項開啟對話盒,在 Projects 屬性頁中設定為 QuickWin Application ,利用 Location 選定專案目錄,並在 Project Name 中輸入專案名稱即可。設定完畢後按 OK 鈕。

  進入專案後即可利用 Project 選單下的 Add to Project [File] 加入原 MS-DOS 模式之 For 檔。完成加入後即可進行編譯,利用 Build 選單下的 ReBuild All 即可完成編譯,執行專案可利用 Build 選單下的 Execute [專案名稱] 子選單執行。設定編譯模式可利用 Build 選單下的 Set Active Configuration 進行設定。

  在程式執行效率上,Release 比 Debug 模式少掉除錯符號及標記,因此執行效率較高,在對於大陣列的運算上, Windows 模式較 DOS 模式省掉真實模式與保護模式的切換,執行效率較高。在對銀幕輸出上 Windows 模式是以繪圖畫面對螢幕輸出,較 MS-DOS 模式以文字畫面輸出為慢,執行效率較差。總整上述相關執行效能之因素後,請各相關程式發展者完成時採用 Windows 模式及 Release 模式編譯,並減少不必要的螢幕輸出,以提高程式執行效能。

Windows 模式特定函數補充說明

1. 版權對話盒:

int4=ABOUTBOXQQ('專案名稱 版本 X.X \n撰寫:OOO'C) !\n 為跳行

2. 程式執行狀況說明:

CALL SETMESSAGEQQ('程式執行中', QWIN$MSG_RUNNING)

3. 命令列

  命令列 (Command Line) 較難解釋,以下例來說明之。

C:\> format /s /q

  在本例中 format 為執行檔名, /s /q 即是所稱的命令列。

  支援命令列的程式可以用下列函數執行:

int2=WinExec('format /s /q',視窗狀態常數)

  而本函數屬 Windows API 的基本函數,只要是在 Windows 環境下,不論在 Fortran 、 BASIC 或是 C/C++ 中皆可以使用。透過命令列的支援,亦可使 Fortran 與 Fortran 之間的溝通管道增加。

  在專案修改中,命令列要支援必須即時更動的參數,以便進行程式整合,如果參數過多,就由命令列指定一個輸入檔,再由輸入檔中讀取。以 DF 為例修正原始程式:

use dflib

c program Main !改成註解列

c 加入變數宣告

integer*2 status

character*256 MyBuffer

c 取得命令列的副程式

call getarg(1,MyBuffer,status)

註解:GetArg((n, buffer, status)

n 為命令列中第 n 個參數,buffer 為命令列內容,status 為字串長度。以前例來說,

N Buffer Status
0 Format 6
1 /s 2
2 /q 2
3 -1

c 根據取命令列第一個參數 status 傳回值,若傳回值等於 -1 表無命令列。

if (status .eq. -1) then

[原使用者需對程式所做的回應]

else

[新增改由命令列參數依序讀取]

end if

if (status .ne. -1) then

[若程式有命令列參數,執行完畢自動關閉,不詢問使用者是否關閉。]

stop

end if

end