Compaq Visual Fortran 是一款在 Windows 平台上非常经典和强大的 Fortran 90/95 开发环境,它由 Compaq 公司开发,后 HP 继承了其版权,虽然现在已经停止官方支持,但因其稳定性和易用性,至今仍有大量科学计算和工程领域的工程师在使用。

这份教程将从环境搭建、基础语法到实际项目开发,一步步引导你入门。
第一部分:环境搭建与入门
什么是 Compaq Visual Fortran (CVF)?
CVF 是一个集成开发环境,它将 Fortran 编译器、调试器 和 编辑器 集成在了一起,你可以用它来编写、编译、调试和运行 Fortran 程序。
- 编译器: 将你写的 Fortran 源代码 (
.f90,.for文件) 转换成可执行文件 (.exe)。 - 调试器: 帮助你找到程序中的错误(Bug),例如设置断点、查看变量值等。
- 编辑器: 提供代码编写、语法高亮、自动缩进等功能。
安装 Compaq Visual Fortran
由于 CVF 已停止销售,你需要从合法的渠道获取安装文件,通常可以在一些技术论坛、大学资源库或二手软件平台找到。
安装步骤:

- 运行安装程序: 找到
setup.exe并运行。 - 序列号: 安装过程中会要求输入序列号,如果你没有,可以尝试在网上搜索通用的试用序列号或破解方法(请注意版权和软件许可问题)。
- 选择安装组件: 建议全部安装,包括:
- Fortran 编译器: 核心组件。
- Visual Studio 集成: 让 CVF 的编辑和调试功能无缝集成到 Visual Studio 中。强烈建议安装!
- 示例程序和文档: 对新手非常有帮助。
- 完成安装: 安装完成后,你的电脑上会出现 "Compaq Visual Fortran" 和 "Microsoft Visual Studio 6.0" 的快捷方式。
创建第一个 "Hello, World!" 程序
步骤 1: 启动开发环境
- 双击桌面上的 "Compaq Visual Fortran" 快捷方式,这会启动 Visual Studio 6.0,并加载 CVF 的插件。
步骤 2: 创建新项目
- 在 Visual Studio 中,点击菜单
File->New->Project...。 - 在弹出的对话框中,选择
Compaq Visual Fortran Projects。 - 在右侧的模板中,选择
Fortran Console Application。 - 给你的项目起一个名字(
HelloWorld),并选择一个存放位置。 - 点击
OK。
步骤 3: 编写代码
- 项目创建后,会自动生成一个默认的源文件,通常名为
Source1.for或HelloWorld.for。 - 你会看到类似下面的代码框架:
!DEC$ ATTRIBUTES DLLEXPORT::MAIN
!DEC$ ATTRIBUTES ALIAS:'_MAIN'::MAIN
!DEC$ ATTRIBUTES STDCALL::MAIN
SUBROUTINE MAIN()
! ... 代码 ...
END SUBROUTINE MAIN
将其修改为标准的 Fortran 95 "Hello, World!" 程序:

!DEC$ ATTRIBUTES DLLEXPORT::MAIN
!DEC$ ATTRIBUTES ALIAS:'_MAIN'::MAIN
!DEC$ ATTRIBUTES STDCALL::MAIN
SUBROUTINE MAIN()
IMPLICIT NONE ! 强制声明所有变量,是好习惯
WRITE(*,*) "Hello, World from Compaq Visual Fortran!"
WRITE(*,*) "Press any key to exit..."
READ(*,*) ! 等待用户输入,防止窗口一闪而过
END SUBROUTINE MAIN
代码解释:
!DEC$ ...: 这是 Compaq 特有的指令,告诉编译器如何处理MAIN子程序(例如导出它,使其成为一个可执行程序的入口)。SUBROUTINE MAIN(): 在 CVF 中,控制入口通常是一个SUBROUTINE而不是PROGRAM。IMPLICIT NONE: 禁用 Fortran 的隐式类型声明,所有变量必须先用INTEGER,REAL等声明后才能使用,可以避免很多错误。WRITE(*,*): 向标准输出(通常是控制台窗口)打印信息。 代表默认的输出设备。READ(*): 从标准输入读取信息,这里用来暂停程序,等待用户按键。
步骤 4: 编译和运行
- 点击工具栏上的 "Build" 按钮(一个锤子图标),或者按
F7键,这会编译你的项目。 - 如果没有错误,在输出窗口会看到 "Build: 1 succeeded, 0 failed..."。
- 点击工具栏上的 "Execute Program" 按钮(一个感叹号图标!),或者按
Ctrl + F5键来运行程序。
你应该会看到一个黑色的控制台窗口,显示 "Hello, World..." 字样,并等待你按任意键后关闭。
第二部分:Fortran 95 基础语法
这部分是 Fortran 语言的核心,CVF 完全支持这些特性。
变量与数据类型
IMPLICIT NONE ! 声明变量 INTEGER :: age REAL :: price, temperature CHARACTER(len=50) :: name ! 长度为50的字符串 LOGICAL :: is_student ! 赋值 age = 25 price = 99.99 name = "Zhang San" is_student = .TRUE. ! 输出 WRITE(*,*) "Name: ", name WRITE(*,*) "Age: ", age WRITE(*,*) "Is student? ", is_student
数组
IMPLICIT NONE
! 声明一个固定大小的整型数组
INTEGER :: numbers(5) ! 5个元素,索引从1到5
! 声明一个动态数组(需要在程序运行时确定大小)
INTEGER, ALLOCATABLE :: dynamic_array(:)
INTEGER :: n, i
! 初始化静态数组
numbers = [10, 20, 30, 40, 50]
! 为动态数组分配内存
WRITE(*,*) "Enter the size of the array: "
READ(*,*) n
ALLOCATE(dynamic_array(n))
! 给动态数组赋值
DO i = 1, n
dynamic_array(i) = i * 10
END DO
! 输出数组
WRITE(*,*) "Static array: ", numbers
WRITE(*,*) "Dynamic array: ", dynamic_array
! 释放动态数组占用的内存
DEALLOCATE(dynamic_array)
控制结构
IF 语句:
IF (age >= 18) THEN
WRITE(*,*) "You are an adult."
ELSE IF (age >= 13) THEN
WRITE(*,*) "You are a teenager."
ELSE
WRITE(*,*) "You are a child."
END IF
DO 循环:
! 计数循环
DO i = 1, 10
WRITE(*,*) "Counting: ", i
END DO
! 使用 `CYCLE` 和 `EXIT`
DO i = 1, 10
IF (i == 5) CYCLE ! 跳过当前循环,继续下一次
IF (i == 8) EXIT ! 退出整个循环
WRITE(*,*) "Looping: ", i
END DO
子程序和函数
这是 Fortran 模块化编程的核心。
子程序:
SUBROUTINE greet(name)
IMPLICIT NONE
CHARACTER(len=*), INTENT(in) :: name ! INTENT(in) 表示该参数是输入,子程序不会修改它
WRITE(*,*) "Hello, ", name, "!"
END SUBROUTINE greet
! 在 MAIN 中调用
CALL greet("Li Si")
函数:
FUNCTION add(a, b) RESULT(sum)
IMPLICIT NONE
INTEGER, INTENT(in) :: a, b
INTEGER :: sum
sum = a + b
END FUNCTION add
! 在 MAIN 中调用
INTEGER :: result
result = add(5, 3)
WRITE(*,*) "5 + 3 = ", result
第三部分:Compaq Visual Fortran 进阶技巧
模块
模块是组织和封装数据、子程序和变量的最佳方式,可以避免全局变量,实现更好的代码重用。
创建一个模块 my_math_module.f90:
MODULE my_math_module
IMPLICIT NONE
PRIVATE ! 将所有内容设为私有,除非明确声明为 PUBLIC
! 公开一个子程序
PUBLIC :: calculate_average
CONTAINS
! 计算一个数组的平均值
SUBROUTINE calculate_average(arr, avg)
IMPLICIT NONE
REAL, INTENT(in) :: arr(:) ! 输入数组,可以是任意大小
REAL, INTENT(out) :: avg ! 输出平均值
INTEGER :: n
n = SIZE(arr)
avg = SUM(arr) / REAL(n)
END SUBROUTINE calculate_average
END MODULE my_math_module
在项目中使用模块:
- 在 Visual Studio 中,右键项目 ->
Add->Files...,将my_math_module.f90添加到项目中。 - 在你的主程序文件中,使用
USE语句来调用模块。
!DEC$ ATTRIBUTES DLLEXPORT::MAIN
!DEC$ ATTRIBUTES ALIAS:'_MAIN'::MAIN
!DEC$ ATTRIBUTES STDCALL::MAIN
SUBROUTINE MAIN()
USE my_math_module ! 使用我们创建的模块
IMPLICIT NONE
REAL :: test_scores(5) = [88.0, 92.5, 76.0, 85.0, 90.5]
REAL :: average_score
CALL calculate_average(test_scores, average_score)
WRITE(*,*) "The test scores are: ", test_scores
WRITE(*,*) "The average score is: ", average_score
END SUBROUTINE MAIN
调试程序
调试是开发中最重要的环节之一。
- 设置断点: 在代码行号左侧的灰色区域单击,会出现一个红点,这表示程序运行到这一行时会暂停。
- 启动调试: 点击工具栏上的 "Start Debugging" 按钮(一个带虫子的图标),或者按
F5。 - 查看变量: 当程序在断点处暂停时,将鼠标悬停在变量上,可以在弹出的提示框中看到其当前值,或者,打开
Debug菜单下的QuickWatch或Watch窗口,输入变量名来持续观察。 - 单步执行:
F10(Step Over): 执行当前行,如果当前行是函数/子程序调用,则直接执行完整个调用,不进入其内部。F11(Step Into): 执行当前行,如果当前行是函数/子程序调用,则进入其内部,逐行执行。Shift + F11(Step Out): 从当前所在的子程序/函数中执行出去,直到返回到调用它的地方。
- 继续执行: 按
F5继续运行,直到遇到下一个断点或程序结束。
第四部分:资源与常见问题
学习资源
- 官方文档: CVF 的安装目录下通常有
Docs文件夹,里面有CVF_User_Guide.pdf和CVF_Reference.pdf,这是最权威的资料。 - 书籍:
- 《Fortran 95/2003 for Scientists and Engineers》 (Stephen J. Chapman): 经典入门教材。
- 《Modern Fortran Explained》 (Michael Metcalf, John Reid, Malcolm Cohen): 深入讲解现代 Fortran 特性。
- 在线社区:
- comp.lang.fortran : Google Groups 上的 Fortran 新闻组,非常活跃,可以提问和交流。
- Stack Overflow : 搜索标签
[fortran]和[compaq-visual-fortran]。 - Fortran Discourse : 一个现代的 Fortran 开发者社区。
常见问题
-
Q: 编译时出现 "error LNK2001: unresolved external symbol _MAIN" 错误?
- A: 这通常是因为
MAIN子程序的声明或属性有问题,请确保你的MAIN子程序有正确的!DEC$ ATTRIBUTES指令,并且项目类型是 "Console Application"。
- A: 这通常是因为
-
Q: 如何链接外部库(如 LAPACK, BLAS)?
- A: 在 Visual Studio 中,右键项目 ->
Settings。- 在
Link选项卡中,在Object/library modules框里输入你的库文件名(如lapack.lib,blas.lib)。 - 在
Input选项卡中,在Additional library path框里输入你的.lib文件所在的目录路径。
- 在
- A: 在 Visual Studio 中,右键项目 ->
-
Q: 程序运行时窗口一闪而过怎么办?
- A: 在程序末尾加上
READ(*,*)语句,或者按Ctrl + F5运行,而不是F5。
- A: 在程序末尾加上
-
Q: CVF 太老了,我该学哪个?
- A: 如果你的目标就是维护或使用旧的 CVF 项目,那么学习 CVF 是必要的,对于新项目,强烈推荐学习现代的 Fortran 和开发环境,
- Intel Fortran Compiler (ifx/ifort): 业界性能领先的编译器,与 Visual Studio 集成良好。
- GNU Fortran (gfortran): 开源免费,跨平台(Windows, Linux, macOS)。
- 现代编辑器: 如 VS Code + LSP Fortran 插件,或现代的 IDE。
- A: 如果你的目标就是维护或使用旧的 CVF 项目,那么学习 CVF 是必要的,对于新项目,强烈推荐学习现代的 Fortran 和开发环境,
希望这份教程能帮助你顺利入门 Compaq Visual Fortran!祝你编程愉快!
