科学计算的语言-FORTRAN95

Size: px
Start display at page:

Download "科学计算的语言-FORTRAN95"

Transcription

1 科 学 计 算 的 语 言 -FORTRAN95 目 录 第 一 篇 闲 话 第 1 章 目 的 是 计 算 第 2 章 FORTRAN95 如 何 描 述 计 算 第 3 章 FORTRAN 的 编 译 系 统 第 二 篇 计 算 的 叙 述 第 4 章 FORTRAN95 语 言 的 形 貌 第 5 章 准 备 数 据 第 6 章 构 造 数 据 第 7 章 声 明 数 据 第 8 章 构 造 表 达 式 第 9 章 基 本 计 算 ( 一 ) 赋 值 语 句 第 10 章 基 本 计 算 ( 二 ) 选 择 控 制 结 构 第 11 章 基 本 计 算 ( 三 ) 循 环 控 制 结 构 第 三 篇 计 算 任 务 的 剖 分 与 组 合 第 12 章 程 序 的 单 位 第 13 章 过 程 及 其 通 讯 第 14 章 固 有 过 程 第 15 章 通 讯 第 16 章 数 据 文 件 的 管 理 第 17 章 数 据 文 件 的 编 辑 附 录 A. 语 句 B. 固 有 过 程 C. 语 法 参 考 文 献 J. Adams, W. Brainerd, J. Martin, and J. Wagener. Fortran 95 Handbook. ALL the documents of krsna.lamost.org are made available under the terms of the Creative Commons Attribution License.

2 第 一 篇 闲 话 中 国 数 学 的 经 典 著 作 大 都 以 依 据 不 同 方 法 或 不 同 类 型 分 成 章 节 的 问 题 集 的 形 式 出 现 每 一 个 别 问 题 又 都 分 成 若 干 个 条 目 : 条 目 一 是 问, 提 出 有 具 体 数 值 的 问 题 ; 条 目 二 是 答, 给 出 这 一 问 题 的 具 体 数 值 答 案 ; 条 目 三 称 为 术, 一 般 说 来 乃 是 解 答 与 条 目 一 同 种 类 型 问 题 的 普 遍 方 法, 实 际 上 就 相 当 于 现 在 计 算 机 科 学 中 的 算 法, 但 有 时 也 相 当 于 一 个 公 式 或 一 个 定 理 ; 条 目 四 是 注, 说 明 术 的 依 据 与 理 由, 实 质 上 相 当 于 一 种 证 明 ; 宋 元 以 来, 可 能 是 由 于 印 刷 术 的 发 达, 往 往 加 上 条 目 五 草, 记 述 依 据 术 得 出 答 案 的 详 细 计 算 过 程 早 在 九 章 算 术 中, 第 八 章 方 程 章 全 章 就 是 线 性 联 立 方 程 组 的 解 法 依 刘 微 注 : 并 列 为 行, 故 谓 之 方 程 又 说 : 令 每 行 为 率, 二 物 者 再 程, 三 物 者 三 程, 皆 如 物 数 程 之 当 时 以 筹 作 算, 依 题 意 将 数 据 按 物 数 排 成 各 行, 然 后 进 行 运 算 中 学 教 科 书 解 线 性 方 程 组 的 消 元 法, 最 早 即 见 之 于 九 章 算 术 数 学 在 中 国 古 时 历 来 称 为 算 术 这 正 好 反 映 了 中 国 古 算 构 造 性 计 算 性 与 机 械 化 的 特 色 数 学 不 仅 为 了 应 用, 即 使 为 了 在 纯 数 学 范 畴 内 获 得 具 体 结 果, 也 一 不 能 无 算, 二 必 须 有 术 中 国 古 代 算 术 的 思 想 与 方 法, 正 好 与 近 代 计 算 机 的 使 用 融 合 无 间, 也 必 将 因 此 而 重 返 青 春, 以 另 一 种 崭 新 面 貌 在 未 来 的 数 学 发 展 中 扮 演 重 要 角 色 [1] ---- 吴 文 俊 对 中 国 传 统 数 学 的 再 认 识 [1] 吴 文 俊, 中 科 院 院 士, 我 国 最 卓 越 的 现 代 数 学 家 之 一, 在 拓 扑 学 等 领 域 取 得 世 界 性 成 就, 近 年 积 极 推 动 数 学 机 械 化 领 域 的 发 展 第 1 章 目 的 是 计 算 我 们 这 本 书 描 述 了 一 门 语 言 不 幸 的 是 语 言 很 难 成 为 我 们 的 爱 好, 更 何 况 FORTRAN 语 言 也 无 法 仿 效 英 语, 能 够 被 某 些 英 语 大 师 成 功 地 转 换 为 一 种 疯 狂 因 此 几 乎 每 一 个 学 习 过 编 程 语 言 的 人 都 会 有 一 种 痛 苦 地 记 忆, 那 就 是 一 种 极 端 缺 乏 趣 味 的 痛 苦, 因 为 很 容 易 我 们 就 会 忘 记 这 种 语 言 的 用 处 显 然, 如 果 一 种 工 具 连 用 处 都 不 是 那 么 明 显 的 话, 哪 里 还 谈 得 上 给 人 带 来 乐 趣 呢? 所 以 要 想 在 FORTRAN 语 言 的 学 习 过 程 当 中 不 至 于 总 是 遭 遇 无 聊, 唯 一 的 解 救 之 途 就 是 一 开 始 就 要 找 到 学 习 它 的 绝 对 充 足 的 理 由, 并 且 在 学 习 过 程 中 还 会 不 得 不 反 复 地 依 靠 这 个 理 由, 来 说 服 自 己 需 要 更 加 有 耐 心, 更 加 能 够 忍 受 烦 琐 和 约 定, 逐 渐 地, 也 许 我 们 能 够 从 FORTRAN 语 言 的 惊 人 表 达 能 力 当 中, 体 会 到 一 种 新 的 看 待 世 界 的 角 度, 这 大 概 会 是 我 们 享 受 那 么 多 的 枯 燥 之 后,

3 所 能 够 得 到 的 最 佳 回 报 所 以 我 们 不 得 不 在 进 入 正 题 之 前, 扯 点 闲 话, 看 看 学 习 FORTRAN 的 理 由 何 在 1.1 始 于 计 算, 终 于 计 算 在 荒 莽 的 历 史 尽 头, 我 们 常 常 听 说 人 类 之 所 以 能 够 凭 借 虚 弱 的 身 躯, 一 次 又 一 次 地 打 退 其 他 凶 猛 动 物 的 猖 狂 进 攻, 而 终 于 成 就 为 今 日 当 之 无 愧 的 万 兽 之 王, 这 个 原 因 有 很 多 种 解 释, 比 如 说 是 劳 动, 说 是 手, 说 是 大 脑, 莫 衷 一 是, 各 有 各 的 理 论 和 证 据, 确 实 是 个 很 难 取 得 定 论 的 问 题, 因 此 我 想 提 出 一 种 新 的 解 释, 大 概 是 不 会 遭 到 立 刻 的 覆 灭 性 打 击 人 类 的 进 化 始 于 计 算, 我 相 信 在 有 关 非 洲 黑 猩 猩 的 纪 录 片 里 面, 可 以 看 到 黑 猩 猩 也 会 用 手 使 用 工 具, 一 个 黑 猩 猩 家 庭 为 了 生 活 也 勤 于 劳 动, 一 个 黑 猩 猩 群 落 社 会 里 面 的 形 形 色 色 的 政 治 行 为, 显 示 它 们 的 大 脑 也 不 是 很 闲, 但 有 一 次 我 看 到 黑 猩 猩 们 抢 香 蕉 时, 总 是 把 自 己 已 经 抢 到 手 的 香 蕉 给 弄 丢 了 而 无 知 觉, 突 然 觉 得 它 们 最 缺 乏 的 也 许 是 算 数 的 能 力 所 以 我 想, 人 类 的 起 源 一 定 跟 计 算 有 莫 大 的 关 系 当 然 这 些 都 是 戏 说 而 已, 不 过 如 果 说 人 类 的 科 学 是 从 计 算 开 始 的, 应 该 是 不 会 有 太 大 的 争 议 的 也 许 有 人 说 人 类 的 科 学 活 动 应 该 是 起 源 于 观 察, 但 从 动 物 行 为 学 的 角 度 来 看, 观 察 这 种 行 为 是 很 难 界 定 的, 而 计 算 则 是 非 常 好 界 定 的 行 为, 因 为 最 原 始 的 计 算 行 为 显 然 应 该 就 是 数 数 可 以 想 像, 当 人 类 开 始 意 识 到 自 我 在 这 个 世 界 的 孤 独 存 在 时, 对 于 日 月 星 辰 和 风 雨 雷 电 的 无 常 和 力 量 该 是 多 么 地 恐 惧 啊! 而 人 类 把 自 己 从 这 种 恐 惧 当 中 解 救 出 来 的 第 一 个 方 法 应 该 就 是 算 数 算 数 导 致 了 人 类 最 早 的 科 学 活 动, 即 天 文 学 和 几 何 学 人 们 从 对 日 月 星 辰 的 计 数 当 中 发 现 了 天 体 的 运 行 是 有 常 的, 而 不 是 什 么 不 可 琢 磨 的 妖 魔 鬼 怪 在 主 宰 ; 从 对 土 地 与 山 河 的 度 量 中 建 立 了 明 确 的 几 何 概 念, 从 而 对 自 己 所 生 活 的 世 界 开 始 了 真 正 的 理 解 而 这 种 理 解 活 动 一 旦 开 始, 就 无 法 停 止 了, 演 变 至 今, 就 构 成 了 我 们 人 类 最 值 得 自 豪 的 成 就 - 科 学 科 学 的 历 史 表 明 了 它 的 基 础, 就 是 计 算 如 果 我 们 只 是 一 味 地 观 察, 我 们 会 纪 录 下 来 大 量 的 经 验, 然 而 却 无 法 理 解 这 些 经 验 的 含 义, 更 进 一 步, 对 于 经 验 有 了 总 结 归 纳 之 后, 哪 怕 是 进 行 计 算 的 确 切 程 度 不 同, 也 会 导 致 不 同 的 对 于 自 然 的 理 解 一 个 很 著 名 的 例 子, 就 是 太 阳 系 行 星 的 运 动 的 问 题 对 于 古 人 来 说, 所 谓 行 星 的 意 思 就 是 那 些 星 星 是 相 对 于 恒 星 在 明 显 地 运 动, 在 漫 天 的 相 互 位 置 不 变 的 恒 星 的 对 比 之 下, 很 少 的 这 种 匆 匆 行 者 是 非 常 引 人 注 目 的 于 是 很 早 开 始 人 们 就 纪 录 这 些 行 星 的 运 行 轨 道 在 古 希 腊 时 代, 最 有 名 的 关 于 这 些 行 星 运 动 的 研 究 是 托 勒 密 完 成 的, 他 对 有 关 行 星 的 纪 录 数 据 进 行 了 计 算, 得 到 了 一 个 极 其 圆 满 的 行 星 运 动 模 型, 即 以 地 球 为 宇 宙 中 心, 行 星 围 绕 地 球 做 严 格 圆 周 运 动 现 在 看 来, 他 的 观 测 数 据 肯 定 不 会 是 很 精 确, 而 他 的 计 算 也 不 会 很 准 确, 一 直 到 开 普 勒, 在 获 得 了 非 常 精 确 的 行 星 轨 道 运 行 的 数 据 的 基 础 上, 进 行 了 大 量 的 计 算, 最 终 得 到 了 革 命 性 的 开 普 勒 三 定 律 接 下 来 牛 顿 出 场 了, 他 更 是 一 个 计 算 天 才, 正 是 通 过 计 算, 从 开 普 勒 三 定 律 获 得 了 他 的 最 伟 大 的 发 现, 万 有 引 力 定 律 然 后 还 是 通 过 计 算, 我 们 现 在 可 以 运 用 牛 顿 万 有 引 力 公 式 的 计 算 而 把 脚 印 留 到 月 球 的 寂 寞 沙

4 尘 上 还 有 一 个 非 常 独 特 的 例 子, 就 是 中 国 的 古 代 科 学 和 技 术, 更 是 强 烈 地 依 赖 计 算 相 比 于 古 希 腊, 中 国 的 古 代 数 学 几 乎 完 全 是 以 计 算 为 中 心 的, 翻 开 中 国 的 古 代 数 学 书, 一 个 鲜 明 的 特 点 就 是 几 乎 完 全 是 针 对 问 题 的 数 学 计 算 方 面 的 内 容, 而 很 少 有 古 希 腊 传 统 的 公 理, 定 理 与 证 明 实 际 上, 古 代 中 国 在 技 术 上 一 直 领 先 于 世 界, 很 难 说 跟 这 种 重 视 计 算 的 风 格 没 有 关 系 其 中 最 有 名 的 例 子 就 是 祖 冲 之 关 于 圆 周 率 的 计 算, 而 我 们 现 在 都 很 清 楚, 祖 冲 之 的 计 算 不 仅 是 为 圆 周 率 提 供 了 一 个 远 比 西 方 要 精 确 的 具 体 数 值, 更 重 要 的 是 提 供 了 一 种 非 常 通 用 的 计 算 方 法, 即 一 种 近 似 积 分 计 算, 而 这 种 计 算 方 法 对 于 古 代 中 国 的 技 术 进 步 的 重 要 作 用, 正 是 一 个 表 明 计 算 的 重 要 性 的 典 范 如 果 说 计 算 在 科 学 的 早 期 发 展 中 扮 演 了 关 键 的 作 用, 那 么 我 们 还 是 可 以 说 计 算 仍 然 在 现 代 科 学 技 术 扮 演 着 关 键 的 角 色 固 然 现 代 的 科 学 技 术 领 域 广 阔 而 渊 深, 然 而 哪 里 没 有 计 算 的 身 影 呢? 甚 至 在 某 些 科 学 哲 学 家 的 看 法 里 面, 能 否 进 行 计 算 是 衡 量 一 个 理 论 是 否 已 经 成 为 科 学 的 一 个 部 门 的 标 准 也 许 这 种 说 法 不 免 偏 激, 但 是 计 算 对 于 科 学 与 技 术 的 意 义, 确 实 是 一 个 深 刻 的 问 题 我 们 不 妨 考 察 一 下 物 理 学 里 面 计 算 所 占 据 的 地 位, 也 许 有 助 于 更 深 地 理 解 这 个 问 题 几 乎 是 一 直 到 十 九 世 纪, 物 理 学 还 是 以 实 验 为 主 要 内 容, 进 入 二 十 世 纪 之 后, 一 场 物 理 学 革 命 飞 快 地 竖 立 了 理 论 物 理 学 的 丰 碑, 足 以 与 传 统 的 实 验 物 理 学 分 庭 抗 礼 而 这 种 局 面 在 二 战 时 期 就 开 始 改 变, 二 战 后 在 实 验 物 理 与 理 论 物 理 之 外, 计 算 物 理 鼎 足 而 立, 导 致 这 种 变 局 的 最 关 键 的 因 素 就 是 电 子 计 算 机 的 发 明 在 计 算 机 没 有 发 明 之 前, 人 们 不 得 不 采 取 各 种 方 式 来 回 避 过 于 庞 大 的 计 算 问 题, 而 大 量 的 关 键 问 题, 又 非 得 进 行 庞 大 的 计 算 不 可, 以 物 理 学 为 例, 一 旦 我 们 透 彻 地 解 决 了 线 性 问 题 之 后, 接 踵 而 来 的 就 是 远 比 线 性 现 象 更 为 广 泛 的 非 线 性 现 象, 对 于 非 线 性 问 题, 我 们 已 经 掌 握 的 解 析 方 法 极 其 贫 乏, 这 就 逼 迫 我 们 走 上 直 接 计 算 之 路 而 除 了 非 线 性 问 题 之 外, 物 理 学 乃 至 整 个 自 然 科 学 看 待 世 界 的 方 式 都 是 原 子 式 的, 即 我 们 总 是 可 以 把 一 个 现 象 理 解 为 它 的 组 成 成 分 的 相 互 作 用 的 结 果, 于 是 我 们 就 有 了 分 子, 原 子 等 基 本 的 科 学 观 念, 这 种 做 法 一 直 都 是 充 满 胜 利 的, 然 而 这 种 胜 利 也 是 伴 随 着 沉 重 代 价 的, 即 当 我 们 重 新 面 对 复 杂 现 象 时, 不 得 不 从 它 的 组 成 成 分 开 始 考 虑, 这 就 是 统 计 物 理 学 的 基 本 思 想, 显 然 这 种 做 法 给 我 们 带 来 了 繁 重 的 计 算 任 务, 因 为 迄 今 为 止, 我 们 人 类 对 于 一 个 包 含 超 过 了 3 个 的, 具 有 相 互 作 用 的 成 员 的 系 统 的 精 确 解 析 求 解, 已 经 是 有 点 一 筹 莫 展 了, 更 何 况 常 见 的 那 些 动 辄 包 含 了 成 千 上 万 成 员 的 系 统 呢? 因 此 在 很 大 一 部 分 情 况 下, 我 们 唯 一 的 选 择, 就 是 直 接 的 计 算 因 此 我 们 可 以 说, 计 算 确 实 是 科 学 的 基 石 之 一 至 于 我 们 所 生 活 的 这 个 几 乎 完 全 由 科 学 技 术 所 塑 造 的 世 界, 哪 里 没 有 计 算 的 身 影 呢? 如 果 说 计 算 帮 助 我 们 理 解 了 自 然, 进 一 步 我 们 还 可 以 说 计 算 创 造 了 我 们 的 生 活 任 何 一 个 科 学 上 的 对 于 自 然 的 新 的 理 解, 要 转 变 为 为 人 所 用 的 技 术 时, 基 本 的 途 径 就 是 计 算 道 理 很 显 然, 当 我 们 要 制 造 一 种 自 然 界 从 未 出 现 过 的 物 品 时, 我 们 需 要 的 是 具 体 的 制 造 数 据, 而 不 能 只 是 一 堆 公 式, 那 么 数 据 从 哪 里 来 呢? 当 然 只 能 从 对 公 式 的 计 算 得 来 因 此 我 们 可 以 把 计 算 理 解 为 理 论 的 实 现 途 径 即 理 论 无 论 是 要 反 映 真 实 世 界, 还 是 要 体 现 到 我 们 的 实 际 物 品 上, 它 都 需 要 通 过 一 条 叫 计 算 的 路, 理 论 武 装 了 我 们 的 大 脑, 而 计 算 则 创 造 了 我 们 的 世 界 所 以 我 们 可 以 说, 人 类 的 历 史, 最 早 是 始 于 计 算, 而 这 个 历 史 的 实 现 的 最 前 沿, 则 仍 然 是 终 于 计 算

5 1.2 描 述 计 算 的 语 言 长 久 以 来, 人 类 的 计 算 都 是 依 靠 自 己 来 完 成 的, 但 如 果 仔 细 考 虑 一 下, 就 会 发 现 计 算 的 实 质 是 把 一 个 经 过 清 楚 的 分 析, 明 确 了 求 解 的 方 法 的 问 题, 分 解 为 明 确, 可 行, 而 有 限 的 步 骤, 显 然 这 种 工 作 本 质 上 是 机 械 性 的, 如 果 把 已 经 得 到 求 解 方 法 的 问 题 还 交 给 人 脑 来 计 算, 显 然 有 浪 费 人 力 之 嫌 ; 从 另 外 一 个 方 面 来 讲, 往 往 一 个 需 要 专 门 加 以 计 算 的 问 题, 也 是 一 个 需 要 进 行 庞 大 的 计 算 的 问 题, 庞 大 到 人 力 已 经 难 以 胜 任 的 程 度 因 此 这 两 个 方 面 都 要 求 人 类 发 明 能 够 进 行 计 算 的 机 器, 这 就 直 接 导 致 了 计 算 机 的 发 明 今 天 当 我 们 面 临 需 要 计 算 的 问 题 时, 对 付 问 题 的 就 不 再 只 是 一 个 大 脑, 而 是 一 个 大 脑 加 上 一 台 机 器 所 以 接 下 来 的 问 题 就 是 如 何 让 大 脑 与 计 算 机 协 同 工 作, 使 得 大 脑 能 够 专 门 用 来 寻 求 问 题 的 算 法, 而 计 算 机 能 够 被 用 来 计 算 解 这 种 协 同 工 作 的 第 一 个 要 求 就 是 人 需 要 能 够 把 自 己 对 于 问 题 的 计 算 过 程 的 理 解 表 示 为 机 器 的 机 械 运 动 首 先 人 对 于 问 题 及 其 求 解 的 理 解 是 可 以 非 常 清 晰 地 依 靠 数 学 语 言 来 加 以 描 述 说 明 的 然 后 我 们 再 看 机 器 那 一 端 所 谓 计 算 机 就 是 能 够 自 动 执 行 一 系 列 机 器 动 作 的 机 器, 对 于 那 些 机 器 动 作, 我 们 可 以 把 它 们 和 基 本 的 计 算 操 作 对 应 起 来, 这 就 使 得 有 可 能 把 计 算 问 题 的 能 行 的 计 算 步 骤 分 解 为 有 限 的 机 器 操 作, 这 里 剩 下 的 问 题 就 是 一 方 面 是 我 们 熟 知 的 描 述 问 题 求 解 的 数 学 语 言, 另 一 方 面 就 是 描 述 机 器 操 作 的 语 言, 这 两 个 方 面 的 语 言 如 何 对 应 的 问 题 下 面 我 们 讨 论 一 个 非 常 简 单 的 例 子, 用 来 说 明 这 里 面 的 语 言 翻 译 问 题 一 个 一 元 二 次 方 程 的 求 解 是 一 个 很 简 单 的 数 学 问 题 设 方 程 的 形 式 为 : 2 ax bx c a + + = 0, 0 那 么 方 程 的 解 的 一 般 公 式 为 : x 1 = + 2 b b 4a 2a c x 2 = 2 b b 4ac 2a 注 意 我 们 现 在 的 目 的 是 计 算, 而 不 是 求 解 析 解, 因 此 得 到 这 个 公 式 不 是 问 题 的 结 束, 而 是 问 题 的 开 始, 即 运 用 这 个 公 式, 在 a,b,c 都 有 具 体 取 值 的 情 况 下, 求 出 具 体 的 数 值 解 因 为 如 果 该 方 程 描 述 的 是 一 个 抛 体 运 动, 那 么 我 们 需 要 知 道 的 当 然 是 解 的 数 值, 以 便 我 们 了 解 和 控 制 该 抛 体 运 动 所 以 我 们 还 需 要 进 一 步 把 这 个 数 学 表 述 转 述 为 一 个 具 体 的 求 值 过 程 的 描 述 如 下 : (1) 获 得 a,b,c 的 具 体 取 值 ; 2 (2) 根 据 a,b,c 的 具 体 取 值 计 算 b 4ac 的 值 ; 2 (3) 如 果 b 4ac大 于 0, 那 么 分 别 计 算 上 面 的 两 个 公 式 的 数 值, 得 到 两 个 不 同 的 实 数 根 ; (4) 如 果 b 2 x 4ac=0, 那 么 计 算 公 式 b = 2a, 得 到 的 x 的 值 就 是 方 程 的 两 个 相 同 的 根 ;

6 2 (5) 如 果 b 4ac小 于 0, 那 么 分 别 计 算 上 面 的 两 个 公 式 的 数 值, 得 到 两 个 不 同 的 复 数 根 这 样 得 到 的 上 面 的 5 个 计 算 步 骤 描 述, 才 是 希 望 计 算 机 所 执 行 的 计 算 过 程 的 一 个 大 概 描 述 当 然 这 个 描 述 是 基 于 我 们 已 经 获 得 的 对 于 一 元 二 次 方 程 的 求 解 问 题 的 数 学 上 的 彻 底 了 解 那 么 描 述 计 算 机 的 操 作 的 语 言 是 什 么 样 的 形 式 呢? 我 们 知 道 所 谓 计 算 机 的 工 作 在 本 质 上 是 运 行 一 些 基 本 的 机 械 电 子 操 作, 固 然 我 们 可 以 把 那 些 操 作 根 据 运 算 法 则 而 定 义 为 相 应 的 运 算, 例 如 一 个 开 关 电 路 的 信 号 叠 加, 可 以 适 当 地 定 义 为 二 进 制 数 值 的 加 法, 但 显 然 不 可 能 期 望 依 靠 这 种 物 理 现 象 能 够 直 接 地 表 达 更 加 复 杂 的 计 算, 例 如 上 面 公 式 里 面 的 开 平 方 幸 好 我 们 依 靠 数 学, 可 以 做 到 把 任 何 复 杂 的 计 算 分 解 或 近 似 分 解 为 极 少 数 简 单 计 算 的 叠 加 与 组 合 因 此 最 终 我 们 已 经 至 少 在 理 论 上 可 以 期 望 使 用 计 算 机 来 完 成 那 些 具 有 明 确 求 解 过 程 的 计 算 任 务 然 而 问 题 是 当 我 们 需 要 向 计 算 机 提 交 一 个 数 值 计 算 任 务 时, 如 果 总 是 要 求 我 们 首 先 把 计 算 任 务 的 描 述 按 照 计 算 机 所 能 够 理 解 和 执 行 的 程 度 来 进 行 的 话, 无 疑 会 使 得 向 计 算 机 提 交 计 算 任 务 成 为 一 件 极 其 麻 烦 的 事 情, 本 来 我 们 利 用 计 算 机 的 目 的 是 为 了 减 轻 自 己 的 机 械 劳 动 工 作 量, 如 果 向 计 算 机 提 交 问 题 是 如 此 麻 烦 的 话, 显 然 不 符 合 我 们 发 明 计 算 机 的 初 衷 因 此 进 入 二 十 世 纪 五 十 年 代 后, 提 出 了 计 算 机 高 级 语 言 的 概 念, 所 谓 高 级 语 言, 就 是 非 常 接 近 我 们 平 常 对 于 数 学 问 题 的 描 述 的 语 言, 而 所 谓 给 出 计 算 机 高 级 语 言, 实 质 上 并 不 是 说 计 算 机 能 够 直 接 理 解 高 级 语 言 了, 而 是 把 高 级 语 言 到 计 算 机 内 部 的 机 器 语 言 的 翻 译 工 作 本 身 交 给 计 算 机 来 完 成, 因 为 这 种 翻 译 工 作 在 规 范 了 高 级 语 言 之 后, 是 计 算 机 自 身 就 完 全 可 以 做 到 的, 当 然 这 个 翻 译 任 务 本 身 又 是 一 个 需 要 我 们 首 先 明 确 给 出 一 般 解 答 的 计 算 问 题 世 界 上 第 一 个 诞 生 的 计 算 机 高 级 语 言 就 是 我 们 在 这 本 书 里 要 给 出 的 FORTRAN FORTRAN 最 早 是 IBM 公 司 在 1957 给 出 的, 专 门 用 于 向 IBM 自 己 生 产 的 704 计 算 机 提 交 表 述 计 算 问 题 的 一 个 计 算 问 题 的 求 解 过 程 如 果 使 用 了 计 算 机 语 言 来 表 述, 就 称 为 一 个 程 序, FORTRAN 正 是 这 样 一 种 专 门 用 来 写 程 序 的 语 言 由 于 IBM 的 709 计 算 机 的 成 功, 同 时 也 使 得 FORTRAN 获 得 了 广 泛 的 传 播, 这 时 FORTRAN 的 语 言 本 性 开 始 在 另 外 一 个 方 面 显 示 了 出 来, 即 语 言 的 生 命 就 在 于 它 的 传 播 于 是 大 多 数 其 它 计 算 机 制 造 商 也 纷 纷 使 得 他 们 的 产 品 能 够 输 入 和 理 解 FORTRAN 语 言 FORTRAN 语 言 从 它 的 名 称 来 源 就 可 以 知 道 是 一 种 与 某 些 特 定 机 器 进 行 通 讯 的 语 言 工 具 即 FORTRAN 语 句 可 以 通 过 特 定 的 机 器 上 配 置 的 编 译 程 序 而 翻 译 成 机 器 语 言, 因 此 早 期 的 FORTRAN 语 言 具 有 强 烈 的 与 机 器 系 统 相 关 的 一 些 特 征, 它 们 反 映 了 那 些 特 定 机 器 的 某 些 特 点, 显 然 如 果 考 虑 到 高 级 语 言 的 本 质 是 要 用 来 描 述 计 算 过 程, 即 所 谓 算 法 语 言, 那 么 这 些 与 机 器 相 关 的 特 征 是 没 有 意 义 的, 而 FORTRAN 不 断 更 新 版 本 所 带 来 的 进 步, 也 就 包 含 了 不 断 舍 弃 这 种 特 征 的 目 的 在 内 FORTRAN 的 这 种 历 史 痕 迹 的 一 个 例 子 就 是 把 语 言 用 那 些 特 定 机 器 所 能 接 受 的 字 符 序 列 ( 亦 就 是 IBM 公 司 用 来 向 计 算 机 输 入 程 序 的 卡 片 穿 孔 设 备 的 48 个 字 符 ) 来 定 义. 而 它 的 那 种 卡 片 输 入 方 式 决 定 了 很 多 的 程 序 书 写 格 式 例 如 通 常 把 语 言 中 的 一 个 语 句 写 在 一 个 记 录 上, 也 就 对 应 着 穿 孔 的 一 张 卡 片 ; 各 个 语 句 按 顺 序 读 入, 对 应 着 卡 片 的 顺 序 读 入 ; 卡 片 的 格 式 是 固 定 的, 构 成 后 来 所 谓 的 固 定 源 码 形 式 这 就 是 最 初 提 出 计 算 机 高 级 语 言 时 我 们 所 拥 有 的 第 一 种 高 级 语 言 的 状 况 不 久 降 生 的 另 外 一 种 高 级 语 言 是 ALGOL, 这 个 名 称 就 是 算 法 语 言 的 简 称, 因 此 可 以 预 料 到 这 种 语 言 具 有 与 FORTRAN 非 常 不 同 的 面 貌, 因 为 这 种 语 言 在 设 计 初 始, 就 不 是 计 算 机 制 造 公 司 为 某 种 特 定 机 器 设 计 的, 而 是 纯 粹 面 向 描 述 计 算 过 程 的, 也 就 是 所 谓 面 向 算 法 描 述 的

7 ALGOL 最 早 是 在 1958 年 由 德 意 志 联 邦 共 和 国 应 用 数 学 与 力 学 协 会 提 出 的 ALGOL 的 设 计 目 标 显 然 比 FORTRAN 要 来 得 高 远, 它 希 望 不 仅 能 够 用 于 人 对 机 器 转 述 计 算 过 程, 也 希 望 能 够 直 接 用 于 人 与 人 之 间 的 对 于 算 法 的 描 述 为 了 实 现 这 个 通 用 的 目 的,ALGOL 的 字 符 不 是 针 对 任 一 具 体 机 器 定 义 的, 因 此 它 不 反 映 任 何 一 台 特 定 机 器 的 特 性 实 际 上 ALGOL 所 使 用 的 字 符 与 词 汇 完 全 是 独 立 定 义 的 除 此 之 外 ALGOL 还 具 有 许 多 更 加 独 特 的 性 质 不 过 语 言 终 久 摆 脱 不 了 它 的 市 场 属 性, 由 于 FORTRAN 更 加 具 有 市 场 侵 占 能 力, 最 终 FORTRAN 至 今 还 是 主 流 的 科 学 计 算 编 程 语 言, 而 ALGOL 语 言 则 不 幸 成 为 了 任 人 凭 吊 的 古 董 1.3 为 什 么 选 择 FORTRAN 到 底 选 择 什 么 样 的 语 言, 本 身 是 一 类 非 常 具 有 争 议 性 的 问 题 曾 几 何 时, 在 科 学 计 算 领 域, 就 沸 沸 腾 腾 地 讨 论 过 最 好 使 用 什 么 样 的 语 言 也 许 我 们 可 以 说 这 是 一 个 见 仁 见 智 的 问 题, 因 为 我 们 作 为 语 言 的 使 用 者, 总 是 拣 自 己 已 经 很 熟 悉 的 语 言, 当 然 总 是 自 己 能 够 很 好 驾 驭 的 语 言 是 最 好 的 但 是 具 体 地 针 对 科 学 计 算 来 说, 由 于 科 学 计 算 问 题 具 有 自 身 的 独 特 的 价 值 标 准, 在 这 个 价 值 标 准 之 下, 各 种 不 同 的 语 言 还 是 可 以 进 行 客 观 比 较 的 首 先 我 们 得 把 自 己 面 临 的 任 务 界 定 清 楚, 也 就 是 什 么 是 科 学 计 算 问 题? 所 谓 科 学 计 算 问 题 大 体 上 包 括 如 下 三 个 涵 义 : 问 题 本 身 以 及 问 题 的 解 答 都 能 够 使 用 数 学 语 言 予 以 精 确 描 述 ; 如 果 要 使 用 通 常 的 数 学 方 法 来 给 出 我 们 所 需 要 的 数 值 答 案, 会 很 麻 烦 或 者 根 本 无 法 给 出 ; 问 题 以 一 定 的 科 学 与 技 术 知 识 作 为 背 景 我 们 会 看 到 正 是 科 学 计 算 问 题 的 这 种 内 涵 决 定 了 它 在 选 择 计 算 语 言 时 所 具 有 的 价 值 标 准 首 先, 一 个 科 学 计 算 问 题 总 是 要 以 一 个 数 学 计 算 问 题 的 形 式 出 现, 因 此 描 述 科 学 计 算 问 题 的 语 言 应 该 能 够 自 然 地 描 述 数 学 问 题, 即 要 求 编 程 语 言 和 数 学 语 言 在 表 达 方 式 上 具 有 比 较 直 接 自 然 的 对 应 关 系 然 后 一 个 科 学 计 算 问 题 之 所 以 需 要 使 用 计 算 机, 那 肯 定 是 因 为 这 个 问 题 具 有 一 定 的 计 算 量, 那 么 程 序 的 运 行 效 率 往 往 是 选 择 语 言 时 最 重 要 的 考 量 因 素 正 是 在 这 两 点 上,FORTRAN 是 现 在 众 多 语 言 当 中 的 绝 对 胜 出 者 在 描 述 数 学 语 言 的 自 然 性 方 面, FORTRAN 可 以 说 比 现 在 还 活 着 的 任 何 语 言 都 强 当 然 在 历 史 上 曾 经 出 现 过 象 ALGOL 那 样 的 相 当 数 学 化 的 语 言, 可 惜 的 是 它 缺 乏 市 场 生 存 能 力, 所 以 就 只 剩 下 FORTRAN 独 美 于 今 了 FORTRAN 擅 长 描 述 数 学 计 算, 这 点 应 该 是 几 乎 没 有 什 么 争 议 的 也 正 是 由 于 这 个 缘 故,FORTRAN 的 易 学 是 公 认 的 任 何 一 个 科 技 专 业 人 员, 只 要 对 于 一 个 具 体 问 题 的 数 学 求 解 过 程 有 明 晰 的 概 念, 要 把 这 个 求 解 过 程 翻 译 为 FORTRAN 语 言 是 非 常 轻 松 的 至 于 执 行 速 度 方 面, 则 常 常 有 些 似 是 而 非 的 说 法 误 导 初 学 者 最 典 型 的 一 个 错 误 观 念 就 是 C 代 码 的 执 行 速 度 最 快 这 个 说 法 来 源 于 C 语 言 的 特 殊 性, 因 为 C 语 言 更 多 的 是 一 种 系 统 编 程 语 言, 对 硬 件 的 控 制 能 力 很 强, 在 高 级 语 言 里 面 无 出 其 右 者, 于 是 给 人 以 C 程 序 的 速 度 必 定 最 快 的 印 象 但 是 忘 记 了 这 个 速 度 快 是 来 自 C 语 言 的 系 统 编 程 特 性, 而 在 做 科 学 计 算 时, 并 不 需 要 过 多 地 涉 及 到 系 统 内 核, 因 此 C 语 言 的 长 处 在 科 学 计 算 方 面 可 以 说 并 不 能 适 当 地 发 挥, 相 反, 在 数 值 计 算 方 面,C 绝 对 不 是 FORTRAN 的 对 手, 因 为 相 对 于 C 以 系 统 编 程 为 目 的,FORTRAN 是 以 科

8 学 计 算 为 目 的 的, 语 言 本 身 在 设 计 之 初, 就 考 虑 到 了 针 对 科 学 计 算 而 进 行 优 化, 因 此 FORTRAN 生 成 的 可 执 行 代 码 是 高 度 优 化 的 实 际 的 运 行 效 率 方 面 的 比 较 也 表 明 了 FORTRAN 在 科 学 计 算 方 面 的 优 越 性 无 论 是 国 内 还 是 国 外, 也 无 论 是 经 典 的 串 行 机 还 是 并 行 矢 量 机, 大 量 的 经 验 表 明, 在 执 行 同 一 个 科 学 计 算 任 务 时, C 或 C++ 代 码 的 效 率 都 低 于 FORTRAN 代 码, 除 了 常 见 的 对 于 C 有 着 高 效 的 迷 信 之 外, 还 常 常 有 着 对 于 FORTRAN 是 如 何 如 何 落 后 的 偏 见 当 然 这 种 偏 见 是 有 来 源 的, 那 就 是 曾 经 功 勋 卓 著 的 FORTRAN 77 在 很 长 一 段 时 间 里 面, 都 缺 乏 进 取 心, 使 得 迄 今 很 多 人 提 起 FORTRAN, 想 到 的 就 是 在 当 今 时 代 已 经 显 得 非 常 落 后 的 FORTRAN 77 实 质 上,FORTRAN 标 准 在 进 入 FORTRAN 90 时 代 之 后, 特 别 是 现 时 的 FORTRAN 95 版 本, 可 以 说 只 要 是 对 于 科 学 计 算 有 用 的 特 性,C 和 C++ 有 的, 现 在 FORTRAN 95 绝 对 不 缺, 而 反 过 来 FORTRAN 95 所 具 有 的 很 多 针 对 科 学 计 算 的 特 性, 却 是 C 和 C++ 所 不 具 有 的 哪 怕 是 C++ 最 引 以 为 傲 的 面 向 对 象 性 质,FORTRAN 2000 也 将 全 面 引 入 所 以 说,FORTRAN 已 经 完 全 赶 上 了 编 程 语 言 的 潮 流 与 程 序 运 行 的 效 能 有 关 的 另 外 一 个 重 要 方 面, 是 程 序 语 言 能 否 支 持 程 序 的 并 行 运 行, 在 这 点 上, 可 以 说 FORTRAN 表 现 了 它 的 最 大 优 势, 因 为 FORTRAN 95 正 是 着 力 于 获 得 并 行 计 算 的 能 力 的 一 个 版 本 由 于 现 代 科 学 计 算 的 规 模 越 来 越 大, 计 算 并 行 化 是 一 条 不 得 不 走 的 路 线, 现 代 计 算 机 硬 件 的 发 展, 也 使 得 并 行 化 具 有 实 际 的 普 及 前 景, 因 为 不 仅 专 门 的 大 型 计 算 机 是 并 行 的, 现 在 的 一 般 PC 都 可 以 拥 有 多 个 处 理 器, 因 此 现 代 的 从 事 科 学 计 算 的 用 户 不 得 不 掌 握 并 行 化 计 算 的 编 程 能 力 但 是 进 行 并 行 化 编 程 所 遇 到 的 一 个 主 要 问 题, 就 是 任 何 过 程 编 程 语 言 都 内 在 地 使 用 线 性 存 储 模 式, 也 就 是 一 个 数 组 的 元 素 总 是 被 认 为 按 照 数 组 元 素 的 先 后 顺 序 而 连 续 地 存 储 在 内 存 单 位 里 面, 这 样 一 种 模 式 就 决 定 了 这 样 的 过 程 编 程 语 言 无 法 真 正 地 实 现 对 并 行 计 算 的 描 述 而 FORTRAN 95 则 完 全 改 观 了 这 种 制 约, 因 为 在 FORTRAN 95 里 面 对 于 数 组 以 及 数 组 运 算 建 立 了 全 新 的 面 向 并 行 化 计 算 的 概 念, 诸 如 纯 过 程 的 概 念, 逐 元 过 程 的 概 念,FORALL 结 构 等 等, 都 有 效 地 摆 脱 了 线 性 存 储 模 式 的 制 约, 使 得 FORTRAN 95 成 为 描 述 并 行 计 算 的 标 准 语 言, 特 别 是 那 些 专 用 的 数 据 并 行 化 语 言 都 纷 纷 采 用 FORTRAN 作 为 基 础 语 言, 例 如 高 性 能 FORTRAN(High Performance Fortran),Fortran D,Vienna Fortran, 以 及 CRAFT 等 这 样 就 使 得 使 用 FORTRAN 95 编 写 的 程 序 可 以 直 接 在 这 些 数 据 并 行 化 语 言 的 平 台 上 运 行, 而 反 过 来 使 用 这 些 专 用 语 言 编 写 的 程 序 也 可 以 毫 不 困 难 地 转 移 到 FORTRAN 95 平 台 上 运 行, 这 样 一 种 局 面 使 得 FORTRAN 在 并 行 计 算 领 域 独 领 风 骚 综 上 所 述, 我 们 完 全 可 以 说 FORTRAN 95 是 进 行 科 学 计 算 的 最 佳 语 言, 作 为 需 要 进 行 科 学 计 算 的 科 学 与 技 术 领 域 的 工 作 人 员, 掌 握 FORTRAN 95 远 比 掌 握 C,C++ 等 语 言 要 重 要 得 多, 至 于 那 些 计 算 机 符 号 代 数 与 数 值 计 算 软 件, 例 如 MATHEMATICA,MAPLE,MATLAB,Macsyma, MATHCAD 等 等, 只 能 说 是 进 行 科 学 计 算 的 教 学 模 型 与 辅 助 工 具, 由 于 它 们 都 提 供 了 现 成 的 算 法, 因 此 可 以 使 得 初 学 者 能 够 应 用 于 一 些 简 单 的 场 合, 真 正 要 用 它 们 来 对 付 稍 微 大 一 点 的 问 题, 有 经 验 的 用 户 都 知 道, 那 会 是 一 件 非 常 痛 苦 的 强 人 所 难 的 事 情 因 此 最 终 要 自 由 地 进 行 科 学 计 算, 则 非 FORTRAN 莫 属 1.4 FORTRAN 的 进 步 下 面 我 们 介 绍 一 下 FORTRAN 在 历 史 上 所 取 得 的 重 要 进 步, 特 别 是 FORTRAN 95 有 别 于

9 FOR TRAN 90 的 特 征, 更 能 够 引 导 我 们 走 向 高 性 能 的 FORTRAN 并 行 编 程 的 领 域 FORTRAN 95 的 进 步 FORTRAN 的 每 一 个 进 步, 都 意 味 着 要 把 很 多 的 语 言 特 征 归 结 为 三 类 : 新 的 语 言 特 征 ; 顾 名 思 义, 就 是 FORTRAN 最 新 版 本 引 入 的 全 新 语 言 过 时 的 语 言 特 征 ; 就 是 暂 时 在 最 新 的 FORTRAN 标 准 里 面 仍 然 可 以 使 用, 而 不 会 出 现 不 兼 容 的 情 形, 但 是 被 指 明 为 过 时 的 语 言 特 征, 是 在 未 来 的 下 一 个 FORTRAN 版 本 里 面 将 要 被 淘 汰 的 部 分 废 弃 的 语 言 特 征 顾 名 思 义, 就 是 在 过 去 的 FORTRAN 版 本 里 面 曾 经 出 现 过, 但 在 现 在 的 版 本 里 面 已 经 不 许 使 用 的 语 言 特 征 下 面 分 别 介 绍 它 们 新 的 语 言 特 征 FORTRAN 95 所 增 加 的 新 的 语 言 成 分 包 括 全 新 的 功 能 和 对 旧 有 功 能 的 改 进 两 个 部 分 它 们 主 要 包 括 : FORALL 语 句 与 结 构 纯 (PURE) 过 程 逐 元 (ELEMENTAL) 过 程 WHERE 结 构 的 扩 展 默 认 初 始 化 NULL 固 有 函 数 CPU_TIME 固 有 子 例 行 程 序 固 有 函 数 CEILING,FLOOR,MAXLOC,MINLOC 的 扩 展 可 分 配 数 组 的 动 态 去 分 配 名 称 列 表 输 入 里 面 的 注 释 最 小 域 宽 格 式 说 明 用 于 支 持 IEEE 754/854 浮 点 运 算 标 准 的 某 些 修 改 下 面 分 别 予 以 说 明 1. FORALL 语 句 与 结 构 FORALL 语 句 与 结 构 和 纯 过 程 这 两 个 新 的 语 言 成 分, 主 要 是 为 了 提 高 在 多 处 理 器 系 统 上 面 的 程 序 并 行 运 行 效 率 而 引 进 的 只 要 系 统 支 持 并 行 的 赋 值,FORALL 语 句 以 及 结 构, 就 能 够 自 然 地 实 现 对 一 个 庞 大 的 数 组 的 所 有 元 素 进 行 同 时 赋 值, 从 而 充 分 地 利 用 了 系 统 的 并 行 效 能 这 个 新 特 征 的 引 入 充 分 显 示 了 FORTRAN 在 并 行 运 算 方 面 的 努 力 2. 纯 (PURE) 过 程 PURE 是 一 个 完 全 新 引 入 的 过 程 属 性 具 有 PURE 属 性 的 函 数 或 子 例 行 程 序, 除 了 返 回 值 之 外, 将 不 具 有 任 何 的 后 效 也 就 是 说, 对 于 它 的 任 意 变 元 或 全 局 变 量, 它 都 不 改 变 它 们 的 值, 指

10 针 关 联 状 态, 以 及 数 据 映 射, 也 不 执 行 输 入 输 出 在 FORTRAN 95 标 准 里 面, 一 些 场 合 要 求 其 中 的 过 程 必 须 具 有 PURE 属 性 特 别 地 PURE 属 性 对 于 应 用 FORALL 语 句 或 结 构 进 行 并 行 赋 值 是 必 要 条 件 3. 逐 元 (ELEMENTAL) 过 程 逐 元 过 程 同 样 是 执 行 并 行 运 算 的 强 大 工 具 把 一 个 逐 元 过 程 应 用 到 一 个 数 组, 就 把 这 个 针 对 数 组 的 运 算 转 化 为 对 数 组 的 所 有 元 素 的 单 个 的 运 算, 所 有 单 个 的 结 果 再 组 合 起 来, 返 回 一 个 同 样 形 状 的 数 组 4. WHERE 结 构 的 扩 展 WHERE 结 构 经 过 扩 展, 可 以 包 含 一 个 FORALL 结 构 的 嵌 套, 而 FORALL 结 构 又 可 以 包 含 WHERE 语 句 或 结 构 的 嵌 套 两 者 的 配 合 使 用 具 有 强 大 的 功 能 5. 默 认 初 始 化 默 认 初 始 化 可 以 应 用 于 派 生 类 型, 包 括 哑 元, 这 样 就 能 保 证 具 有 指 针 成 员 的 派 生 类 型 对 象 能 够 一 直 可 以 访 问 从 而 避 免 了 出 现 内 存 可 分 配, 但 是 不 能 去 分 配 的 情 形 对 于 指 针, 可 以 使 用 新 的 固 有 函 数 NULL 来 给 出 初 始 的 关 联 状 态, 也 可 以 在 使 用 数 据 之 前, 使 用 NULLIFY 语 句 来 获 得 初 始 化 6. NULL 固 有 函 数 新 引 入 的 固 有 函 数 NULL 的 功 能 主 要 是 给 指 针 赋 予 一 个 初 始 的 去 关 联 的 关 联 状 态 NULL 函 数 可 以 在 一 个 类 型 声 明 语 句 当 中 使 用, 给 定 一 个 指 针 的 初 始 去 关 联 状 态, 也 可 以 在 一 个 结 构 构 造 器 里 面 使 用, 用 来 给 定 其 中 指 针 成 员 的 初 始 去 关 联 状 态 7. CPU_TIME 固 有 子 例 行 程 序 固 有 函 数 CPU_TIME 用 来 测 量 一 个 程 序 或 一 段 代 码 所 消 耗 的 处 理 器 时 间 这 个 函 数 的 测 量 结 果 不 一 定 是 非 常 准 确 的, 但 在 一 些 情 形 下 是 非 常 有 用 的 例 如 用 来 比 较 不 同 代 码 的 运 行 时 间, 从 而 比 较 它 们 的 效 率 ; 也 可 以 用 来 检 测 一 个 并 行 程 序 是 不 是 真 正 地 把 一 个 变 元 作 为 一 个 数 组 来 并 行 处 理, 从 而 评 价 它 的 并 行 效 率 8. 固 有 函 数 CEILING,FLOOR,MAXLOC,MINLOC 的 扩 展 在 FORTRAN 90 和 高 性 能 FORTRAN 之 间, 某 些 固 有 函 数 以 及 相 关 函 数 存 在 某 些 不 兼 容, 因 为 在 高 性 能 FORTRAN 里 面, 在 不 同 的 变 元 位 置 增 加 了 一 个 DIM 函 数 在 FORTRAN 95 里 面, 就 放 松 了 对 于 变 元 顺 序 的 要 求, 这 样 在 变 元 序 列 当 中 MASK 和 DIM 的 出 现 就 可 以 是 任 意 的 了, 从 而 保 证 了 FORTRAN 95 与 高 性 能 FORTRAN 的 兼 容 性 9. 可 分 配 数 组 的 动 态 去 分 配 在 FORTRAN 95 里 面, 当 退 出 一 个 给 定 的 作 用 域 时, 其 中 没 有 通 过 使 用 SAVE 而 得 到 保 留 的 可 分 配 数 组, 就 自 动 地 去 分 配, 和 使 用 DEALLOCATE 语 句 的 效 果 一 样 这 样 就 可 以 防 止 可 能 发 生 的 内 存 遗 漏, 从 而 规 范 分 配 过 程 10. 名 称 列 表 输 入 里 面 的 注 释 在 名 称 列 表 输 入 纪 录 当 中 可 以 使 用 注 释, 从 而 方 便 了 用 户

11 11. 最 小 域 宽 格 式 说 明 在 使 用 数 值 的 格 式 输 出 的 时 候, 运 用 增 强 的 输 出 格 式 编 辑 描 述 符, 就 可 以 对 域 宽 进 行 极 小 化, 从 而 避 免 输 出 时 的 白 边 12. 用 于 支 持 IEEE 754/854 浮 点 运 算 标 准 的 某 些 修 改 在 所 有 以 前 的 FORTRAN 版 本 里 面, 都 不 区 分 +0. 和 -0., 即 正 0 和 负 0, 在 FORTRAN 95 版 本 里 面, 就 能 够 区 分 这 两 者 了, 即 在 使 用 SIGN 函 数 时, 可 以 通 过 让 第 一 个 变 元 为 0, 而 第 二 个 变 元 为 负 号, 就 得 到 负 过 时 的 语 言 特 征 FORTRAN 95 里 面 被 划 归 为 过 时 的 语 言 特 征, 在 FORTRAN 90 里 面 还 是 允 许 正 常 使 用 的, 但 是 在 FORTRAN 95 里 面 已 经 强 烈 地 不 提 倡 使 用, 因 为 它 们 在 下 一 个 FORTRAN 版 本 里 面 会 被 彻 底 淘 汰 这 些 过 时 的 语 言 特 征 主 要 包 括 : 算 术 IF 语 句 DO 终 止 的 某 些 形 式 替 代 返 回 计 算 GO TO 语 句 语 句 函 数 可 执 行 语 句 之 间 的 DATA 语 句 哑 长 度 字 符 函 数 固 定 源 码 形 式 字 符 型 声 明 里 面 的 CHARACTER* 形 式 下 面 分 别 说 明, 并 特 别 要 注 意 它 们 为 什 么 是 多 余 的 或 容 易 产 生 错 误 的 1. 算 术 IF 语 句 算 术 IF 语 句 的 功 能 完 全 可 以 通 过 使 用 IF 语 句 或 IF 结 构 来 替 代 2. DO 终 止 的 某 些 形 式 共 享 DO 终 止, 或 者 不 是 使 用 END DO 语 句 或 CONTINUE 语 句 的 DO 终 止 都 是 过 时 的, 无 论 是 从 安 全 的 角 度, 还 是 从 清 晰 的 角 度, 都 最 好 使 用 具 有 不 带 标 签 的 END DO 语 句 的 DO 结 构 块 形 式 3. 替 代 返 回 替 代 返 回 强 烈 地 依 赖 标 签, 是 不 值 得 提 倡 的, 而 且 同 样 的 功 能 完 全 可 以 通 过 CASE 结 构 来 实 现 4. 计 算 GO TO 语 句 计 算 GO TO 语 句 完 全 可 以 使 用 CASE 结 构 来 代 替, 而 且 CASE 结 构 还 具 有 比 计 算 GO TO 语 句 更 加 广 泛 的 功 能 从 结 构 化 编 程 的 角 度 来 看, 也 应 该 使 用 CASE 结 构, 而 不 是 完 全 非 结 构 化 的, 带 有 早 期 与 系 统 相 关 特 征 的 计 算 GO TO 语 句 5. 语 句 函 数 内 部 函 数 就 具 有 语 句 函 数 的 许 多 特 征 而 语 句 函 数 非 常 容 易 与 赋 值 语 句 相 混 淆, 所 以 语 句 函

12 数 也 是 不 提 倡 使 用 的 6. 可 执 行 语 句 之 间 的 DATA 语 句 如 果 在 程 序 的 可 执 行 部 分 使 用 DATA 语 句 的 话, 会 容 易 让 人 产 生 一 种 错 觉, 即 DATA 语 句 能 够 在 程 序 的 执 行 过 程 当 中 进 行 赋 值, 而 实 际 上,DATA 语 句 只 能 用 于 数 据 的 初 始 化, 因 此 DATA 语 句 最 好 还 是 只 用 于 程 序 的 说 明 部 分 7. 哑 长 度 字 符 函 数 哑 长 度 字 符 函 数 要 求 在 调 用 程 序 当 中 声 明 函 数 的 名 称, 它 完 全 可 以 通 过 运 用 具 有 显 式 界 面 或 动 态 字 符 长 度 的 子 例 行 程 序 或 函 数 来 替 代 8. 固 定 源 码 形 式 固 定 源 码 形 式 完 全 是 由 早 期 的 卡 片 纸 带 式 输 入 输 出 方 式 所 决 定, 而 现 在 卡 片 纸 带 式 输 入 输 出 早 已 经 不 再 使 用, 因 此 这 种 源 码 形 式 必 定 是 要 被 淘 汰 的 9. 字 符 型 声 明 里 面 的 CHARACTER* 形 式 在 字 符 型 声 明 语 句 当 中 用 来 说 明 字 符 长 度 的 CHARACTER* 完 全 是 多 余 的, 一 般 提 倡 采 用 更 为 合 乎 英 语 习 惯 的 形 式 废 弃 的 语 言 特 征 在 FORTRAN 90 里 面 还 可 以 使 用 的 语 言 特 征 有 些 已 经 被 FORTRAN 95 完 全 废 弃 了, 因 此 要 特 别 留 意 它 们, 以 免 出 现 源 代 码 无 法 在 FORTRAN 95 系 统 里 面 调 试 通 过 的 情 况 这 些 被 FORTRAN 95 废 弃 的 语 言 特 征 主 要 包 括 : 实 型 和 双 精 度 实 型 的 DO 变 量 从 块 的 外 部 分 支 到 块 内 部 的 END IF 语 句 PAUSE 语 句 ASSIGN 语 句, 带 标 签 的 GO TO 语 句 nh 编 辑 描 述 符 为 了 能 够 阅 读 使 用 FORTRAN 90 以 及 更 早 版 本 的 源 代 码, 下 面 还 是 分 别 予 以 简 要 的 说 明 请 注 意 它 们 遭 到 淘 汰 的 原 因 所 在 1. 实 型 和 双 精 度 实 型 的 DO 变 量 实 型 和 双 精 度 实 型 的 DO 变 量 或 循 环 控 制 的 DO 参 数 都 是 难 以 移 植 的, 而 且 也 是 很 少 用 到 的 因 此 现 代 的 FORTRAN 版 本 都 要 求 DO 变 量 为 标 量 整 型 变 量 2. 从 块 的 外 部 分 支 到 块 内 部 的 END IF 语 句 从 块 的 外 部 分 支 到 块 内 部 的 END IF 语 句 对 于 语 句 的 执 行 序 列 的 控 制, 是 完 全 不 必 要 的, 也 是 不 规 范 的, 因 此 已 经 被 完 全 淘 汰 了 3. PAUSE 语 句 PAUSE 语 句 用 于 把 一 个 正 在 运 行 的 程 序 挂 起 来, 直 到 系 统 或 操 作 重 新 开 始 运 行 它 的 功 能 完 全 是 多 余 的, 因 为 WRITE 语 句 可 以 发 送 消 息 到 任 何 设 备, 例 如 操 作 控 制 台 或 终 端, 而 READ 语 句 则 可 以 等 待 或 接 收 来 自 同 一 个 设 备 的 消 息 它 们 的 配 合 使 用 就 可 以 替 代 特 别 的 PAUSE 语 句

13 4. ASSIGN 语 句, 带 标 签 的 GO TO 语 句 ASSIGN 语 句 用 来 给 一 个 整 型 变 量 赋 予 一 个 语 句 的 标 签 它 的 一 般 用 途 就 是, 在 程 序 的 运 行 过 程 当 中, 通 过 ASSIGN 语 句 就 可 以 给 该 整 型 变 量 赋 予 分 支 目 标 语 句 的 标 签, 从 而 给 程 序 提 供 一 种 动 态 分 支 的 能 力 然 而 整 型 变 量 除 了 可 以 具 有 标 签 值 之 外, 还 有 可 能 具 有 一 般 的 整 数 值, 这 就 会 容 易 导 致 程 序 错 误, 也 使 得 程 序 难 以 阅 读 实 际 上 ASSIGN 语 句, 以 及 带 标 签 的 GO TO 语 句 的 功 能, 都 可 以 由 内 部 过 程 实 现, 因 为 ASS IGN 语 句 无 非 就 是 纪 录 了 一 个 可 重 用 代 码 块 完 成 运 行 后 的 返 回 点 ASSIGN 语 句 还 可 以 把 一 个 FORMAT 语 句 的 标 签 动 态 地 赋 予 一 个 整 型 变 量, 然 后 该 变 量 就 可 以 用 作 WRITE,READ,PRINT 语 句 的 格 式 说 明 符 不 过 这 个 功 能 也 可 以 通 过 把 字 符 型 变 量, 数 组, 以 及 常 量 用 作 格 式 说 明 符 而 得 到 实 现 总 之, 标 签 的 使 用 总 是 不 合 时 宜 的 5. nh 编 辑 描 述 符 使 用 这 个 编 辑 描 述 符 非 常 容 易 导 致 错 误, 因 为 跟 在 该 描 述 符 后 面 的 字 符 数 目 很 容 易 计 算 错 误, 而 如 果 使 用 字 符 常 量 编 辑 描 述 符 来 行 使 相 同 的 功 能 的 话, 则 根 本 不 需 要 计 算 字 符 数 目 第 二 篇 计 算 的 叙 述 算 法 的 每 一 个 步 骤, 都 必 须 给 予 确 切 的 定 义 对 于 算 法 当 中 所 考 虑 的 每 一 种 情 况, 每 一 个 有 待 执 行 的 动 作, 都 必 须 严 格 地 和 不 含 混 地 加 以 规 定 对 于 以 描 述 算 法 作 为 目 的 而 设 计 出 来 的, 采 用 了 形 式 的 定 义 的 程 序 设 计 语 言, 或 者 说 计 算 机 语 言, 它 的 每 一 个 语 句 都 必 须 有 非 常 确 切 的 意 义 ---- D.E.Knuth [1] The Art of Computer Programming 本 质 上 FORTRAN 就 是 一 门 语 言, 一 门 人 与 计 算 机 赖 以 进 行 有 效 交 流 的 语 言, 在 这 个 意 义 上 和 我 们 使 用 的 中 文, 英 文 等 没 有 本 质 差 别 现 在 假 设 要 来 描 述 一 种 大 家 都 陌 生 的 语 言, 那 么 总 是 要 分 成 两 个 方 面 来 描 述, 即 一 方 面 要 描 述 这 门 语 言 的 表 象 和 形 态, 也 就 是 它 使 用 哪 些 符 号, 哪 些 词 汇, 一 般 的 句 式 如 何, 怎 样 才 能 完 整 叙 述 一 个 任 务 之 类 ; 另 一 方 面 需 要 说 明 这 门 语 言 的 语 义, 也 就 是 说 这 门 语 言 是 如 何 用 来 表 达 我 们 需 要 它 表 达 的 意 思 的 第 4 章 基 本 上 就 是 描 述 FORTRAN 作 为 一 种 语 言 的 基 本 形 态, 也 就 是 书 写 这 种 语 言 的 书 写 规 则 接 下 来 几 章 则 逐 步 说 明 如 何 用 FORTRAN 来 表 达 我 们 的 要 求, 或 者 反 过 来 说,FORTRAN 提 供 了 些 什 么 表 达 方 式, 以 便 我 们 用 来 向 计 算 机 提 出 合 理 的 任 务 : 表 达 基 本 数 据 ; 表 达 数 据 的 结 构 ; 完 整 地 描 述 数 据 ; 构 造 表 达 式 ;

14 驱 动 计 算 的 赋 值 ; 计 算 过 程 的 结 构 控 制 ; 在 整 个 第 二 篇, 我 们 将 领 略 到 FORTRAN 95 是 如 何 能 够 做 到 精 致 地 描 述 计 算 的, 而 把 一 个 问 题 阐 述 清 楚 了, 就 意 味 着 问 题 已 经 解 决 了 一 大 半 [1] Donald E. Knuth ( 高 纳 德 ), Stanford University 的 The Art of Computer Programming 荣 休 教 授, 而 The Art of Computer Programming( 计 算 机 程 序 设 计 技 巧 ) 正 是 他 的 伟 大 著 作 的 名 称 洋 洋 七 大 卷 的 The Art of Computer Programming 是 当 今 全 世 界 每 一 个 计 算 机 科 学 家 所 膜 拜 的 圣 经 1974 年 在 该 书 刚 完 成 前 面 很 少 一 部 分 时, 就 给 他 带 来 了 计 算 机 科 学 家 们 梦 寐 以 求 的 图 灵 奖 第 4 章 FORTRAN 95 语 言 的 形 貌 要 说 明 一 门 语 言 的 形 态, 必 须 回 答 以 下 问 题 : 它 使 用 哪 些 符 号 来 表 达 信 息? 它 的 词 汇 如 何 构 成? 它 的 语 句 如 何 构 成? 如 何 表 达 一 个 完 整 的 任 务? 具 体 的 对 于 一 门 计 算 机 语 言, 把 这 几 个 问 题 更 加 明 确 地 转 换 过 来, 就 是 : 它 使 用 键 盘 上 的 哪 些 符 号, 各 个 符 号 有 哪 些 用 途? 它 的 词 汇 如 何 由 键 盘 字 符 构 成? 含 有 哪 些 固 定 的 词 汇? 以 及 容 许 自 由 构 成 合 法 词 汇 的 规 则 是 什 么? 它 具 有 哪 些 固 定 的 语 句 格 式? 以 及 容 许 自 由 构 成 合 法 语 句 的 规 则 是 什 么? 我 们 交 待 给 计 算 机 的 任 何 任 务, 都 必 须 明 确 说 明 任 务 的 开 始, 执 行 步 骤 和 完 成, 因 此 一 段 完 整 的 源 代 码 应 该 具 备 什 么 样 的 形 式? 以 及 应 该 具 备 哪 些 要 素? 本 章 就 是 要 回 答 这 些 问 题 4.1 FORTRAN 语 言 所 使 用 的 字 符 从 最 抽 象 的 层 面 来 看, 人 与 计 算 机 的 交 流 只 是 信 息 的 交 流, 而 信 息 总 是 需 要 依 靠 某 种 信 号 来 表 示, 对 于 人 来 说, 最 方 便 的 就 是 字 符 而 对 于 计 算 机 来 说, 自 然 就 是 键 盘 所 能 敲 出 的 那 些 字 符 ( 信 号 ), 因 此 下 面 就 是 要 说 明 : FORTRAN 95 能 识 别 键 盘 上 敲 出 的 哪 些 字 符? 每 个 字 符 对 于 FORTRAN 95 来 说 又 意 味 着 什 么? FORTRAN 95 所 使 用 的 基 本 字 符 按 照 FORTRAN 95 标 准 的 规 定, 一 切 FORTRAN 95 的 实 现 平 台 都 必 须 使 用 下 面 表 4-1 所 列 出 来 的 这 个 基 本 的 字 符 集, 或 者 说, 这 个 字 符 集 是 所 有 遵 循 FORTRAN 95 标 准 的 编 译 器 所 使 用

15 的 字 符 集 的 公 共 子 集 这 样 原 则 上, 局 限 在 这 个 字 符 集 上 的 源 码 是 能 够 被 任 何 遵 循 FORTRAN 95 标 准 的 编 译 器 所 识 别 的 表 4-1 基 本 的 FORTRAN 95 字 符 集 : 文 字 字 符 英 文 字 母 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 数 字 下 划 线 _ 特 殊 字 符 图 形 名 称 空 格 = 等 号 十 加 号 图 形 名 称 : 冒 号! 叹 号 引 号 一 减 号 % 百 分 号 * 星 号 & 英 语 的 and / 斜 线 ; 分 号 ( 左 括 号 < 小 于 ) 右 活 号 > 大 于, 逗 号? 问 号. 小 数 点 或 句 号 $ 货 币 符 号 撇 号 可 以 看 到 基 本 字 符 分 为 两 大 类 : 文 字 字 符 和 特 殊 字 符 除 了 货 币 符 号 可 以 本 地 化 之 外, 其 他 任 何 字 符 都 必 须 依 照 表 里 的 形 式 对 于 基 本 字 符 有 如 下 几 个 问 题 需 要 予 以 注 意 一. 文 字 字 符 的 用 处 : 主 要 是 命 名 的 作 用, 可 以 用 来 命 名 语 言 中 的 一 切 对 象, 这 三 种 符 号 可 以 混 合 使 用 ; 其 中 数 字 还 具 有 它 本 来 的 含 义, 就 是 表 示 数 目 二. 特 殊 字 符 的 用 处 : 特 殊 字 符 主 要 具 有 功 能 的 意 义, 如 编 辑 功 能, 运 算 功 能, 语 法 功 能 等 FORTRAN 95 标 准 原 则 上 接 受 小 写 字 母 因 此 除 了 以 下 位 置, 大 小 写 是 等 价 的 三. 大 小 写 必 须 区 分 的 位 置 : 作 为 字 符 常 量 的 字 符 串 里 面 ; 输 入 输 出 的 纪 录 里 面 ; 作 为 编 辑 描 述 符 的 引 号 或 撇 号 里 面 因 为 在 上 述 几 种 情 形, 大 小 写 是 字 符 型 数 据 的 不 同 数 据 取 值 如 果 不 幸 遇 到 一 个 FORTRAN 95 标 准 的 怪 异 的 编 译 平 台, 偏 偏 不 接 受 小 写 字 母, 这 是 FORTRAN 95 标 准 所 许 可 的, 这 时 就 得 小 心 了 不 过 幸 好 我 们 常 用 的 编 译 平 台, 例 如 CVF, 都 是 接 受 小 写 字 母 的 另 外, 在 OPEN 或 者 INQUIRE 语 句 里 面 的 FILE= 或 NAME= 后 面 是 否 区 分 大 小 写, 也 是 由 编 译 平 台 指 定 的

16 如 果 是 需 要 调 用 其 他 语 言 写 的 子 程 序, 而 恰 好 该 种 语 言 ( 例 如 C 语 言 ) 是 区 分 大 小 写 的, 这 时 就 需 要 特 别 小 心 例 4-1 如 果 用 C 写 了 两 个 子 程 序 EIGEN 和 eigen, 然 后 有 如 下 的 FROTRAN 片 断 : EXTERNAL EIGEN... CALL EIGEN... END 这 时 它 是 该 引 用 EIGEN 还 是 eigen 呢? 如 果 所 使 用 的 FROTRAN 系 统 正 好 是 怪 异 的 那 种, 没 问 题 如 果 是 常 见 的 如 CVF, 这 时 它 就 无 法 区 分 EIGEN 和 eigen, 这 样 就 必 须 给 它 们 更 换 名 称 了 四. 数 字 的 涵 义 : 除 了 以 下 情 形, 数 字 总 是 表 示 十 进 位 数 字 属 于 二 进 制, 八 进 制, 十 六 进 制 的 字 面 常 量 ; 带 有 B,O,Z 编 辑 描 述 符 的 输 入 输 出 纪 录 例 4-2 以 下 语 句 当 中 的 数 字 不 是 属 于 十 进 位 数 字 : DATA I, J, K / O 1001, 23.54, Z 5CA2 / 其 中 第 一 个 为 八 进 制 数, 第 二 个 为 十 进 制 数, 第 三 个 为 十 六 进 制 数 五. 下 划 线 的 涵 义 : 下 划 线 的 主 要 作 用 就 是 置 于 单 词 之 间 代 替 空 格, 使 得 我 们 在 命 名 时 使 用 清 楚 的 英 语 词 汇 下 划 线 不 能 置 于 任 意 名 称 的 前 面, 但 是 可 以 置 于 名 称 的 最 后 下 划 线 也 用 于 在 字 面 常 量 中 区 隔 常 量 的 值 和 种 别 参 数 无 论 给 什 么 对 象 起 名, 都 尽 量 使 用 完 整 的 英 语 单 词, 同 时 使 用 下 划 线 以 区 隔 不 同 的 单 词 所 谓 好 记 性 不 如 烂 笔 头, 只 有 这 样 才 能 切 实 保 证 你 在 任 何 时 候, 在 程 序 代 码 的 任 意 位 置 都 知 道 任 意 变 量 等 的 含 义 与 平 台 有 关 的 FORTRAN 辅 助 字 符 集 上 节 列 出 的 基 本 字 符 集 是 在 一 切 FROTRAN 的 编 译 平 台 都 可 以 使 用 的, 被 FORTRAN 95 标 准 规 定 为 必 须 使 用 的 默 认 字 符 集 另 外 还 有 些 辅 助 的 字 符 则 是 不 同 的 平 台 有 不 同 的 用 法 约 定 辅 助 字 符 分 两 类 : 可 打 印 字 符 和 不 可 打 印 字 符 可 打 印 字 符 ; 各 种 本 地 化 语 言 的 字 符, 象 汉 字, 希 腊 字 母 等, 都 可 以 应 用 在 字 符 串, 注 释, 和 输 入 输 出 纪 录 当 中 不 可 打 印 字 符 主 要 就 是 控 制 字 符, 例 如 制 表 符 Tab 键 制 表 符 (Tab 键 ) 在 FORTRAN77 标 准 当 中 主 要 用 来 表 示 6 个 空 格, 这 样 在 固 定 源 程 序 形 式 的 代 码 的 每 行 的 开 头 使 用 Tab, 就 自 动 地 空 出 6 个 空 格 对 于 一 个 FORTRAN77 标 准 的 编 译 系 统 来 说, 在 固 定 源 程 序 形 式 里 的 Tab 被 看 成 是 至 少 6 个 空 格, 而 在 自 由 源 程 序 形 式 里 的 Tab 被 看 成 1 个 空 格 这 样 如 果 Tab 被 放 在 文 本 当 中 用 于 输 出 格 式 控 制, 那 么 这 种 默 认 的 转 换 方 式, 有 时 就 会 导 致 输 出 格 式 的 混 乱

17 有 关 FORTRAN 95 的 辅 助 字 符 集 的 使 用 规 则, 请 参 考 具 体 的 编 译 系 统 的 说 明 4.2 词 汇 所 谓 FORTRAN 的 词 汇 就 是 一 个 语 句 的 最 小 的 意 义 单 位, 它 由 一 个 或 多 个 FORTRAN 字 符 集 里 的 字 符 组 成 包 括 两 类 共 6 种, 分 类 例 举 如 下 : 由 文 字 字 符 组 成 的 词 汇, 包 括 4 种 : 语 句 关 键 词 :IMPLICIT 名 称 :EIGEN_FREQUENCY_3 由 单 个 词 汇 组 成 的 字 面 常 量 : _long 标 识 符 :213 由 特 殊 字 符 组 成 的 算 符 : +,.OR. 定 界 符 : 逗 号,=,=,:,::,;,% FORTRAN 95 的 一 切 合 法 的 词 汇 都 必 须 按 照 语 法 来 构 成 完 备 的 构 词 语 法 规 则 在 附 录 B 给 出 下 面 分 别 予 以 详 细 说 明 1. 语 句 关 键 词 语 句 关 键 词 的 功 用 : 标 志 语 句 本 身 例 4-3 下 面 的 DO 语 句 中 的 关 键 词 DO 本 身 标 志 了 该 语 句 DO I=1,500 标 志 选 项 例 4-4 下 面 的 INTENT 语 句 当 中 的 IN,OUT, 或 INOUT INTENT(IN),A B INTENT(INOUT),X,Y,Z 用 在 语 句 当 中, 起 分 界 的 作 用 例 4-5 如 下 面 DO 语 句 当 中 的 WHILE DO WHILE(. NOT. VECTOR ) 键 词 并 非 所 有 的 语 句 都 必 须 包 含 关 键 词, 在 FORTRAN 里 面, 赋 值 语 句 和 函 数 都 不 需 要 关 尽 管 FORTRAN 95 不 区 分 大 小 写, 本 书 任 何 地 方 出 现 的 语 句 关 键 词 都 使 用 大 写 字 母 纯 粹 是 为 了 醒 目 的 原 因 2. 名 称 在 一 个 程 序 当 中, 任 何 对 象 都 需 要 有 一 个 名 称, 给 它 们 命 名 所 得 到 的 词 汇, 可 以 说 就 是 一 般 语 言 里 的 名 词, 这 样 的 对 象 包 括 : 变 量, 命 名 常 量, 程 序 单 元, 过 程, 公 用 块, 构 造, 派 生 类 型, 哑 元 等

18 名 称 的 拼 写 规 则 为 : 名 称 必 须 由 字 母 开 头, 可 以 由 文 字 字 符 混 合 组 成, 而 下 划 线 不 能 作 为 名 称 的 第 一 个 字 符 一 个 名 称 至 多 允 许 含 有 31 个 字 符 3. 常 量 一 个 常 量 就 是 对 一 个 值 的 合 乎 语 法 的 字 符 标 记 常 量 分 为 字 面 常 量 和 命 名 常 量 两 种 : 一 个 值 如 果 没 有 在 程 序 里 面 经 过 命 名, 则 称 为 字 面 常 量, 这 种 常 量 不 能 取 派 生 数 据 类 型 例 Z 5120A TRUE. (33.2, 5.0) 一 个 值 如 果 在 程 序 里 面 经 过 命 名, 则 称 为 命 名 常 量, 这 种 常 量 能 取 派 生 数 据 类 型 例 4-7 在 如 下 声 明 语 句 当 中 的 常 量 UNSTABLE_POINT 为 命 名 常 量 : REAL, DIMENSION(3), PARAMETER ::UNSTABLE_POINT =& (/5.332, 0.221, /) 对 于 常 量 的 语 义, 将 在 说 明 数 据 时 进 一 步 讨 论 4. 语 句 标 签 在 一 个 程 序 单 元 内 部, 对 任 何 一 条 语 句, 都 可 以 在 该 语 句 的 前 面 加 上 语 句 标 签, 以 便 在 该 程 序 单 元 内 部 的 任 何 其 他 位 置 引 用 该 语 句 需 要 引 用 其 他 语 句 的 语 句 包 括 CALL 语 句,DO 结 构, 分 支 语 句, 输 入 输 出 语 句 等 语 句 标 签 的 书 写 规 则 为 : 语 句 标 签 由 1 到 5 个 十 进 制 数 字 组 成, 其 中 必 须 至 少 有 一 个 数 字 不 能 是 0, 例 如 000 不 能 作 为 标 识 符 ; 标 识 符 以 0 开 头 是 没 有 任 何 意 义 的, 例 如 0034 与 34 没 有 区 别 标 识 符 不 能 放 置 于 空 语 句 之 前 例 上 面 的 语 句 只 出 现 了 一 个 语 句 标 签, 是 不 合 法 的 对 于 在 一 个 程 序 单 元 内 部, 标 识 符 不 唯 一 出 现 的 情 形, 具 有 特 殊 的 含 义, 将 在 后 面 讨 论 5. 算 符 算 符 用 在 表 达 式 当 中, 通 过 运 算 而 获 得 某 种 类 型 的 值 算 符 分 为 固 有 算 符 和 自 定 义 算 符 两 类 : 固 有 算 符 在 FORTRAN 95 语 法 当 中, R310 规 定 了 固 有 算 符 的 构 成 法 则 例 4-9

19 // 表 示 字 符 串 的 连 接 + 表 示 对 数 值 的 加 法.NOT. 表 示 逻 辑 否.OR. 表 示 逻 辑 或 上 面 都 是 固 有 算 符 自 定 义 算 符 自 定 义 算 符 的 一 般 语 法 形 式 为 :.XXX. 即 在 两 个 句 点 之 间 有 n 个 字 符 构 成 的 字 符 串,n 不 大 于 31 中 间 的 字 母 串 最 好 是 一 个 表 达 该 运 算 含 义 的 英 文 单 词 这 个 单 词 不 能 与 固 有 算 符 或 者 逻 辑 常 量 里 面 已 经 使 用 了 的 单 词 重 复 6. 定 界 符 全 部 的 定 界 符 有 如 下 12 种 形 式 : / ( ) (/ /), = => : :: ; % 其 中 ( 和 ),(/ 和 /) 都 必 须 成 对 出 现 顾 名 思 义, 这 些 定 界 符 的 功 能 就 是 在 一 个 连 续 的 源 码 文 本 当 中, 用 来 把 不 同 性 质 的 源 码 成 分 区 分 开 它 们 的 具 体 含 义 将 在 具 体 的 语 句 当 中 说 明 4.3 语 句 一 条 语 句 由 一 些 词 汇 组 成, 可 以 理 解 为 表 示 要 求 计 算 机 进 行 的 一 个 动 作, 但 一 个 说 明, 一 个 描 述 之 类 的, 表 面 看 好 象 不 是 计 算 机 的 一 个 动 作, 不 过 实 质 上 同 样 要 求 机 器 内 部 的 一 个 动 作 与 之 相 对 应, 因 此 同 样 也 构 成 FORTRAN 的 一 条 语 句 FORTRAN 95 的 语 句 分 为 两 大 类 : 非 执 行 语 句 当 需 要 引 入 或 说 明 一 个 程 序 单 元 或 子 程 序, 或 者 是 说 明 数 据 类 型 时, 就 需 要 使 用 非 执 行 语 句 可 执 行 语 句 当 需 要 计 算 机 进 行 一 个 指 定 动 作 时, 就 需 要 使 用 可 执 行 语 句 FORTRAN 95 全 部 的 语 句 的 具 体 分 类, 以 及 语 法 和 例 示 参 见 附 录 A, 语 句 的 语 法 也 参 见 附 录 B 在 后 面 的 有 关 章 节 则 分 别 说 明 了 所 涉 及 到 的 主 要 的 语 句 4.4 源 码 形 式 一 个 FORTRAN 95 程 序 就 是 由 以 下 三 种 形 式 的 程 序 成 分 所 构 成 的 分 行 的 文 本 : FORTRAN 语 句 注 释 INCLUDE 行

20 在 一 个 FORTRAN 95 程 序 里 面, 一 条 语 句 占 一 行 或 多 行, 一 行 也 可 以 有 多 条 语 句, 程 序 文 本 当 中 可 以 包 含 空 行, 但 不 具 有 任 何 含 义, 被 FORTRAN 编 译 器 忽 略 这 种 形 态 的 文 本 就 是 FORTRAN 的 源 代 码 ( 源 程 序 ) 从 FORTRAN90 开 始, 对 于 源 程 序 的 书 写 格 式 要 求 已 经 完 全 现 代 化 了, 也 就 是 出 现 了 所 谓 自 由 源 程 序 格 式, 而 此 前,FORTRAN 的 固 定 源 程 序 格 式 一 直 是 初 学 者 视 为 畏 途 的 主 要 因 素, 那 种 传 统 的 固 定 源 程 序 格 式 完 全 是 FORTRAN 作 为 始 祖 级 的 高 级 语 言 的 遗 留 痕 迹, 因 为 早 期 的 源 程 序 输 入 不 是 通 过 键 盘, 而 是 运 用 穿 孔 纸 带, 正 是 穿 孔 纸 带 的 格 式 规 定 了 相 应 的 源 程 序 的 书 写 格 式 现 在 之 所 以 我 们 还 需 要 了 解 这 点, 是 因 为 FORTRAN 的 悠 久 历 史, 决 定 了 有 大 量 的 源 代 码 正 是 使 用 了 那 种 古 老 格 式, 那 是 一 个 今 天 我 们 不 得 不 继 承 的 宝 库, 要 想 使 用 它 们, 显 然 就 得 会 读 那 种 格 式, 因 此 我 们 只 需 要 了 解 固 定 格 式, 却 不 需 要 遵 循 固 定 格 式 来 写 代 码 例 4-10 在 这 个 例 子 里 面, 表 明 了 行 与 语 句 之 间 可 以 有 多 种 排 列 形 式 : 这 里 的 例 子 显 示 了 所 谓 自 由 源 程 序 格 式 的 自 由 之 所 在 这 里 使 用 了 & 作 为 一 个 语 句 在 行 与 行 之 间 连 续 的 标 志, 而! 后 面 的 字 符 永 远 是 注 释 23 FORMAT( 6Y, J9)! 这 是 一 条 语 句 占 有 完 整 的 一 行 的 例 子 37 FUNCTION string_concat(s1, &! 这 里 一 条 语 句 被 分 到 两 行 s2) 空 格 是 被 忽 略 的 64 FORMAT( 6Y, J0);37 FUNCTION &! 这 里 一 行 里 有 两 条 语 句, 其 中 一 条 string_concat(s1, s2)! 语 句 还 只 是 它 的 一 部 分 TYPE (string) :: s1, s2, string_concat string_concat%string_data = s1% string_data(1:s1%length) // & s2%string_data(1:s2%length);string_concat%length &! 这 行 里 包 含 两 条 = s1%length + s2%length! 部 分 语 句 END FUNCTION string_concat 源 码 文 本 的 一 般 规 则 如 下 : 在 一 个 程 序 单 元 内 部, 行 与 行 之 间 的 顺 序 是 有 意 义 的, 只 有 两 个 例 外 : 注 释 行 的 顺 序 与 位 置 可 以 非 常 自 由 ; 在 CONTAINS 语 句 和 END 语 句 之 间 的 子 程 序 的 顺 序 也 可 以 是 任 意 的 在 一 个 程 序 单 元 内 部, 或 者 完 全 使 用 自 由 格 式, 或 者 完 全 使 用 固 定 格 式 但 是 一 个 程 序 内 部 的 不 同 程 序 单 元 则 可 以 使 用 不 同 的 格 式 后 面 要 说 明 为 了 便 于 协 调 起 见, 如 何 使 用 一 种 自 由 格 式 与 固 定 格 式 兼 容 的 特 定 格 式 所 谓 字 符 文 本 是 指 如 下 两 种 情 形 下 的 字 符 串 : 作 为 一 个 字 符 字 面 常 量 的 取 值 的 字 符 或 字 符 串 ; 被 字 符 串 编 辑 描 述 符 控 制 的 字 符 或 字 符 串 那 么 描 述 符 本 身 和 续 行 符 & 永 远 都 不 属 于 其 邻 近 的 字 符 文 本

21 针 对 字 符 文 本 的 规 则 与 针 对 非 字 符 文 本 的 规 则 是 不 一 样 的 例 4-11 下 面 例 子 说 明 了 空 格 在 字 符 文 本 与 非 字 符 文 本 当 中 的 不 同 使 用 规 则 : 22 CHAR = NAME01 // KNOWLEDGE ARCHIVE 23 CHAR = NAME02 // KNOWLEDGEARCHIVE 在 双 引 号 里 的 字 符 串 之 间 的 空 格 是 有 意 义 的, 因 此 上 面 的 两 个 字 符 串 是 不 同 的 DO43I=1,N DO 43 I = 1,N 而 上 面 这 两 条 语 句 是 等 价 的 自 由 源 程 序 格 式 自 由 源 程 序 格 式 的 主 要 思 想 就 是 不 限 制 语 句 在 行 内 的 位 置 与 固 定 格 式 相 比, 主 要 是 空 格 的 用 法 有 差 异 自 由 源 程 序 格 式 的 一 般 规 则 如 下 : 对 于 FORTRAN 的 基 本 字 符 集 而 言, 一 行 至 多 能 容 纳 132 个 字 符, 如 果 出 现 非 基 本 字 符 集 当 中 的 字 符, 则 具 体 的 平 台 会 有 相 应 的 规 定, 这 时, 可 能 能 够 容 纳 的 字 符 数 目 就 会 少 于 132 例 4-12 假 如 下 面 的 语 句 刚 好 包 含 132 个 字 符, 但 是 其 中 含 有 中 文 字 符 : TEXT = CHINESE_SENTENCE this line has exactly 132 characters and contains 人 这 时, 一 个 具 体 的 实 现 平 台 会 有 相 应 的 规 定, 一 般 来 说 它 会 认 为 上 面 语 句 的 字 符 太 多 了, 因 此 为 保 险 起 见, 尽 量 使 用 续 行 符 只 要 字 符! 不 是 作 为 字 符 文 本 当 中 的 一 个 字 符, 那 么 在 该 行 内 它 后 面 的 所 有 字 符 都 是 属 于 注 释 的 内 容 而 FORTRAN 对 于 注 释 内 容 没 有 任 何 限 制, 可 以 是 任 意 形 式, 因 为 反 正 任 何 编 译 器 对 于 注 释 部 分 都 是 忽 略 掉 的 一 行 内 可 以 在 语 句 后 面 接 注 释 内 容, 也 可 以 整 行 就 以! 开 头, 这 时 该 行 就 是 完 全 的 注 释 行 总 之, 注 释 的 位 置 可 以 是 任 意 的, 关 键 是 一 行 的 任 意 位 置 只 要 出 现 了 注 释 符!, 那 么 它 后 面 直 到 行 末, 都 会 被 编 译 器 认 为 是 注 释 内 容 而 不 加 理 会 因 此 不 要 把 语 句 放 置 在 一 行 内 的 注 释 后 面 只 要 字 符 & 不 是 作 为 字 符 文 本 当 中 的 一 个 字 符, 那 么 在 该 行 内 它 后 面 只 能 接 空 格 以 及 注 释, 在 紧 接 着 的 行 内 只 要 存 在 非 注 释 部 分, 那 就 是 和 该 & 前 面 的 部 分 是 连 续 的, 被 称 为 连 续 行 在 FORTRAN 里, 一 个 语 句 所 跟 随 的 连 续 行 不 能 超 过 39 行 一 行 的 非 注 释 部 分 不 能 只 是 一 个 续 行 符 & 注 释 不 能 利 用 该 字 符 来 表 示 续 行, 因 此 如 果 注 释 部 分 的 行 末 为 字 符 &, 则 它 只 是 属 于 注 释 内 容 的 一 个 字 符, 不 具 有 续 行 的 意 思 一 行 如 果 只 包 含 空 格 字 符, 或 者 根 本 不 包 含 任 何 字 符 ( 这 两 者 表 现 一 样 ), 那 么 编 译 器 总 是 把 该 行 视 为 注 释 行, 予 以 忽 略 一 行 之 内 可 以 不 止 包 含 一 条 语 句, 语 句 之 间 必 须 用 (;) 加 以 分 隔 任 何 辅 助 字 符 集 当 中 的 字 符 都 可 以 在 字 符 字 面 常 量 和 字 符 串 编 辑 符 当 中 使 用

22 标 签 被 放 置 于 语 句 之 前, 任 何 情 形 下 都 必 须 避 免 标 签 被 认 为 是 属 于 一 条 语 句 内 部 的 字 符 按 照 FORTRAN 语 法, 空 语 句 是 合 法 语 句, 只 要 空 语 句 不 是 出 现 在 一 行 的 开 头, 因 此 连 续 的 ;;, 甚 至 中 间 包 含 空 格 ; ;, 都 会 被 认 为 是 单 个 的 ;, 因 为 字 符 ; 总 是 意 味 着 它 的 前 面 是 一 条 语 句, 即 使 为 空 语 句, 也 不 算 语 法 错 误 例 4-13 下 面 的 语 句 都 是 合 法 的 X=(3.0,4.6);Y=(44.5,566.0) 这 里 的 ; 是 作 为 语 句 分 隔 符 X=(3.0,4.6); 这 里 的 ; 被 忽 略 而 不 认 为 是 错 误 X=(3.0,4.6); ;;; ;Y=(44.5,566.0) 这 里 的 ; ;;; ; 等 价 于 一 个 ;, 因 为 分 号 之 间 的 空 格 被 认 为 是 空 语 句, 不 算 语 法 错 误 X=(3.0,4.6)& ;Y=(44.5, 566.0) 这 里 分 号 放 在 一 行 的 开 头, 因 为 该 行 是 连 续 行 Y=(44.5,& 566.0);Z= ZERO 例 4-14 下 面 的 写 法 是 错 误 的 53 INTEGER X,Y! 这 里 53 是 合 法 的 标 签 IF (X==0)76 Y=X! 这 里 的 标 签 76 不 能 说 明 自 己 不 属 于 IF 语 句 下 面 我 们 更 加 详 细 地 说 明 在 自 由 源 码 形 式 里 面 续 行 符 和 空 格 的 用 法 1. 续 行 符 只 是 采 用 续 行 符 的 不 同 用 法, 就 有 可 能 产 生 完 全 不 等 价 的 语 句, 因 为 续 行 符 能 够 导 致 名 称 的 变 化 所 以 如 果 一 个 名 称, 字 符 常 量, 或 词 汇 被 迫 分 行, 则 必 须 在 前 一 行 的 末 尾 和 后 一 行 的 开 头 紧 接 着 字 符 使 用 & 例 4-15 ENERGY = 0.5*MASS * VILOC&! 这 里 VILOCITY 是 一 个 变 量 名 &ITY**2 ENERGY = 0.5*MASS * VILOC &! 这 里 变 量 名 成 了 VILOC ITY! &ITY**2 ENERGY = 0.5*MASS * VILOC & &! 这 里 变 量 名 成 了 VILOC & ITY! &ITY**2 上 面 的 三 个 语 句 是 完 全 不 等 价 的!

23 2. 空 格 的 使 用 规 则 在 具 有 固 定 名 称 以 及 固 定 格 式 的 算 符 当 中, 不 能 随 意 使 用 空 格 因 为 空 格 默 认 的 功 能 就 是 分 隔 不 同 的 词 汇 例 4-16 CALL SUBROUTINE A CALL SUBRO UTINE A! 错 误 语 句! IF X =.NOT. IF X =.NOT.! 这 两 条 语 句 不 同 例 4-17 下 面 语 句 当 中 的 空 格 是 不 可 少 的 : INTEGER X,Y IF A=0 DO Y=1, 20 但 不 是 所 有 情 形 下 的 词 汇 之 间 必 须 要 有 空 格, 在 不 会 产 生 混 乱 的 前 提 下, 有 些 语 句 关 键 词 之 间 的 空 格 是 可 以 省 略 的, 对 于 语 句 关 键 词 来 说, 所 有 这 些 不 同 的 情 形 列 举 如 下 表 4-1: 非 必 须 的 空 格 表 4-1 语 句 关 键 词 中 间 空 格 含 义 的 不 同 情 形 必 要 的 空 格 BLOCK DATA DOUBLE COMPLEX DOUBLE COMPLEX DOUBLE PRECISION ELSE IF END BLOCK DATA END DO END FILE END FORALL END FUNCTION END IF END INTERFACE END MODULE END PROGRAM END SELECT END SUBROUTINE CASE DEFAULT DO WHILE DO WHILE IMPLICIT type-specifier IMPLICIT NONE INTERFACE ASSIGNMENT INTERFACE OPERATOR MODULE PROCEDURE RECURSIVE FUNCTION RECURSIVE SUBROUTINE RECURSIVE type-specifier FUNCTION type-specifier FUNCTION type-specifier RECURSIVE FUNCTION END TYPE END WHERE GO TO IN OUT SELECT CASE

24 4.4.2 固 定 源 程 序 格 式 今 天 已 经 没 有 必 要 按 照 固 定 格 式 书 写 源 程 序, 只 需 要 能 够 阅 读 古 老 的 使 用 固 定 格 式 的 代 码, 如 果 有 必 要 把 固 定 格 式 的 源 程 序 转 换 为 自 由 格 式, 也 可 以 运 用 某 些 小 软 件 完 成, 因 此 下 面 只 是 简 要 地 介 绍 固 定 格 式 的 几 个 规 则 语 句 只 能 书 写 在 一 行 的 第 7 到 第 72 个 格 子 上 空 格 除 了 在 字 符 常 量 里 以 外, 都 是 没 有 意 义 的 在 某 行 第 一 格 为 字 符 C, 或 *, 就 表 示 该 行 整 行 都 是 注 释 注 释 总 是 被 忽 略 字 符! 只 要 不 是 出 现 在 第 6 格, 也 不 是 属 于 字 符 文 本, 则 从 它 开 始 一 直 到 该 行 的 行 末, 都 属 于 注 释 一 行 如 果 只 包 含 空 格 字 符, 或 者 根 本 不 包 含 任 何 字 符 ( 这 两 者 表 现 一 样 ), 那 么 编 译 器 总 是 把 该 行 视 为 注 释 行, 予 以 忽 略 一 行 中 的 多 条 语 句 用 一 个 或 多 个 分 号 分 隔 ; 分 号 可 以 出 现 在 行 末, 但 没 有 更 多 的 意 义 ; 分 号 不 能 是 一 行 的 第 7 到 第 72 个 格 子 上 第 一 个 非 空 格 字 符 除 了 空 格 和 0 之 外 的 任 意 字 符, 只 要 出 现 在 某 行 第 6 格 上, 则 表 示 该 行 为 连 续 行 一 行 后 面 最 多 只 能 有 19 个 连 续 行, 第 一 行 称 为 初 始 行 标 识 符 只 能 出 现 在 第 1 到 第 5 格 上, 被 连 续 的 语 句 只 有 第 一 行 可 以 使 用 标 识 符, 这 样 下 面 所 有 的 连 续 行 的 第 1 到 第 5 格 上 只 能 是 空 格 END 语 句 不 能 被 连 续, 它 也 不 能 被 视 为 初 始 行 兼 容 源 程 序 格 式 在 某 些 情 形 下, 需 要 书 写 能 够 同 时 被 自 由 格 式 和 固 定 格 式 兼 容 的 源 码, 要 做 到 这 点, 只 需 要 遵 循 以 下 规 则 即 可 : 标 识 符 只 能 出 现 在 第 1 到 第 5 格 上, 语 句 只 能 书 写 在 一 行 的 第 7 到 第 72 个 格 子 上 按 照 自 由 格 式 的 规 则 使 用 空 格 使 用! 作 注 释 符, 但 不 要 放 置 在 第 6 格, 也 不 要 是 用 使 用 字 符 C, 或 * 作 注 释 符 需 要 连 续 行 时, 在 被 连 续 行 的 第 73 格 写 &, 同 时 在 连 续 行 的 第 6 格 也 写 &, 第 74 格 到 80 格 保 持 空 格 或 者 只 写 注 释 而 连 续 行 的 第 1 到 第 5 格 上 只 能 是 空 格 下 面 就 是 一 个 同 时 满 足 两 种 源 码 形 式 要 求 的 代 码 例 程 : 例 4-18 Column: ! Define the function CUT_SIN DOUBLE PRECISION FUNCTION CUT_SIN(X) CUT_SIN = X - X**3/FACTOR(3) + X**5/FACTOR(5)& &- X**7/FACTOR(7) CONTAINS

25 INTEGER FUNCTION FACTOR(N) FACTOR = 1 DO 10 I = N, 1, FACTOR = FACTOR * I END FUNCTION FACTOR END FUNCTION CUT_SIN 程 序 结 构 在 FORTRAN 95 的 语 法 规 则 里 面 规 定 了 程 序 结 构 的 完 整 定 义, 参 见 附 录 B 不 过 那 里 的 语 法 规 则 并 没 有 完 备 地 表 述 在 一 个 程 序 单 元 里, 各 种 语 句 应 该 遵 循 什 么 顺 序 下 面 给 出 一 般 原 则 : 数 据 类 型 声 明 和 指 定 的 语 句 必 须 放 置 在 可 执 行 结 构 或 语 句 之 前 ; FORMAT,DATA,ENTRY 语 句 也 可 以 放 置 在 可 执 行 语 句 中 间, 不 过 把 DATA 语 句 放 置 在 可 执 行 语 句 中 间 是 一 种 过 时 的 做 法 ; 如 果 出 现 USE 语 句, 必 须 总 是 放 在 最 前 面 ; 如 果 出 现 内 部 子 程 序 或 模 块 子 程 序, 则 必 须 跟 在 CONTAINS 语 句 后 面 例 4-19 下 面 是 一 个 典 型 的 只 包 含 一 个 程 序 单 元, 也 就 是 主 程 序 的 FORTRAN 程 序 :! 本 程 序 能 够 求 出 所 有 之 间 每 一 位 上 的 数 字 的 立 方 和 等 于 自 身 的 三 位 数 PROGRAM SUM_OF_ CUBES INTEGER A,B,C DO A = 1,9 DO B = 0,9 DO C = 0,9 IF (100*A + 10*B + C == A**3 + B**3 + C**3) & PRINT (3I1), A,B,C END DO END DO END DO END PROGRAM SUM_OF_CUBES RUN SUM_OF_CUBES 大 家 不 妨 尝 试 一 下, 之 间 还 存 在 这 样 的 数 字 吗? 如 果 是 平 方 呢? 下 面 的 表 4-2 给 出 了 程 序 单 元 的 基 本 模 式, 其 中 处 于 同 一 水 平 位 置 的 各 语 句 之 间 没 有 严 格 的 前 后 顺 序, 而 不 同 的 行 则 表 示 了 严 格 的 在 程 序 当 中 出 现 的 前 后 顺 序 :

26 表 4-2 程 序 单 元 的 基 本 模 式 程 序, 函 数, 子 例 行 程 序, 模 块, 数 据 块 语 句 USE 语 句 FORMAT 语 句, IMPLICIT NONE ENTRY 语 句 PARAMETER 语 句 PARAMETER 语 句, DATA 语 句 DATA 语 句 CONTAINS 语 句 内 部 子 程 序 或 模 块 子 程 序 END 语 句 IMPLICIT 语 句 派 生 数 据 类 型 定 义, 接 口 块, 数 据 类 型 声 明 语 句, 语 句 函 数 语 句, 特 定 语 句 可 执 行 结 构 把 DATA 语 句 放 置 在 可 执 行 结 构 中 间 已 经 过 时 语 句 函 数 语 句 已 经 过 时 表 4-3 给 出 一 个 特 定 的 语 句 能 够 在 什 么 结 构 中 出 现, 不 能 在 什 么 结 构 中 出 现 的 概 貌 : 表 4-3 语 句 的 环 境 作 用 单 元 的 种 类 语 句 主 程 序 模 块 数 据 块 外 部 子 程 序 模 块 子 程 序 内 部 子 程 序 接 口 块 USE 语 句 Y Y Y Y Y Y Y ENTRY 语 句 N N N Y Y N N FORMAT 语 Y N N Y Y Y N 句 其 他 声 明 Y Y Y Y Y Y Y DATA 语 句 Y Y Y Y Y Y N 派 生 类 型 定 Y Y Y Y Y Y Y 义 接 口 块 Y Y N Y Y Y Y 语 句 函 数 Y N N Y Y Y N CONTAINS Y Y N Y Y N N 可 执 行 语 句 Y N N Y Y Y N 其 中 Y 表 示 该 语 句 可 以 在 相 应 的 结 构 当 中 出 现,N 表 示 不 能 出 现 4.5 INCLUDE 行 很 多 时 候 一 个 完 整 程 序 的 源 码 还 可 以 原 封 不 动 地 移 植 到 另 一 个 程 序 源 码 的 中 间, 这 时 并 不 需 要 把 被 移 植 源 码 完 整 地 抄 写 过 来, 而 只 需 要 简 单 地 运 用 INCLUDE 行 即 可

27 例 4-20 PROGRAM GREEN_FUNCTION REAL X,Y,Z.! 语 句 省 略 INCLUDE GAUSE.! 语 句 省 略 END 这 样 源 码 文 件 GAUSE 就 直 接 进 入 程 序 GREEN_FUNCTION 的 源 码 里 面, 取 代 了 INCLUDE 行 的 位 置 INCLUDE 行 由 关 键 词 INCLUDE 和 其 后 的 文 件 名 称 组 成 其 中 的 文 件 名 称 是 一 个 字 符 文 本 常 量 INCLUDE 行 只 是 针 对 编 译 器 的 一 个 提 示, 而 不 是 属 于 程 序 内 的 FORTRAN 语 句 其 中 的 字 符 文 本 常 量 不 能 带 作 为 命 名 常 量 的 种 别 参 数 INCLUDE 行 必 须 放 置 在 程 序 当 中, 其 所 引 用 文 件 应 当 出 现 的 位 置 INCLUDE 行 所 在 行 不 能 有 任 何 其 他 文 字, 包 括 标 识 符, 当 然 可 以 有 注 释 INCLUDE 行 可 以 进 行 嵌 套, 嵌 套 的 层 数 由 具 体 的 编 译 器 规 定 注 意 在 嵌 套 的 同 时 不 能 导 致 定 义 循 环 INCLUDE 行 之 前 的 语 句 不 能 是 被 连 续 行, 其 后 的 语 句 也 不 能 是 连 续 行 4.6 与 其 他 语 言 的 语 法 要 素 方 面 的 比 较 下 面 简 要 地 比 较 一 下, 作 为 一 种 语 言,FORTRAN 和 其 它 语 言 在 总 的 语 法 风 格 方 面 的 异 同 一 种 计 算 机 语 言 的 语 法 远 比 任 何 自 然 语 言 的 语 法 要 来 得 简 单 明 了, 计 算 机 语 言 的 语 法 风 格 可 以 明 确 地 归 结 为 各 种 基 本 语 法 要 素 的 选 择 因 此 可 以 按 照 语 法 要 素 对 不 同 的 语 言 加 以 比 较 1. 字 符 集 按 照 语 言 的 所 谓 形 式 定 义, 语 言 就 是 取 自 一 个 有 限 字 符 集 合 的 任 意 字 符 所 构 成 的 有 限 字 符 串 的 集 合 显 然, 一 种 语 言 选 择 哪 些 字 符 作 为 它 的 字 符 集, 正 是 语 言 文 法 设 计 的 第 一 步 最 常 用 的 字 符 集 就 是 ASCII 字 符 集, 而 一 套 完 整 的 字 符 集 除 基 本 字 母 和 数 字 外, 通 常 还 包 含 一 些 特 殊 字 符, 以 便 为 语 言 提 供 足 够 的 表 达 手 段 表 面 看 来, 一 种 语 言 所 使 用 的 字 符 越 多, 它 的 表 达 能 力 应 该 是 越 大, 然 而 在 增 大 字 符 集 的 同 时, 也 增 加 了 编 译 时 词 法 分 析 的 分 量, 因 此 这 里 的 折 衷 方 式 的 不 同, 造 就 了 不 同 语 言 的 字 符 集 的 差 异 字 符 集 的 选 择 首 先 来 自 语 言 的 输 入 输 出 设 备 对 于 FORTRAN,C 等 大 多 数 语 言, 是 面 向 以 工 业 标 准 键 盘 为 主 的 输 入 输 出 设 备 的, 因 此 这 些 语 言 的 字 符 集 可 以 说 是 大 同 小 异 的, 不 过 也 有 例 外, 如 APL 语 言 就 使 用 了 ASCII 字 符 集 之 外 非 常 特 殊 的 字 符, 因 此 这 种 语 言 的 字 符 集 就 不 能 被 大 多 数 输 入 输 出 设 备 直 接 使 用 从 计 算 机 历 史 来 讲, 到 了 1960 年 代 的 早 期, 计 算 机 行 业 对 字 符 的 表 示 大 都 由 六 位 字 节 转 变 为 八 位 字 节, 这 样 理 论 上 就 有 了 256 个 字 符 可 用, 分 配 给 52 个 大 小 写 字 母 十 个 数 字 以 及 一 些 标 点 符 号, 应 该 是 足 够 了 不 过, 由 于 计 算 机 语 言 本 地 化 的 趋 势 越 来 越 流 行, 语 言 的 国 际 化 导 致

28 各 种 民 族 语 言 的 文 字 都 要 求 进 入 字 符 集 除 了 法 语, 德 语 里 的 语 音 符 号 之 外, 希 腊 语, 阿 拉 伯 语 之 类 的 语 言 有 着 完 全 不 同 的 字 符 集 而 如 果 中 文 和 日 文 要 进 入 计 算 机 语 言, 则 需 要 一 个 有 一 万 多 符 号 的 字 符 集 因 此 甚 至 出 现 了 一 种 想 法, 就 是 考 虑 用 十 六 位 (65536) 来 表 示 字 符 集 2. 语 句 标 签 在 FORTRAN77 及 其 前 面 的 标 准 里, 语 句 标 签 的 使 用 具 有 严 重 的 时 代 烙 印, 而 随 着 技 术 的 进 步, 这 种 过 时 的 玩 意 在 大 多 数 情 况 下 不 再 具 有 任 何 价 值, 特 别 是 严 重 地 损 害 源 码 的 可 读 性 因 此 语 句 标 签 在 任 何 语 言 里 都 是 属 于 需 要 淘 汰 的 对 象 3. 运 算 算 符 字 符 + 和 -( 加 号 和 减 号 ) 在 大 多 数 语 言 里 都 是 代 表 两 种 基 本 的 数 学 运 算, 不 过 除 了 这 两 个 符 号 之 外, 其 他 的 运 算 算 符 就 有 相 当 多 的 花 样 了 例 如 只 是 用 特 殊 字 符 来 表 示 基 本 运 算 算 符, 典 型 的 就 是 APL 语 言, 还 有 LISP 语 言 TIMES 语 言 等 的 逻 辑 运 算 符 ; 而 大 多 数 语 言 使 用 一 些 字 符 组 合, 同 时 也 利 用 特 殊 字 符 来 表 示 部 分 运 算 算 符, 有 时 还 使 用 一 些 不 属 于 上 述 两 种 之 中 任 意 一 种 的 字 符 串 来 表 示 部 分 运 算 算 符, 例 如 FORTRAN 里 面 的.EQ. 表 示 相 等, 指 数 运 算 用 ** 表 示 等 4. 关 键 词 计 算 机 语 言 大 都 使 用 保 留 字 与 关 键 词, 从 而 能 够 提 高 翻 译 器 的 检 错 能 力 而 且 大 多 数 以 关 键 词 开 始 的 语 句 本 身 就 表 明 了 语 句 的 类 型 例 如 IF READ 等 一 种 语 言 究 竟 使 用 多 少 保 留 字 和 关 键 词, 往 往 是 一 个 折 衷 的 结 果 : 保 留 字 少, 可 以 减 少 编 程 者 的 记 忆 负 担, 同 时 却 会 增 加 语 法 分 析 的 困 难 ; 而 如 果 使 用 大 量 的 保 留 字, 例 如 COBOL 语 言, 使 用 了 大 量 的 保 留 字, 使 得 编 程 者 很 难 全 部 记 下, 因 此 就 会 常 常 出 现 不 小 心 使 用 保 留 字 作 变 量 名 的 错 误, 当 然 使 用 很 多 的 保 留 字, 就 会 使 得 翻 译 过 程 中 的 语 法 分 析 变 得 更 为 简 单 特 别 需 要 注 意 的 是, 当 一 种 语 言 出 现 新 版 本 时, 得 小 心 是 否 引 入 了 新 的 保 留 字, 例 如 COBOL 语 言, 就 在 新 标 准 里 引 入 了 新 的 保 留 字, 这 就 意 味 着 那 些 在 程 序 中 使 用 新 的 保 留 字 作 为 变 量 名 ( 或 其 他 名 字 ) 的 旧 程 序, 按 照 新 标 准 在 语 法 上 就 不 再 正 确 了, 尽 管 这 个 程 序 一 点 也 没 有 改 过 对 于 FORTRAN 来 说, 这 类 问 题 就 没 那 么 严 重 5. 注 释 尽 管 注 释 一 定 是 被 编 译 器 忽 略 的, 但 却 是 文 件 中 十 分 重 要 的 一 部 分, 因 为 注 释 是 保 证 源 码 的 可 读 性 非 常 重 要 的 手 段 在 不 同 的 语 言 里, 表 示 注 释 的 方 式 非 常 不 同, 甚 至 在 一 种 语 言 里, 也 可 能 有 几 种 方 法 引 入 注 释 : 在 C 语 言 程 序 中, 需 要 使 用 /* 和 */ 这 样 的 特 殊 标 记 来 界 定 而 不 管 行 边 界, 这 时 常 常 出 现 的 错 误 就 是 漏 掉 结 束 的 界 定 符, 使 得 后 面 的 语 句 也 变 成 了 注 解! FORTRAN 95 语 言 中 的!,Ada 语 言 中 的 -, 或 是 C 十 十 语 言 中 的 //, 都 是 在 行 的 任 意 位 置 开 始 而 直 到 行 的 末 尾 结 束 这 种 做 法 就 更 为 合 理 方 便 6. 空 格 在 不 同 的 语 言 里 空 格 的 使 用 规 则 非 常 不 同 这 点 需 要 引 起 注 意 在 FORTRAN 语 言 中, 空 格 在 除 了 字 符 串 数 据 以 外 的 任 何 其 他 地 方 都 没 有 意 义 而 在 很 多 语 言 当 中 使 用 空 格 来 作 为 分 界 符, 这 就 使 得 空 格 在 语 法 中 有 实 际 的 含 义 对 于 初 学 者 来 说, 常 常 意 识 不 到 空 格 带 来 的 问 题

29 7. 定 界 符 和 括 号 定 界 符 的 作 用 就 是 简 单 地 标 志 类 似 语 句 或 表 达 式 之 类 的 语 法 元 素, 目 的 就 是 增 加 源 码 的 可 读 性, 并 且 使 得 语 法 分 析 更 加 简 单 特 别 需 要 注 意 的 是, 成 对 的 定 界 符 用 来 清 楚 地 界 定 特 定 语 法 结 构 的 边 界, 从 而 可 以 有 效 地 消 除 二 义 性 8. 自 由 或 固 定 格 式 严 格 的 固 定 字 段 格 式 一 般 是 应 用 在 汇 编 语 言 当 中 而 早 期 的 FORTRAN 则 是 使 用 了 部 分 固 定 字 段 格 式 ; 其 实 很 多 语 言 早 期 同 样 是 具 有 部 分 固 定 字 段 格 式, 不 过 现 代 语 言 的 风 格 是 完 全 排 斥 那 种 固 定 格 式 的, 因 此 几 乎 所 有 语 言, 只 要 还 没 有 被 废 弃, 都 已 经 采 用 了 自 由 字 段 格 式 第 5 章 准 备 数 据 从 本 章 开 始, 我 们 将 赋 予 语 言 实 质 性 的 语 义, 也 就 是 规 定 上 章 所 描 述 的 语 言 的 每 一 个 细 节 所 具 有 的 涵 义 这 种 涵 义 与 其 说 是 我 们 对 于 一 种 语 言 细 节 的 定 义, 不 如 说 是 算 法 的 要 求, 要 求 语 言 具 有 足 够 多 的 细 节, 用 来 表 达 在 算 法 当 中 有 可 能 出 现 的 精 细 情 节 对 于 任 何 的 问 题, 站 在 计 算 机 的 角 度 来 看, 总 是 可 以 把 它 抽 象 为 如 下 图 所 示 的 结 构 : 输 入 数 据 计 算 过 程 输 出 数 据 因 此 要 准 备 通 过 计 算 来 解 决 一 个 问 题, 首 先 要 作 到 的 是 把 该 问 题 所 涉 及 到 的 数 据 整 理 好, 也 就 是 列 出 所 有 的 数 据, 然 后 根 据 数 据 的 数 学 属 性 进 行 分 类, 这 个 分 类 的 过 程 就 是 对 数 据 施 加 足 够 的 标 记 的 过 程, 将 来 把 这 些 数 据 输 入 到 计 算 机, 计 算 机 将 能 够 依 据 这 些 标 记, 辨 识 出 数 据 所 应 该 具 有 的 数 学 属 性, 从 而 施 加 相 应 的 合 法 数 学 运 算 所 以 作 为 向 计 算 机 描 述 计 算 问 题 的 FORTRAN 语 言, 它 首 先 要 作 到 的 是 约 定 如 何 给 数 据 施 加 足 够 详 细 的 标 记 对 这 个 标 记 过 程 的 第 一 个 要 求 是 保 证 准 确 性, 也 就 是 说 这 个 语 言 的 标 记 系 统 必 须 正 确 地 反 映 真 实 世 界 的 问 题 里 面, 数 据 所 具 有 的 数 学 属 性, 因 此 这 个 标 记 系 统 必 然 是 与 数 据 的 数 学 分 类 结 构 保 持 一 致 的 从 数 学 的 观 点 来 看, 世 界 上 的 所 有 数 据, 总 是 可 以 被 表 示 为 整 数, 实 数, 复 数 等 等 基 本 的 数 据 种 类, 因 此 本 章 的 内 容 就 是 讨 论 : FORTRAN 语 言 如 何 把 数 据 归 结 为 一 些 基 本 数 据 类 型 ; 然 后 为 了 足 够 详 尽 地 描 述 每 一 个 数 据 类 型 的 属 性,FORTRAN 是 如 何 施 加 相 应 的 标 记 的 ; FORTRAN 语 言 对 于 这 些 标 记 ( 语 法 形 式 ) 所 约 定 的 语 义 是 什 么 然 后 我 们 就 可 以 知 道, 要 想 用 FORTRAN 来 描 述 一 个 问 题 的 算 法, 并 进 而 以 问 题 算 法 的 FORTRAN 语 言 版 本 为 媒 介, 通 过 计 算 机 来 得 到 计 算 结 果, 第 一 个 步 骤, 就 是 准 备 好 数 据 的 FORTRAN 描 述

30 5.1 数 据 是 什 么 在 上 一 章 里, 据 称 计 算 机 能 够 使 用 语 言, 而 且 是 非 常 类 似 于 人 类 的 语 言, 至 少 从 形 式 上 看 很 象, 这 难 免 会 令 某 些 人 ( 特 别 是 看 过 KUBRICK 的 影 片 2001: A Space Odyssey 的 观 众 们 ) 感 到 恐 惧 别 怕! 且 先 不 讨 论 FORTRAN 作 为 语 言 是 否 具 有 与 人 类 语 言 等 价 的 表 达 能 力, 至 少 从 自 然 语 言 的 语 义 学 的 角 度 来 看,FORTRAN 说 出 来 的 话 其 实 是 绝 对 空 洞 的, 因 为 FORTRAN 语 言 的 全 部 语 义 基 础 就 只 是 数 据, 而 数 据 对 机 器 而 言, 只 是 意 味 着 经 过 编 码 的 符 号 一 台 计 算 机 其 实 是 由 以 下 6 个 部 分 组 成 : 数 据 也 就 是 基 本 数 据 元 素 以 及 数 据 结 构 ; 基 本 操 作 也 就 是 一 个 对 上 述 数 据 进 行 操 作 的 基 本 操 作 集 ; 顺 序 控 制 也 就 是 一 个 控 制 针 对 数 据 的 基 本 操 作 执 行 的 时 间 顺 序 的 机 制 ; 数 据 存 取 也 就 是 一 个 如 何 给 操 作 提 供 数 据 的 机 制 ; 存 储 管 理 也 就 是 一 个 数 据 存 储 分 配 机 制 ; 操 作 环 境 也 就 是 一 个 支 持 程 序 和 外 部 环 境 进 行 数 据 通 讯 的 机 制 因 此 一 台 计 算 机 在 程 序 的 使 用 者 看 来, 就 是 给 它 输 入 数 据, 它 再 给 你 加 工 过 的 结 果 数 据 ; 在 程 序 的 编 制 者 看 来, 就 是 把 对 数 据 的 处 理 过 程 表 示 为 计 算 机 有 限 的 一 系 列 基 本 操 作 ( 指 令 ) 的 集 合, 使 得 计 算 机 能 够 处 理 相 应 的 数 据 ; 因 此, 计 算 机 的 一 切 可 以 说 都 是 围 绕 着 数 据 ---- 如 何 表 达 数 据, 如 何 处 理 数 据 而 计 算 机 语 言 所 要 具 备 的 两 个 部 分 的 功 能, 首 先 就 是 完 备 的 描 述 数 据 的 性 质, 然 后 就 是 描 述 数 据 的 处 理 过 程 那 么, 什 么 是 数 据 呢? 数 据 就 是 符 号 化 了 的 信 息! 对 于 计 算 机 来 说, 任 何 信 息 都 只 有 表 示 为 符 号, 才 能 被 认 可 ; 反 过 来 说, 计 算 机 只 能 输 入 符 号, 而 不 会 也 不 能 理 解 符 号 的 含 义, 它 的 能 力 只 是 体 现 在 按 照 既 定 规 则 来 处 理 符 号 然 后, 就 是 给 出 数 据 的 表 示, 即 如 何 用 符 号 来 明 确 而 无 歧 义 地 表 达 数 据 要 使 得 符 号 具 备 数 据 的 含 义, 需 要 经 过 这 么 几 个 步 骤 : 处 理 符 号 的 第 一 步 : 给 符 号 分 类, 并 给 出 描 述 符 号 性 质 的 方 法 这 个 分 类 是 人 作 为 设 计 者 给 符 号 规 定 语 义 的 第 一 步, 因 为 对 于 人 来 说, 数 据 不 能 只 是 符 号, 而 是 具 有 来 自 真 实 世 界 的 语 义, 设 计 者 正 是 根 据 符 号 的 这 种 语 义, 制 定 相 应 的 处 理 符 号 的 规 则, 而 计 算 机 要 想 能 够 正 确 地 处 理 符 号, 基 本 的 前 提, 就 是 每 当 引 入 一 个 数 据, 都 得 由 人 向 机 器 声 明 这 个 数 据 是 什 么 类 型, 这 个 数 据 具 备 什 么 性 质, 而 且 假 设 计 算 机 已 经 被 引 入 处 理 该 种 数 据 类 型 的 规 则 处 理 符 号 的 第 二 步 : 区 分 常 量 与 变 量 这 一 对 范 畴 反 映 了 最 基 本 的 人 类 抽 象 能 力, 也 正 是 人 类 思 维 的 基 本 模 式 要 想 让 机 器 模 拟 这 种 能 力, 最 简 单 的 做 法 就 是 : 任 何 时 候 都 必 须 首 先 声 明, 哪 些 符 号 表 示 常 量, 哪 些 符 号 表 示 变 量, 而 变 量 相 应 的 取 值 范 围 必 须 规 定 好, 也 就 是 说 必 须 描 述 其 取 值 为 具 有 何 种 属 性 的 常 量 值 的 集 合 ; 或 至 少 已 经 被 机 器 默 认 处 理 符 号 的 第 三 步 : 给 每 一 类 数 据 规 定 相 应 的 合 法 运 算 对 于 一 种 数 据 可 以 执 行 什 么 样 的 运 算, 来 自 于 语 言 设 计 者 对 数 据 语 义 的 规 定, 只 有 当 运 算 被 表 示 为 相 应 的 机 器 指 令 或 指 令 集 合, 这 时 在 表 面 看 来, 机 器 才 开 始 真 正 理 解 了 数 据 的 涵 义

31 因 此 可 以 说, 数 据 的 定 义 构 成 了 计 算 机 的 灵 魂 按 照 上 面 讨 论 的 步 骤, 说 明 一 个 数 据 类 型 包 括 四 个 方 面 : 命 名 的 语 法 取 值 的 范 围 与 属 性 说 明 该 数 据 类 型 的 常 量 的 表 示 方 法 定 义 合 法 的 运 算 因 此 相 应 的 一 个 数 据 类 型 的 四 个 要 素 就 是 : (1) 名 字 ; (2) 值 的 集 合 ; (3) 表 示 值 ( 相 应 的 常 量 ) 的 方 法 ; (4) 操 作 值 的 运 算 的 集 合 对 于 这 四 个 要 素,FORTR AN 一 方 面 要 约 定 它 们 的 语 法 形 式, 从 而 可 以 构 成 符 号 描 述 的 唯 一 性 标 记, 保 证 相 应 的 描 述 语 句 能 够 被 FORTRAN 编 译 系 统 无 歧 义 的 辨 识, 另 一 方 面 就 是 要 给 出 这 些 语 法 形 式 所 对 应 的 含 义 5.2 用 FORTRAN 来 说 明 数 据 的 性 质 真 实 世 界 的 数 据 显 然 是 多 种 多 样 的, 几 匹 马, 轴 承 的 内 径, 圆 周 长 与 直 径 的 比 值, 电 子 的 波 函 数, 非 各 向 同 性 电 介 质 的 电 极 化 率,10 个 被 试 每 日 的 最 高 血 压 等 等, 这 些 数 据 都 具 有 非 常 不 同 的 形 式 与 性 质, 如 果 我 们 每 针 对 一 种 数 据 形 式, 都 把 它 定 义 为 某 一 种 新 的 数 据 类 型, 则 肯 定 是 烦 不 胜 举, 因 此 合 理 的 途 径 是 找 到 一 种 统 一 的 数 据 描 述 方 式, 而 对 于 科 学 计 算 问 题 来 说, 自 然 的 数 据 分 类 方 式 是 数 学 对 数 值 数 据 的 分 类, 再 加 上 非 数 值 型 数 据, 会 是 非 常 适 合 于 科 学 计 算 的 数 据 表 达 方 式 当 然, 如 果 是 以 描 述 其 他 类 型 的 问 题 为 目 的, 如 事 务 处 理, 符 号 演 算 等, 则 选 用 另 外 的 数 据 分 类 方 式 会 更 有 效 至 少 从 数 学 的 观 点 来 看, 我 们 常 常 需 要 处 理 的 数 据, 都 可 以 表 示 为 一 些 基 本 数 据 类 型 的 组 合, 例 如 我 们 知 道 向 量 实 际 上 就 是 一 个 数 组, 数 组 的 每 个 元 素 为 标 量, 因 此 应 用 数 组 这 种 结 构, 就 可 以 自 然 地 表 示 向 量, 另 外 复 数 尽 管 也 可 表 示 为 一 个 二 元 数 组, 但 是 这 种 二 元 数 组 的 乘 法 不 同 于 二 维 向 量, 因 此 为 了 避 免 这 种 歧 义, FORTRAN 把 复 数 当 成 一 个 基 本 数 据 类 型 而 几 种 基 本 标 量 里 面, 整 数 和 实 数 都 同 样 必 须 构 成 基 本 的 数 据 类 型 由 此 可 以 建 立 FORTRAN 的 对 数 据 的 类 似 描 述 由 于 真 实 世 界 问 题 的 要 求 的 不 同, 对 数 据 的 描 述 也 有 程 度 不 等 的 情 况, 最 基 本 的 情 况 就 是 直 接 说 明 数 据 的 类 型 以 及 其 他 属 性, 又 由 于 数 据 表 示 的 实 现 具 有 一 个 重 要 的 参 数, 即 存 储 空 间, 所 以 当 问 题 要 求 的 数 据, 不 能 满 足 于 默 认 的 存 储 空 间 的 时 候, 这 时, 就 需 要 进 一 步 给 出 数 据 的 种 别 参 数, 这 是 更 加 详 细 的 数 据 描 述 如 果 在 真 实 世 界 问 题 当 中 出 现 的 的 数 据 对 象, 干 脆 不 符 合 已 有 的 固 有 数 据 类 型 以 及 数 组 的 定 义, 这 时 就 还 需 要 根 据 用 户 的 要 求 构 造 一 个 依 赖 于 问 题 的 特 定 的 数 据 结 构, 这 就 是 数 据 描 述 时 会 遇 到 的 第 三 种 情 况 对 于 这 三 种 情 况,FORTRAN 的 解 决 方 式 如 下 : 第 一 种 情 况 : 确 定 数 据 的 类 型 以 及 相 应 的 可 能 具 有 的 属 性

32 首 先,FORTRAN 所 能 辨 识 的 数 据 类 型 首 先 分 为 两 大 类 : 固 有 数 据 类 型 派 生 数 据 类 型 根 据 语 义 上 的 基 本 差 别, 数 据 首 先 具 有 一 些 基 本 的 类 型, 这 些 基 本 类 型 一 般 是 和 构 成 真 实 世 界 里 的 信 息 的 那 些 基 本 元 素 相 对 应, 比 方 说 数 字, 字 符 等 然 后 其 他 情 况 下 遇 到 的 数 据 都 可 以 由 这 些 基 本 数 据 类 型 组 合 得 到 不 过 一 种 语 言 具 体 的 规 定 哪 些 基 本 的 数 据 类 型, 往 往 受 到 该 种 语 言 主 要 应 用 的 场 合 的 影 响, 由 于 FORTRAN 主 要 用 来 进 行 科 学 计 算, 因 此 它 所 定 义 的 基 本 数 据 类 型, 正 是 与 我 们 在 科 学 计 算 问 题 当 中 遇 到 的 数 据 类 型 相 契 合 的 所 谓 固 有 类 型, 是 FORTRAN 语 言 所 定 义 的 最 基 本 的 数 据 类 型, 每 一 种 固 有 类 型 是 和 该 种 数 据 类 型 相 应 的 各 种 运 算 一 起 隐 式 定 义 的, 也 就 是 说 一 旦 声 明 引 入 某 种 固 有 数 据 类 型, 则 系 统 总 是 默 认 为 对 它 进 行 相 应 的 运 算 是 合 法 的, 并 且 总 是 可 访 问 的 这 样 就 做 到 了 每 种 数 据 类 型 都 和 它 相 应 的 运 算 捆 绑 在 一 起, 使 得 问 题 的 描 述 非 常 自 然 固 有 类 型 包 括 五 种 : 整 型 (INTEGER) 实 型 (REAL) 复 型 (COMPLEX) 逻 辑 型 (LOGICAL) 和 字 符 型 (CHARACTER) 这 个 分 类 完 全 是 遵 循 数 据 的 数 学 分 类, 即 整 型 指 整 数, 实 型 指 实 数, 复 型 指 复 数, 逻 辑 型 指 逻 辑 值, 字 符 型 则 是 语 言 的 基 本 元 素 这 样 就 可 以 把 基 本 的 数 学 语 言 一 一 对 应 的 直 接 翻 译 为 FORTRAN 语 言 所 谓 派 生 类 型 是 由 用 户 定 义 的, 非 隐 式 定 义 的 类 型, 只 要 用 一 个 类 型 定 义 来 声 明 其 成 员 是 何 种 固 有 类 型, 或 者 是 何 种 其 它 已 经 定 义 过 的 派 生 类 型, 就 能 够 被 FORTRAN 认 可 为 一 种 数 据 类 型 由 于 派 生 数 据 类 型 正 是 由 固 有 数 据 类 型 充 当 成 员 而 构 成 的, 因 此 在 结 构 关 系 上, 可 以 把 固 有 数 据 类 型 看 成 原 子, 而 把 派 生 数 据 类 型 看 成 分 子 由 于 语 言 的 根 本 目 的 就 是 为 描 述 算 法 服 务 的, 因 此 从 这 个 角 度 出 发, 派 生 数 据 类 型 本 质 上 体 现 了 非 常 重 要 的 数 据 抽 象 与 数 组 合 的 思 想, 由 于 我 们 需 要 运 用 语 言 来 描 述 的 问 题 是 开 放 性, 我 们 很 难 划 定 需 要 FORTRAN 来 描 述 的 问 题 的 范 围, 因 此 通 过 构 造 派 生 数 据 类 型, 使 得 我 们 可 以 很 自 然 而 简 洁 地 建 立 新 的 数 据 类 型 这 是 FORTRAN 在 FORTRAN77 标 准 之 后 的 一 个 重 大 进 步 派 生 类 型 数 据 最 重 要 的 用 途 就 是 扩 充 了 数 组 这 种 重 要 的 数 据 结 构, 由 于 数 组 在 科 学 计 算 领 域, 是 一 种 极 端 重 要 的 数 据 结 构 类 型,FORTRAN 除 了 能 够 直 接 描 述 数 组, 同 时 还 能 描 述 更 为 广 泛 的 派 生 数 据 类 型, 也 就 可 以 直 接 对 一 个 数 据 集 合 的 各 个 成 员 同 时 施 加 运 算, 拥 有 了 这 种 自 然 的 数 据 类 型, 就 避 免 了 象 FORTRAN 的 早 期 版 本 那 样, 需 要 通 过 特 别 设 计 的 算 法 来 实 现 这 种 运 算 所 谓 固 有 数 据 类 型 的 固 有, 对 于 FORTRAN 来 说, 就 是 为 每 一 种 固 有 数 据 类 型 规 定 了 它 的 存 储 模 式 在 FORTRAN77 及 其 之 前 的 标 准 里, 整 型, 实 型, 逻 辑 型 数 据 都 是 使 用 了 一 个 数 值 存 储 单 元, 而 复 型 和 双 精 度 数 据 则 使 用 了 两 个 数 值 存 储 单 元, 字 符 型 数 据 使 用 一 个 字 符 存 储 单 元 由 于 存 储 模 式 是 非 常 底 层 的 语 言 实 现 结 构, 因 此 FORTRAN 后 续 的 标 准 要 想 保 持 兼 容, 只 有 继 承 这 个 约 定 因 此 在 FORTRAN90 与 95 当 中, 默 认 的 整 型, 实 型, 逻 辑 型 数 据 都 是 使 用 了 一 个 数 值 存 储 单 元, 而 默 认 的 复 型 和 双 精 度 数 据 则 使 用 了 两 个 数 值 存 储 单 元, 默 认 的 字 符 型 数 据 使 用 一 个 字 符 存 储 单 元 而 作 为 语 言 的 一 个 发 展, 在 FORTRAN90 之 后 的 标 准 里, 开 始 允 许 在 一 个 程 序 单 元 内, 由 用 户 定 义 特 定 的 不 依 赖 于 固 有 数 据 存 储 模 式 的 数 据 类 型, 这 就 是 第 6 章 的 派 生 数 据 类 型 建 立 一 种 数 据 类 型, 最 大 的 好 处 就 是 可 以 把 相 关 的 运 算 和 数 据 捆 绑 在 一 起, 对 于 一 个 特 定 问 题 当 中 的 数 据 对 象, 是 否 应 该 被 明 确 地 看 成 数 据 类 型, 属 于 语 言 设 计 的 权 宜, 因 为 建 立 一 种 数 据 类 型 所 能 带 来 的 好 处 可 以 用 算

33 法 来 补 偿, 而 FORTRAN77 之 后 的 版 本 的 选 择 是 增 加 派 生 数 据 类 型, 这 样 使 得 我 们 可 以 在 进 行 科 学 计 算 时, 有 更 为 自 然 的 描 述 方 式 数 据 类 型 的 全 部 分 类 总 结 如 下 : 固 有 数 据 类 型 数 值 型 数 据 整 型 实 型 复 型 非 数 值 型 数 据 逻 辑 型 字 符 型 派 生 数 据 类 型 就 数 据 的 属 性 而 言, 类 型 当 然 是 最 重 要 的 属 性 了 在 指 定 类 型 之 后, 紧 接 着 的 就 是 根 据 实 际 情 况, 看 需 要 描 述 的 数 据 是 否 还 具 有 其 他 需 要 说 明 的 属 性 对 于 数 组 来 说, 具 有 一 个 基 本 的 属 性, 就 是 数 组 的 大 小, 相 应 的 就 是 如 何 指 定 数 组 的 存 储 空 间 的 大 小 的 问 题 由 于 FORTRAN 具 备 可 分 配 数 组 与 指 针 的 功 能, 因 此 在 程 序 开 头 并 不 一 定 需 要 指 定 数 组 的 大 小 ( 维 度 ), 在 程 序 执 行 过 程 当 中, 数 组 的 大 小 会 作 为 输 入 或 计 算 结 果 被 读 入, 这 个 指 标 可 以 针 对 具 体 的 问 题 的 要 求, 以 及 运 行 的 状 况 而 定 在 FOR TRAN 还 不 具 备 这 种 动 态 功 能 的 时 候, 就 需 要 在 数 组 声 明 里 指 定 数 组 的 维 度, 而 在 事 先 又 很 难 准 确 预 料 程 序 运 行 过 程 当 中 对 数 组 储 存 空 间 的 要 求, 因 此 如 果 指 定 的 数 组 过 大, 就 会 大 量 地 浪 费 当 时 非 常 宝 贵 的 内 存 空 间, 而 如 果 指 定 的 数 据 组 过 小, 则 肯 定 会 在 程 序 运 行 过 程 当 中 导 致 错 误 所 以 为 了 避 免 这 些 问 题, 现 在 一 般 不 会 在 数 据 声 明 的 时 候 精 确 指 定 数 组 大 小, 而 是 把 数 组 处 理 成 一 个 动 态 对 象, 从 而 有 效 地 回 避 了 这 个 问 题 数 据 的 一 个 重 要 属 性, 就 是 它 的 可 访 问 性 在 FORTRAN 语 言 里, 模 块 提 供 了 对 数 据 的 访 问 控 制 任 何 数 据 对 象 只 要 想 把 自 己 局 限 在 模 块 内 使 用, 模 块 就 能 够 提 供 足 够 的 保 护, 使 得 外 部 程 序 无 法 访 问 该 数 据 对 象 模 块 的 这 个 功 能 使 得 FORTRAN 成 为 一 种 安 全 可 靠 的 语 言 是 否 打 开 数 据 的 其 他 许 多 具 体 的 属 性, 取 决 于 具 体 的 数 据 应 用 环 境, 因 此 要 讨 论 数 据 的 每 一 种 属 性, 在 这 里 不 太 现 实, 我 们 只 有 等 到 下 面 具 体 地 说 明 每 一 种 声 明 语 句 时 再 具 体 说 明, 因 为 属 性 指 定 总 是 在 出 现 在 声 明 语 句 当 中 第 二 种 情 况 : 指 定 固 有 数 据 类 型 的 种 别 参 数 对 于 计 算 机 来 说, 在 确 定 数 据 的 类 型, 从 而 可 以 引 导 到 相 应 的 运 算 之 后, 进 一 步 就 需 要 为 数 据 在 内 存 指 定 存 储 位 置 和 存 储 空 间, 实 际 上 对 于 冯 纽 曼 型 计 算 机 来 说, 这 个 步 骤 是 非 常 关 键 的, 因 为 冯 纽 曼 型 计 算 机 的 要 点, 就 是 硬 件 之 外 的 一 切, 都 必 须 表 示 为 数 据, 都 必 须 存 储 在 内 存 当 中, 然 后 在 程 序 的 运 行 当 中, 随 时 与 CPU 进 行 通 讯, 因 此 在 程 序 的 开 头 就 明 确 数 据 在 内 存 当 中 的 位 置 与 每 个 数 据 所 占 有 空 间 的 大 小, 是 保 证 程 序 运 行 非 常 基 本 的 要 求 用 来 指 定 程 序 当 中 需 要 使 用 的 每 一 种 固 有 数 据 类 型 所 要 求 占 据 的 内 存 空 间 大 小 的 属 性 由 种 别 参 数 表 示 给 这 个 变 量 ( 参 数 ) 指 定 一 个 数 值, 就 可 以 说 明 数 据 所 需 要 的 存 储 空 间 的 大 小, 也 就 是 程 序 允 许 的 数 值 数 据 的 位 数 和 字 符 串 的 字 符 数 目

34 KIND( 种 类 种 别 参 数 ) 分 别 说 明 整 数 类 型 的 十 进 指 数 范 围, 实 数 类 型 和 复 数 类 型 的 十 进 制 精 度 和 指 数 范 围, 字 符 类 型 和 逻 辑 类 型 的 表 示 方 法 LEN( 长 度 种 别 参 数 ) 对 字 符 类 型 规 定 了 字 符 的 个 数 例 5-1 REAL(KIND=3)::ABC,X,LONG CHARACTER(LEN=40,KIND=GREECE)::NAME 具 体 的 种 别 参 数 的 约 定 是 与 语 言 的 具 体 实 现 相 关 的, 因 此 具 体 的 取 值 还 是 得 参 考 编 译 器 的 文 档 如 果 没 有 声 明 数 据 的 种 别, 那 么 程 序 就 会 采 用 默 认 的 参 数, 由 于 FORTRAN 的 早 期 版 本 没 有 引 入 种 别 参 数, 因 此 对 于 有 不 同 精 度 要 求 的 实 型 变 量, 直 接 采 用 了 两 种 不 同 的 数 据 类 型, 这 就 是 REAL 和 DOUBLE PRECISION, 从 FORTRAN90 以 来 的 版 本 里, 通 过 引 入 种 别 参 数, 对 种 别 参 数 的 不 同 取 值, 就 足 够 表 达 不 同 的 精 度, 而 同 时 为 了 保 证 和 早 期 版 本 的 兼 容, 单 独 的 数 据 类 型 声 明 DOUBLE PRECISION 还 是 被 保 存 下 来 了, 这 样 一 来, 就 产 生 了 一 个 有 一 定 任 意 性 的 后 果, 即 新 的 语 言 标 准 对 不 同 精 度 的 实 型 数 据, 可 以 通 过 使 用 同 一 个 数 据 类 型 的 不 同 的 种 别 参 数 值 来 表 示, 而 同 时 用 DOUBLE PRECISION 作 为 数 据 声 明 也 是 有 效 的, 这 样 就 保 证 了 源 码 向 前 的 兼 容 性, 却 不 具 备 向 后 的 兼 容 性 对 于 在 指 定 种 别 参 数 的 数 值 时, 一 般 是 以 字 为 单 位, 这 样 对 于 字 长 不 同 的 机 器 而 言, 相 互 之 间 就 会 出 现 程 序 移 植 的 困 难, 下 面 分 情 况 予 以 说 明 : 实 型 ---- 由 于 DOUBLE PRECISION 是 属 于 老 式 标 准 的 遗 留 物, 因 此 使 用 DOUBLE PRECISION 作 为 数 据 声 明 的 程 序 就 不 具 备 良 好 的 可 移 植 性, 因 为 所 谓 双 精 度 是 针 对 具 体 的 机 器 的 字 长 而 言 的, 对 于 32 位 的 机 器, 双 精 度 就 是 64 位, 而 对 于 64 位 机 器, 双 精 度 就 意 味 着 128 位, 这 样 在 不 同 字 长 的 机 器 环 境 里, 双 精 度 就 具 有 不 同 的 位 数, 使 得 程 序 无 法 在 不 同 字 长 的 平 台 之 间 进 行 直 接 的 移 植 因 此 在 这 种 情 况 下, 最 好 还 是 统 一 使 用 REAL 的 种 别 参 数 来 表 达 算 法 所 要 求 的 实 数 精 度 可 以 说 种 别 参 数 一 劳 永 逸 地 解 决 了 实 数 精 度 的 可 移 植 性 问 题 复 型 ---- 由 于 所 谓 复 型 本 质 上 就 是 由 两 个 实 数 表 达 的, 因 此 按 道 理 复 型 同 样 应 该 能 够 具 有 表 达 多 种 精 度 的 能 力, 而 实 际 上 早 期 的 版 本 在 这 方 面 是 有 欠 缺 的, 不 过 随 着 FORTRAN90 引 入 种 别 参 数, 就 可 以 在 COMPLEX 的 声 明 语 句 里 通 过 运 用 种 别 参 数 来 实 现 多 种 精 度 的 表 达, 对 于 任 何 FORTRAN 的 实 现, 至 少 能 表 达 两 种 精 度, 而 一 般 来 说 是 多 于 两 种 的 字 符 型 ---- 对 于 字 符, 一 般 的 机 器 都 是 用 单 字 节 8bits 来 表 示 一 个 字 符, 这 样 就 可 以 总 共 表 示 2 8 =256 个 不 同 的 字 符, 这 对 于 任 何 以 字 母 写 出 来 的 语 言 都 是 足 够 的 了, 不 过 对 于 汉 语, 日 语 这 样 一 些 语 言 就 不 够 用 了, 一 般 得 需 要 双 字 节, 即 16bits, 这 样 就 可 以 表 达 2 16 个 字 符 因 此 字 符 型 数 据 同 样 需 要 附 加 种 别 参 数, 以 便 除 了 使 用 默 认 的 基 本 字 符 之 外, 还 可 以 使 用 辅 助 字 符 集 里 的 字 符, 从 而 实 现 程 序 的 本 地 化 不 过 某 个 具 体 的 编 译 器 是 否 支 持 双 字 节 字 符, 必 须 参 考 相 应 的 手 册 因 为 FORTRAN 95 标 准 也 没 有 强 制 要 求 FORTRAN 的 任 何 实 现 都 必 须 支 持 双 字 节 字 符 逻 辑 型 ---- 由 于 一 切 逻 辑 型 数 据 都 只 有 两 个 值, 因 此 如 何 确 定 逻 辑 型 数 据 的 存 储 空 间 应 该 是 非 常 好 办 的, 不 过 不 幸 的 是,FORTRAN 的 早 期 版 本 规 定 逻 辑 型 数 据 使 用 和 实 型 数 据 一 样 大 小 的 机 器 存 储 单 位, 这 样 当 机 器 的 字 长 很 大 时, 就 会 非 常 的 浪 费 机 器 的 存 储 空 间 因 此 到 了 FORTRAN90 和 FORTRAN 95, 除 了 作 为 默 认 的 情 形, 和 旧 的 语 言 标 准 保 持 兼 容 之 外, 还 可 以 通 过 指 定 种 别 参 数, 使 得 逻 辑 型 数 据 的 存 储 空 间 大 小 只 有 一 个 字, 甚 至 一 个 bit 当 然 具 体 的 使 用 方 法 需 要 参 考 相 应 编 译 器 的 说 明

35 整 型 ---- 显 然 在 程 序 应 用 当 中 会 出 现 几 乎 任 何 大 小 的 整 型 数 据, 因 此 无 法 在 语 言 标 准 里 面 统 一 的 规 定 整 型 数 据 的 存 储 空 间 大 小, 这 就 同 样 需 要 依 靠 种 别 参 数 来 指 定 应 该 给 具 体 问 题 当 中 的 整 型 数 据 确 定 多 大 的 存 储 空 间 具 体 地 指 定 方 式 属 于 编 译 器 设 计 者 的 选 择, 需 要 参 考 相 应 编 译 器 的 语 言 说 明 第 三 种 情 况 : 派 生 数 据 类 型 数 据 的 本 义 就 是 对 真 实 世 界 里 的 事 物 的 描 述 这 种 描 述 可 以 是 简 单 的, 如 一 个 标 量, 也 可 以 是 复 杂 的, 如 一 个 张 量, 对 于 更 复 杂 的 对 象, 在 自 然 语 言 里 有 一 种 自 然 的 描 述 方 法, 就 是 使 用 一 系 列 的 词 汇, 每 个 词 汇 都 是 对 象 在 某 个 方 面 的 属 性 的 度 量 ; 在 计 算 机 语 言 里, 可 以 采 用 类 似 的 解 决 方 案, 即 把 对 象 的 每 一 个 需 要 描 述 的 性 质 用 一 个 适 当 的 基 本 数 据 类 型 来 表 示, 这 样 用 一 组 基 本 数 据 类 型 就 可 以 描 述 该 对 象 而 这 一 组 数 据 可 以 看 成 是 一 个 新 的 数 据 类 型, 表 示 了 一 个 变 量 这 样 构 造 出 来 的 数 据 类 型 称 为 派 生 数 据 类 型, 和 固 有 数 据 类 型 一 样, 在 声 明 派 生 数 据 类 型 时, 需 要 给 出 名 称, 描 述 它 的 每 一 个 元 素 的 固 有 数 据 类 型 以 及 相 应 属 性 和 种 别 参 数 ( 如 果 非 默 认 的 话 ), 当 然 也 需 要 适 当 地 定 义 其 运 算 既 然 这 种 派 生 数 据 类 型 是 由 一 组 数 组 成, 就 会 出 现 两 种 情 况 : 这 组 数 据 都 是 属 于 一 个 数 据 类 型 这 样 构 成 的 派 生 数 据 类 型 就 是 数 组, 显 然 对 于 数 组 的 元 素 的 描 述 就 可 以 统 一 进 行 具 体 的 用 法 会 在 后 面 专 门 说 明 这 组 数 据 的 各 个 元 素 属 于 不 同 的 数 据 类 型 这 样 构 成 的 派 生 数 据 类 型 称 为 结 构, 这 时 就 需 要 对 每 个 数 据 元 素 进 行 分 别 的 说 明, 即 每 一 个 元 素 的 数 据 类 型, 可 能 有 的 属 性, 种 别 参 数 等 等 上 面 对 派 生 数 据 类 型 的 描 述 实 际 上 是 递 归 式 的, 即 一 个 派 生 数 据 类 型 的 元 素 同 样 可 以 是 另 一 种 派 生 数 据 类 型, 而 没 有 限 定 必 须 是 固 有 数 据 类 型 例 5-2 下 面 是 一 个 典 型 的 派 生 数 据 类 型 TYPE SAMPLE REAL CURRENT COMPLEX (KIND = QUAD) PHASE CHARACTER (LEN = 50) SOURCE END TYPE SAMPLE TYPE (SAMPLE) SI401,SI402,SI403,SI404 在 上 面 的 例 子 里, 首 先 定 义 了 一 个 名 称 为 SAMPLE 的 数 据 类 型, 每 一 个 SAMPLE 类 型 的 数 据 由 三 个 分 量 组 成, 它 们 的 名 称 分 别 为 CURRENT,PHASE,SOURCE, 分 别 属 于 实 型, 复 型 和 字 符 型, 其 中 复 型 和 字 符 型 还 分 别 说 明 了 种 别 参 数 和 字 符 长 度 属 性, 然 后 给 出 了 程 序 当 中 需 要 使 用 的 四 个 属 于 该 种 数 据 类 型 的 变 量 :SI401,SI402,SI403,SI404 上 面 例 子 当 中 派 生 数 据 类 型 的 定 义, 以 TYPE 开 始, 以 END TYPE 结 束

36 5.3 数 据 不 同 种 类 的 存 储 模 式 对 于 计 算 机 来 说, 数 据 分 类 的 第 一 个 反 应 就 是 针 对 不 同 类 型 的 数 据 约 定 不 同 的 存 储 模 式 由 于 存 储 模 式 的 规 定 涉 及 到 编 译 环 境 的 设 置, 因 此 存 储 模 式 的 约 定 是 与 系 统 环 境 相 关 的, 鉴 于 Compaq Visual Fortran 的 广 泛 应 用, 本 节 特 别 针 对 Compaq Visual Fortran 系 统 而 言 的 说 明 了 数 据 的 各 种 存 储 模 式 下 表 5-1 列 出 了 Compaq Visual Fortran 所 有 的 固 有 数 据 类 型 的 存 储 空 间 要 求, 和 相 应 的 能 够 在 这 个 空 间 里 表 达 的 数 据 规 模 表 5-1 固 有 数 据 类 型 的 存 储 模 式 : 数 据 类 型 单 位 存 储 空 间 能 表 示 的 数 据 规 模 BYTE INTEGER(1) 1 byte (8 bits) BYTE 表 示 等 价 于 INTEGER(1) 的 带 符 号 的 整 型 数 据 类 型 INTEGER 参 见 INTEGER(2), INTEGER(4), 以 及 INTEGER(8). 带 符 号 的 整 型 数 据, 包 括 INTEGER(2), INTEGER(4), or INTEGER(8) 数 据 规 模 由 编 译 器 选 项 /integer_size:nn 控 制 默 认 的 规 模 控 制 选 项 为 /integer_size:32 ( 等 价 于 INTEGER(4)) INTEGER(1) 1 byte (8 bits) 从 -128 到 127 带 符 号 的 整 数 INTEGER(2) 2 bytes (16 bits) 从 -32,768 到 32,767 带 符 号 的 整 数 INTEGER(4) 4 bytes (32 bits) 从 -2,147,483,648 到 2,147,483,647 带 符 号 的 整 型 数 据 INTEGER(8) 8 bytes (64 bits) 从 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 带 符 号 的 整 型 数 据 REAL(4) REAL REAL(8) DOUBLE PRECISION 4 bytes (32 bits) 从 E-38 到 E38 的 按 照 IEEE S_floating 格 式 的 单 精 度 实 型 浮 点 值 在 E-38 和 E-45 之 间 的 值 是 非 常 态 的 8 bytes (64 bits) 从 D-308 到 D308 的 按 照 IEEE T_floating 格 式 的 双 精 度 实 型 浮 点 值 在 D-308 和 D-324 之 间 的 值 是 非 常 态 的 COMPLEX(4) 8 bytes (64 bits) 由 一 对 从 E-38 到 E38 的 按 照 IEEE COMPLEX S_floating 格 式 的 单 精 度 实 型 浮 点 值 组 成 的 单 精 度 复 型 浮 点 值 在 E-38 和 E-45 之 间 的 值 是 非 常 态 的 COMPLEX(8) 16 bytes (128 bits) 由 一 对 从 D-308 到 DOUBLE COMPLEX D308 的 按 照 IEEE T_floating 格 式 的 双 精 度 实 型 浮 点 值 组 成 的 双 精 度 复 型 浮 点 值 在 D-308 和 D-324 之 间 的 值 是 非 常 态 的 LOGICAL 参 见 LOGICAL(2), 逻 辑 型 值, 包 括 LOGICAL(2), LOGICAL(4), 以 及 LOGICAL(4), 以 及 LOGICAL(8). LOGICAL(8). 数 据 规 模 由 编 译 器 选 项 /integer_size:nn 控 制 默 认 的 规 模 控 制 选 项 为 /integer_size:32 ( 等 价 于

37 LOGICAL(4)) LOGICAL(1) 1 byte (8 bits) 逻 辑 型 值.TRUE. 或.FALSE. LOGICAL(2) 2 bytes (16 bits) 逻 辑 型 值.TRUE. 或.FALSE. LOGICAL(4) 4 bytes (32 bits) 逻 辑 型 值.TRUE. 或.FALSE. LOGICAL(8) 8 bytes (64 bits) 逻 辑 型 值.TRUE. 或.FALSE. CHARACTER 每 个 字 符 1 byte (8 根 据 约 定 的 字 符 编 码 表 示 的 字 符 数 据, 通 过 字 符 数 据 的 声 bits) 明 形 式 :CHARACTER(LEN=n) 或 CHARACTER*n, 其 中 n 表 示 byte 数, 来 表 示 数 据 规 模 HOLLERITH 每 个 Hollerith 字 符 1 Hollerith 常 量 byte (8 bits) 表 中 的 INTEGER(4) 等 价 于 INTEGER(KIND=4) 以 及 INTEGER* FORTRAN 数 据 类 型 描 述 的 四 个 基 本 属 性 一 个 数 据 如 何 才 是 被 完 备 描 述 了, 以 及 FORTRAN 所 要 求 的 描 述 一 个 数 据 的 要 素 是 哪 些, 是 一 个 问 题 的 两 面 这 个 问 题 对 于 程 序 的 作 者 是 很 重 要 的, 因 为 FORTRAN 现 在 允 许 用 户 自 己 定 义 合 乎 自 己 需 要 的 派 生 数 据 类 型, 这 就 要 求 我 们 知 道 一 个 派 生 数 据 类 型 的 定 义 是 否 完 备 FORTRAN 的 数 据 类 型 必 须 包 含 如 下 四 个 部 分 : 数 据 类 型 的 名 称 数 据 取 值 的 集 合 可 以 施 加 于 数 据 的 值 的 运 算 该 数 据 类 型 的 常 量 的 表 示 形 式 数 据 类 型 的 名 称 要 能 够 说 明 数 据 的 类 型 所 属, 首 先 每 种 数 据 类 型 本 身 得 有 个 名 称, 才 能 在 描 述 数 据 对 象 的 时 候, 说 某 个 数 据 对 象 属 于 某 个 数 据 类 型 固 有 数 据 类 型 就 只 有 5 种, 它 们 的 名 称 :INTEGER,REAL,COMPLEX,LOGICAL, CHARACTER 是 语 言 标 准 的 规 定 但 派 生 数 据 类 型 则 完 全 是 程 序 作 者 自 定 义 的, 因 此 必 须 由 作 者 使 用 TYPE 来 给 出 其 构 造 的 派 生 数 据 类 型 的 名 称, 也 就 是 说 只 要 一 个 数 据 或 一 个 变 量 的 取 值 符 合 TYPE 与 END TYPE 之 间 的 定 义, 就 被 该 程 序 单 元 识 别 为 属 于 该 数 据 类 型, 就 可 以 应 用 相 应 的 运 算 如 果 一 个 程 序 单 元 里 出 现 的 数 据 不 能 被 识 别 为 该 程 序 单 元 的 数 据 声 明 里 的 诸 种 类 型, 那 么 FORTRAN 还 会 尝 试 运 用 一 种 方 式 来 试 图 确 定 它 的 数 据 类 型, 就 是 根 据 数 据 名 称 的 第 一 个 字 符 来 进 行 判 别, 这 种 方 式 属 于 FORTRAN 的 古 老 传 统, 因 为 早 期 FORTRAN 所 处 理 的 数 据 类 型 比 较 单 纯, 顾 可 以 如 此 简 化 处 理,FORTRAN90 与 FORTRAN 95 都 继 承 了 这 点 数 据 取 值 的 集 合 对 于 每 种 数 据 类 型, 存 在 一 个 允 许 的 具 体 取 值 的 集 合 而 属 于 该 数 据 类 型 的 变 量 的 取 值 范 围

38 必 定 是 在 这 个 集 合 内 表 面 看 起 来 数 据 类 型 的 取 值 集 合 都 是 明 确 的 数 学 意 义, 但 是 由 于 本 质 上 计 算 机 的 任 何 具 体 取 值, 都 必 须 是 有 限 的, 因 此 数 据 类 型 表 面 的 所 谓 数 学 涵 义 并 不 是 很 符 合 实 际 的 固 然 整 型 必 定 是 取 整 数 值, 但 只 能 取 有 限 的 整 数 值, 而 且 这 个 值 还 有 上 限, 即 一 个 整 型 数 据 能 够 取 多 大 的 整 数 不 仅 在 机 器 的 硬 件 方 面 有 制 约, 在 语 言 的 具 体 实 现 上 也 进 行 了 约 束 同 样, 对 于 实 型 来 说, 更 不 可 能 就 是 和 实 数 集 合 等 价, 实 型 数 据 的 具 体 取 值 同 样 只 能 取 可 有 限 表 示 的 实 数, 即 有 限 小 数 至 于 某 些 软 件 ( 如 MATHEMATICA) 声 称 可 以 精 确 的 引 用 无 理 常 数, 例 如 欧 拉 常 数, 实 际 上 是 使 用 了 一 个 收 敛 级 数 来 表 达 无 理 常 数, 只 有 当 用 户 指 定 有 理 表 示 的 精 度 后, 计 算 机 才 对 级 数 做 相 应 的 截 断, 给 出 相 应 精 度 的 有 理 表 示, 而 并 不 是 说 该 常 数 的 无 限 位 表 示 完 全 存 储 在 计 算 机 里 面 逻 辑 型 数 据 能 够 取 得 的 值 的 个 数 是 完 全 确 定 的, 即 仅 有 真 和 假 两 个 值 ( 即 两 个 元 素 ) 由 此 可 见 所 有 逻 辑 型 变 量 都 是 某 种 判 断, 而 对 该 判 断 的 取 值 只 能 或 真 或 假, 这 里 实 际 上 就 规 定 了 FORTRAN 语 言 只 能 用 来 表 述 满 足 排 中 律 的 数 学 对 于 整 型 和 实 型 来 说, 既 然 只 可 能 取 有 限 值, 那 么 剩 下 的 问 题 就 是 如 何 给 某 个 具 体 取 值 分 配 存 储 空 间 了, 由 于 程 序 单 元 是 根 据 数 据 声 明 当 中 对 数 据 取 值 的 规 划 来 确 定 如 何 为 数 值 分 配 存 储 空 间 的, 因 此 对 于 具 有 极 大 处 理 能 力 的 现 代 计 算 机 而 言, 最 好 针 对 数 值 占 用 空 间 的 大 小 进 行 分 级, 以 做 到 在 保 证 数 值 表 达 需 求 的 前 提 下, 尽 量 避 免 存 储 空 间 的 浪 费 FORTRAN 为 了 给 数 值 占 用 空 间 的 大 小 分 级, 引 入 了 种 别 参 数 (K1ND), 使 得 在 数 据 声 明 的 时 候, 就 可 以 一 致 地 规 定 该 类 数 据 在 表 达 时, 允 许 占 用 空 间 的 大 小 例 如 整 型 除 了 默 认 表 示 之 外, 还 可 以 标 志 以 种 别 参 数 SHORT, 这 个 参 数 意 味 着 在 整 型 的 默 认 取 值 范 围 了 划 出 了 一 个 子 集, 只 要 是 属 于 这 个 子 集 的 数 据, 允 许 系 统 给 它 分 配 较 为 小 的, 但 更 为 合 算 的 存 储 空 间 对 于 实 型 来 所, 则 完 全 可 以 根 据 算 法 的 需 要, 在 开 始 的 数 据 声 明 里, 就 给 程 序 单 元 里 可 能 出 现 的 数 据 划 出 三 流 九 等, 使 得 程 序 对 存 储 空 间 的 占 用 更 为 合 理 当 然 FORTRAN 语 言 标 准 只 是 规 定 了 实 型 必 须 至 少 在 默 认 精 度 种 别 之 外, 还 需 要 有 一 个 双 精 度 种 别, 而 在 FORTRAN 的 各 种 编 译 实 现 里, 还 可 以 规 定 更 多 的 精 度 种 别 对 于 字 符 型 数 据 来 说, 它 的 存 储 空 间 完 全 和 字 符 串 长 度 成 正 比, 因 此 只 要 直 接 规 定 字 符 串 的 字 符 个 数, 就 可 以 一 致 地 得 到 其 存 储 空 间 分 配 标 准 至 于 复 型 和 派 生 类 型, 则 完 全 以 其 他 数 据 类 型 作 为 成 员, 自 身 没 有 什 么 特 别 的 规 定, 因 此 也 就 没 有 独 特 的 针 对 这 两 种 数 据 类 型 的 种 别 参 数 显 然,FORTRAN 通 过 运 用 种 别 参 数 来 明 确 地 规 定 数 据 的 表 示, 使 得 Fortran 的 标 准 化 程 度 得 到 了 进 一 步 提 高, 从 而 提 高 了 程 序 的 可 移 植 性 数 据 类 型 的 合 法 运 算 允 许 施 加 于 数 据 的 运 算 同 样 可 以 分 为 两 类, 即 与 固 有 数 据 类 型 相 应 的 固 有 运 算, 还 有 自 定 义 运 算 由 于 在 FORTRAN 里 面, 运 算 的 主 要 语 法 功 能 是 构 成 表 达 式, 因 此 详 细 的 关 于 运 算 的 讨 论, 参 见 有 关 表 达 式 的 章 节 1. 固 有 运 算 固 有 运 算 就 是 固 有 数 据 类 型 在 FORTRAN 里 面 指 定 了 表 示 符 从 而 可 以 直 接 引 用 的 那 些 固 有 运 算, 根 据 运 算 所 能 施 加 的 算 元 据 的 不 同, 一 共 分 为 四 类 :

39 1. 算 术 运 算 2. 串 联 运 算 3. 关 系 运 算 4. 逻 辑 运 算 简 述 如 下 : 算 术 运 算 针 对 三 种 数 值 型 数 据, 可 以 直 接 引 用 7 种 固 有 的 算 术 运 算 : 2 种 一 元 运 算 : 求 反 运 算, 其 运 算 符 为 -; 求 同 运 算, 其 运 算 符 为 + 这 两 种 一 元 运 算 可 以 施 加 于 任 意 数 值 型 数 据 和 种 别 参 数 的 组 合, 其 运 算 结 果 的 数 据 类 型 与 种 别 参 数 和 算 元 的 数 据 类 型 和 种 别 参 数 保 持 一 致 5 种 二 元 运 算 是 : 加 法 运 算, 其 运 算 符 为 +; 减 法 运 算, 其 运 算 符 为 -; 乘 法 运 算, 其 运 算 符 为 *; 除 法 运 算, 其 运 算 符 为 /; 乘 幂 运 算, 其 运 算 符 为 ** 这 5 种 运 算 的 两 个 算 元 可 以 是 数 值 型 数 据 的 任 意 数 据 类 型 与 任 意 种 别 参 数 的 任 意 组 合 如 果 参 与 运 算 的 两 个 算 元 不 是 同 一 个 类 型 或 种 别 参 数 不 同, 那 么 FORTRAN 如 何 决 定 结 果 的 数 据 类 型 或 种 别 参 数 呢? 基 本 的 原 则 就 是 向 需 要 存 储 空 间 大 的 操 作 数 看 齐, 以 免 损 失 算 元 的 信 息 具 体 地 说, 就 是 : 若 两 个 算 元 是 相 同 类 型 和 相 同 种 别 参 数, 则 运 算 结 果 的 类 型 与 种 别 参 数 就 是 算 元 的 类 型 与 种 别 参 数 若 两 个 算 元 都 是 整 型 但 种 别 参 数 不 同, 则 运 算 结 果 的 种 别 参 数 是 取 十 进 制 幂 范 围 大 的 那 个 算 元 的 种 别 参 数 ; 若 范 围 一 样 大, 则 由 系 统 决 定 当 一 个 算 元 是 整 型 另 一 算 元 是 实 型 或 复 型, 则 运 算 结 果 的 种 别 参 数 就 取 那 个 实 型 或 复 型 的 算 元 的 种 别 参 数 若 两 个 算 元 属 于 不 同 种 别 参 数 的 实 型 或 复 型 数 据, 则 运 算 结 果 的 种 别 参 数 取 十 进 制 精 度 高 的 那 个 算 元 的 种 别 参 数 ; 若 精 度 一 样, 则 由 系 统 决 定 取 舍 规 定 了 运 算 结 果 的 属 性, 具 体 的 值 就 是 通 常 的 算 术 运 算 的 结 果, 即 加 法 为 两 个 算 元 之 和 ; 减 法 为 两 个 算 元 之 差 ; 乘 法 为 两 个 算 元 之 积 ; 除 法 为 两 个 算 元 之 商, 如 果 两 个 算 元 都 是 整 型 数 据, 它 们 相 除 时 称 为 整 除, 其 结 果 商 就 是 首 先 进 行 算 术 上 的 除 法 运 算, 得 到 的 商 去 掉 小 数 部 分, 取 得 的 整 数 值 即 为 整 除 的 结 果 这 是 为 了 满 足 上 面 关 于 保 持 类 型 一 致 性 的 规 则 例 如 :99/100 的 值 为 0;(-99)/100 的 值 为 0;58/3 的 值 为 19;(-58)/3 的 值 为 -19 乘 幂 为 以 第 一 个 算 元 为 底, 第 二 个 算 元 为 指 数 的 乘 幂 值 串 联 运 算 针 对 相 同 种 别 参 数 的 字 符 型 数 据 定 义 了 串 联 运 算, 其 运 算 符 是 // 串 联 运 算 的 结 果 为 保 持 种 别 参 数 不 变 的 字 符 型 数 据 运 算 结 果 的 值 为 第 一 算 元 的 字 符 值, 在

40 右 边 紧 接 第 二 个 算 元 的 字 符 值 例 如 :ABC//RTY 的 值 为 ABCRTY 关 系 运 算 关 系 运 算 是 分 别 针 对 整 型 实 型 复 型 和 字 符 型 数 据 来 定 义 的 二 元 运 算 关 系 运 算 的 结 果 为 逻 辑 型 数 据, 即 只 能 取.TRUE. 和.FALSE. 两 个 值 之 一 FORTRAN 95 定 义 了 六 种 固 有 关 系 运 算, 这 六 种 固 有 关 系 运 算 根 据 其 可 以 施 加 的 操 作 数 的 不 同, 又 可 以 分 为 两 类 : 可 以 施 加 于 除 复 型 之 外 的 数 值 类 型, 种 别 参 数 以 及 字 符 型 的 第 一 类 : 大 于, 其 运 算 符 为.GT., 或 >; 大 于 等 于, 其 运 算 符 为.GE., 或 >=; 小 于, 其 运 算 符 为.LT., 或 <; 小 于 等 于, 其 运 算 符 为.LE., 或 <=; 可 以 施 加 于 所 有 数 值 型 与 字 符 型 的 第 二 类 : 等 于, 其 运 算 符 为.EQ., 或 ==; 不 等 于, 其 运 算 符 为.NE., 或 /= 对 于 数 值 型 数 据 来 说, 关 系 运 算 具 有 通 常 的 涵 义, 并 且 两 个 算 元 可 以 是 任 意 的 数 值 型 类 型 与 任 意 种 别 参 数 的 组 合 当 然 只 有 复 型 不 能 比 较 大 小, 而 只 能 比 较 是 否 相 等 对 于 字 符 数 据 来 说, 关 系 运 算 具 有 独 特 的 涵 义 首 先 要 求 两 个 算 元 具 有 相 同 的 种 别 类 型 参 数, 但 是 可 以 具 有 任 意 的 长 度 其 关 系 运 算 的 执 行 可 以 理 解 为 执 行 下 列 几 个 步 骤 : (1) 首 先 使 两 个 作 为 算 元 的 字 符 串 的 字 符 长 度 变 为 一 致, 如 果 相 对 来 说 有 个 字 符 的 长 度 较 短, 就 在 右 边 以 空 格 字 符 填 充, 直 到 两 个 算 元 长 度 相 同 为 止 (2) 然 后 对 两 个 算 元 按 字 符 位 置 从 左 边 第 一 个 字 符 开 始 逐 个 进 行 比 较 判 别, 直 到 足 够 判 别 关 系 是 否 成 立 为 止 (3) 而 字 符 的 比 较 是 按 字 符 在 字 符 集 中 排 列 序 列 的 位 置 的 先 后 来 进 行 的 : 若 字 符 1 在 字 符 2 之 前, 则 认 为 满 足 小 于 关 系, 小 于 等 于 关 系 和 不 等 于 关 系 ; 若 字 符 1 在 字 符 2 之 后, 则 认 为 满 足 大 于 关 系, 大 于 等 于 关 系 和 不 等 于 关 系 ; 如 果 位 置 相 同, 即 为 同 一 个 字 符, 则 认 为 满 足 等 于 关 系 所 有 空 串 都 是 相 等 的 等 于 关 系 和 不 等 于 关 系 的 运 算 结 果 与 字 符 集 序 列 无 关, 而 其 它 四 种 关 系 的 运 算 结 果 是 依 赖 于 字 符 集 排 列 序 列 的 由 于 ASCII 的 排 列 序 列 对 于 任 何 系 统 都 是 一 致 的, 所 以 一 般 而 言 可 移 植 性 是 能 得 到 保 证 的 如 果 参 与 运 算 的 默 认 字 符 数 据 值 全 是 字 母 或 全 是 数 字, 则 按 语 言 的 规 定, 其 顺 序 是 严 格 确 定 的 ; 如 果 参 与 运 算 的 默 认 字 符 数 据 值 参 杂 了 字 母 与 数 字, 则 把 其 中 的 数 字 看 成 字 符, 而 排 序 则 依 赖 于 系 统 的 具 体 规 定 所 以 在 使 用 时 要 注 意 这 点 如 果 参 与 运 算 的 字 符 数 据 值 包 含 了 非 默 认 的 字 符 型 数 据, 则 同 样 依 赖 于 系 统 的 规 定 逻 辑 运 算 针 对 任 意 种 别 参 数 的 逻 辑 型 数 据 定 义 五 种 逻 辑 运 算 我 们 知 道 数 值 型 数 据 和 字 符 型 数 据 进 行 关 系 运 算 后 的 结 果 是 逻 辑 型 数 据, 此 外 还 可 以 根 据 算 法 的 需 要 自 定 义 逻 辑 型 数 据, 逻 辑 运 算 就 是 施 加 于 逻 辑 型 数 据, 而 得 到 逻 辑 型 数 据 值 的 运 算 根 据 算 元 的 数 目, 逻 辑 运 算 包 含 两 种, 其 中 一 元 运 算 为 :

41 非 运 算, 运 算 符 为.NOT.; 非 运 算 的 运 算 结 果 定 义 如 下 表 5-2: 表 5-2 非 运 算 的 运 算 结 果.NOT. 的 算 元.TRU E..FALSE..NOT. 的 运 算 值.FALSE..TRUE. 二 元 运 算 包 括 : 与 运 算, 运 算 符 为.AND.; 或 运 算, 运 算 符 为.OR.; 逻 辑 等 价 运 算, 运 算 符 为.EQV.; 逻 辑 不 等 价 运 算, 运 算 符 为.NEQV.; 各 运 算 的 结 果 定 义 如 下 列 各 表 : A.AND.B 表 5-3 与 运 算 的 运 算.TRUE..FALSE. A.TRUE..TRUE..FALSE. B.FA LSE..FALSE..FALSE. A B 表 5-4 或 运 算 的 运 算 A.OR. B A.TRUE. B.FALSE. A.TRUE..T RUE..TRUE. B.FALSE..TRUE..FALSE. A.EQV.B 表 5-5 逻 辑 等 价 运 算 的 运 算 A B.TRUE..FALSE. A.TRUE..TRUE..FALSE. B.FALSE..FALSE..TRUE. 表 5-6 逻 辑 不 等 价 运 算 的 运 算 A.NEQV.B A.TRUE. B.FALSE. A.TRUE..FALSE..TRUE. B.FALSE..TRUE..FALSE. 逻 辑 运 算 的 结 果 的 种 别 参 数 的 约 定 : 当 两 个 算 元 的 种 别 参 数 相 同 时, 则 结 果 的 种 别 参 数 与 算 元 的 相 同 ; 当 两 个 算 元 的 种 别 参 数 不 同 时, 则 结 果 的 种 别 参 数 依 赖 于 系 统 的 约 定

42 2. 自 定 义 运 算 由 于 上 面 列 出 的 固 有 运 算, 并 不 能 满 足 我 们 在 构 造 表 达 式 时 对 运 算 的 全 部 需 求 显 然, 要 使 得 语 言 具 有 开 放 性, 就 不 可 能 期 望 通 过 指 定 有 限 的 对 象 来 概 括 任 意 需 求, 因 此 必 然 需 要 制 定 一 个 构 造 规 则, 以 便 允 许 程 序 作 者 自 定 义 运 算 所 谓 自 定 义 运 算 就 是 需 要 程 序 作 者 根 据 算 法 的 需 要 自 己 来 定 义 的 运 算 从 语 法 的 角 度 来 讲, 一 个 运 算 的 定 义 包 括 三 个 部 分 : 符 号 的 表 示 ; 所 谓 符 号 的 表 示 就 是 给 出 运 算 的 名 称, 命 名 规 则 为 一 个 字 符 串 的 左 右 分 别 加 一 个 小 数 点 ( 句 点 ) 例 5-3.REMAINDER..REVERSE..INTEGRAL. 固 有 运 算 的 表 示 符 号 除 了 通 常 的 数 学 表 示 符 号 之 外, 同 时 还 有 一 套 等 价 的 字 符 串 加 左 右 句 点 的 表 示 方 法, 这 就 和 自 定 义 运 算 的 符 号 表 示 统 一 起 来 了 这 样 做 的 好 处 就 是 可 以 用 符 号 串 直 接 作 为 文 字 来 表 示 运 算 的 涵 义,( 例 如 上 面 的 三 个 名 称 就 可 以 用 来 表 示 求 余, 反 号, 求 积 分 这 三 种 运 算 ), 从 而 便 于 程 序 的 写 作 和 阅 读 这 是 一 个 值 得 遵 循 的 良 好 的 写 作 风 格 运 用 固 有 运 算 的 组 合 给 出 的 自 定 义 运 算 的 定 义 ; 自 定 义 运 算 的 定 义 是 通 过 函 数 用 OPERATOR 来 完 成 的, 具 体 的 说 明 见 有 关 过 程 的 章 节 自 定 义 运 算 的 算 元 集 合 的 描 述 数 学 上 定 义 一 个 函 数, 必 定 要 指 出 函 数 的 定 义 域, 同 样 一 种 自 定 义 的 运 算 也 需 要 指 定 能 够 施 加 于 其 上 的 算 元 的 范 围, 这 里 包 括 如 下 几 种 情 况 : 定 义 在 某 个 固 有 数 据 类 型 的 真 子 集 上 ; 如 果 对 一 个 固 有 运 算 也 做 这 样 的 限 制, 那 么 就 把 这 个 固 有 运 算 看 成 自 定 义 运 算 了 定 义 在 不 止 一 个 固 有 数 据 类 型 上, 例 如 数 值 型 数 据 和 字 符 型 数 据 的 某 种 组 合 上 ; 可 以 针 对 某 个 固 有 运 算 做 这 样 的 扩 展, 同 样 视 之 为 自 定 义 运 算 定 义 在 派 生 数 据 类 型 上 ; 这 样 得 首 先 定 义 该 派 生 数 据 类 型 定 义 在 上 述 任 意 情 形 的 组 合 而 成 的 集 合 上 数 据 类 型 的 常 量 的 表 示 形 式 数 据 在 程 序 当 中 的 行 为, 除 了 以 指 定 数 据 类 型 的 变 量 形 式 出 现 之 外, 还 有 就 是 以 常 量 形 式 出 现, 也 就 是 给 出 某 个 数 据 类 型 的 具 体 取 值 的 形 式 因 此 对 于 数 据 类 型 的 说 明, 还 包 括 给 出 该 数 据 类 型 的 常 量 的 书 写 语 法 例 5-4 下 面 给 出 每 一 种 数 据 类 型 的 说 明 常 量 的 例 子 : 例 子 数 据 类 型 例 子 的 取 值

43 345 INTEGER 或 7.132E2 REAL (2.77,5.38).TRUE. SPACE_A SAMPLE(1.582,(3.2,5.5), CHENG ) COMPLEX LOGICAL CHARACTER 派 生 类 型 i TRUE SPACE_A SAMPLE(1.582, i, CHENG ) 可 以 看 出, 对 于 数 值 型 数 据, 直 接 给 出 常 量 数 据, 就 可 以 了, 而 对 于 字 符 型 数 据 则 需 要 写 在 定 界 符 里 面, 对 于 派 生 类 型 则 需 要 遵 循 派 生 数 据 类 型 的 说 明 语 法 当 然 一 个 数 据 类 型 里 的 常 量 同 样 具 有 种 别 参 数 的 属 性, 只 要 给 出 的 常 量 不 是 属 于 默 认 的 种 别, 就 需 要 给 常 量 加 上 种 别 参 数, 而 种 别 参 数 有 两 种 情 况 : 一 种 是 采 用 整 数, 由 于 不 同 的 编 译 器 对 于 这 些 整 数 的 具 体 解 释 有 可 能 是 不 同 的, 因 此 会 妨 碍 程 序 的 可 移 植 性 ; 一 种 是 采 用 命 名 常 量 来 作 为 种 别 参 数, 那 么 只 要 这 些 命 名 常 量 一 直 被 使 用, 就 能 保 证 对 它 的 解 释 的 一 致 性 例 5-5 类 型 INTEGER REAL 例 子 2_SHORT _QUAD COMPLEX ( _HIGH, 56.2) LOGICAL.TRUE._BYTE CHARACTER CHINESE_ 例 子 例 子 里 SHORT,QUAD,HIGH,BYTE,CHINESE 都 是 命 名 常 量 对 于 整 型, 实 型, 复 型 和 逻 辑 型 来 说, 种 别 参 数 写 在 数 据 的 右 边, 以 下 划 线 隔 开, 而 字 符 型 则 是 写 在 数 据 的 左 边, 同 样 以 下 划 线 隔 开 5.5 数 据 的 基 本 类 型 : 固 有 数 据 类 型 对 于 计 算 机 来 说, 数 据 的 意 义 无 非 就 是 要 知 道 在 存 储 空 间 为 一 个 特 定 的 数 据 划 出 多 大 的 空 间 来 装 载 它, 然 后 才 谈 得 上 给 每 一 个 数 据 编 制 地 址, 从 而 随 时 可 以 对 数 据 进 行 读 入 读 出 操 作 确 定 数 据 占 用 空 间 大 小 的 自 然 方 式 就 是 统 一 地 给 一 类 数 据 指 定 固 定 的 存 储 模 式, 这 就 是 FORTRAN 早 期 的 做 法, 即 整 型, 实 型, 逻 辑 型 统 一 地 用 一 个 数 值 存 储 单 位 来 存 储, 而 双 精 度 实 型 与 复 型 则 统 一 采 用 两 个 数 值 存 储 单 位 来 存 储, 字 符 型 数 据 则 统 一 采 用 一 个 字 符 存 储 单 位 来 存 储 由 于 数 值 存 储 与 字 符 存 储 具 有 不 一 样 的 情 况, 因 此 这 两 种 存 储 单 元 的 字 节 数 大 小 不 一 样 不 过 语 言 的 进 步, 毋 宁 说 是 算 法 的 进 步, 要 求 语 言 能 够 提 供 更 加 灵 活 的 存 储 模 式 的 可 选 择 性, 这 就 是 FORTRAN90 引 进 的 种 别 参 数, 这 样 就 扩 充 了 固 有 数 据 类 型 的 存 储 模 式 同 时 为 了 使 得 程 序 能 够 与 旧 的 标 准 兼 容, 一 般 采 取 在 默 认 的 情 况 下 采 取 旧 的 存 储 模 式, 而 需 要 扩 充 时, 则 额 外 加 上 种 别 参 数 数 据 的 存 储 模 式 是 通 过 对 数 据 进 行 声 明 来 指 定 的 详 尽 的 声 明 语 句 的 使 用 参 见 数 据 的 声 明, 不 过 下 面 我 们 给 出 描 述 各 个 数 据 类 型 的 四 个 基 本 属 性 的 词 法 与 句 法, 以 备 寻 检

44 5.5.1 整 型 何 谓 FORTRAN 里 的 整 数? 数 学 上 的 整 数 用 整 型 数 据 来 表 示 而 所 谓 整 数, 具 体 表 示 出 来, 在 数 学 上 一 般 的 表 示 形 式 如 下 : l i = s w r k= 1 k 1 其 中 : i 是 一 个 任 意 的 整 数 s 表 示 正 负 符 号 ( 可 以 取 +1 或 -1) l 是 一 个 正 整 数, 表 示 i 的 位 数, 即 表 示 i 需 要 多 少 个 数 字 r 是 一 个 大 于 1 的 正 整 数, 表 示 i 的 进 制 的 基 数, 即 逢 r 进 一 位 的 意 思 w 是 一 个 小 于 r 的 非 负 整 数, 表 示 了 i 的 每 一 位 的 值 k 例 如 一 个 形 如 -41 的 整 数, 也 可 以 表 示 为 二 进 制 形 式 , 因 为 我 们 有 : ( 1) ( ) i = s w k = 41 要 完 全 的 描 述 整 数 i, 显 然 s,l,r,w k (k=1,2, l) 这 些 数 值 都 是 必 须 提 供 的 例 如 给 出 十 进 制 整 数 -41, 实 际 上 也 就 是 提 供 了 s=-1;l=2;r=10;w 1 =1;w 2 =4 这 一 套 完 整 的 信 息 不 过 如 果 我 们 的 目 的 是 描 述 一 个 取 整 数 值 的 变 量 n 的 数 据 类 型, 显 然 s 和 w k (k=1,2, l) 都 无 须 给 出, 而 整 型 数 据 的 分 类 都 是 围 绕 l 和 r 来 进 行 的 例 5-6 下 面 的 带 种 别 参 数 的 整 型 数 据 的 声 明 语 句 : INTEGER(4) i 实 际 上 表 示 的 是 如 下 形 式 的 整 数 : 31 k=1 k 2 k 1 也 就 是 取 l=31 和 r=2 下 面 我 们 就 给 出 说 明 整 型 数 据 的 四 个 基 本 属 性 的 方 式 与 相 关 功 能 函 数 1. 整 型 的 名 称 整 型 的 名 称 就 是 INTEGER 也 可 以 说 就 是 声 明 整 型 数 据 类 型 的 语 句 的 关 键 词 声 明 一 个 数 据 对 象 属 于 整 型 数 据 的 基 本 语 句 句 法 为 : INTEGER [ ( [ KIND = ] kind-parameter) ] [ [, attribute-list] :: ] entity-list 例 5-7 以 下 这 些 声 明 语 句 主 要 是 要 说 明 数 据 项 : INTEGER X INTEGER DIMENSION(:), POINTER :: days, hours INTEGER(SHORT)RED_BALL

45 INTEGER(2) POINTER :: k, limit INTEGER(1) DIMENSION(10) :: min 例 5-8 以 下 这 些 声 明 语 句 主 要 是 要 说 明 数 据 的 属 性 : INTEGER days, hours INTEGER(2) k, limit INTEGER(1) min DIMENSION days(:), hours(:), min (10) POINTER days, hours, k, limit 整 型 数 据 也 可 用 于 指 出 某 个 变 量 为 整 型 也 可 以 构 成 一 个 条 件 语 句 例 5-9 INTEGER I, X READ (*,*) I IF (I) THEN X = 1 END IF 2. 整 型 数 据 的 取 值 取 值 为 整 数 值 的 数 据 对 象 被 定 义 为 整 型 数 据 对 象 值 得 注 意 的 是 整 型 数 据 的 取 值 范 围, 无 论 如 何 都 只 能 是 整 数 集 合 的 一 个 真 子 集, 因 为 计 算 机 所 能 表 示 出 来 的 整 数 的 大 小 是 受 到 一 个 有 限 数 值 的 限 制 的 至 于 某 一 个 具 体 的 编 译 器 能 够 表 示 的 最 大 的 数 值 是 多 少, 并 不 是 统 一 的, 需 要 具 体 的 依 据 编 译 器 的 约 定, 当 然 只 有 在 我 们 需 要 考 虑 有 可 能 取 非 常 大 的 数 值 时, 才 会 注 意 到 系 统 的 这 方 面 的 限 制 更 具 体 地 考 虑 一 下, 当 我 们 要 定 义 一 个 整 型 变 量 的 时 候, 我 们 不 止 是 需 要 考 虑 它 是 否 可 能 取 非 常 大 的 数 值, 更 重 要 的 是 要 在 满 足 算 法 的 数 据 精 度 要 求 与 节 约 机 器 的 内 存 空 间 之 间 取 得 某 种 折 中 因 为 尽 管 语 言 标 准 只 要 求 编 译 器 提 供 整 数 的 一 种 存 储 标 准, 但 是 现 在 一 般 的 编 译 器 都 能 提 供 多 种 存 储 模 式, 针 对 算 法 的 具 体 情 况, 程 序 作 者 就 可 以 选 择 不 同 的 数 据 存 储 模 式, 来 获 得 高 效 的 程 序 FORTRAN 语 言 可 以 很 方 便 地 描 述 数 据 对 象 的 具 体 的 存 储 模 式, 那 就 是 种 别 参 数, 实 际 上 对 于 F ORTRAN 来 说, 每 一 个 数 据 总 是 认 为 它 不 仅 属 于 一 个 数 据 类 型, 进 一 步 还 属 于 该 数 据 类 型 的 某 个 种 别, 在 种 别 参 数 没 有 表 达 出 来 的 时 候, 就 会 赋 予 默 认 的 种 别 参 数 值 由 于 FORTRAN 标 准 只 是 规 范 了 固 有 数 据 类 型 的 定 义, 对 于 每 一 个 固 有 数 据 类 型 所 定 义 的 各 个 种 别 的 具 体 存 储 模 式, 则 一 般 由 具 体 的 编 译 系 统 来 约 定, 因 为 给 具 有 不 同 字 长 的 数 据 规 定 适 当 的 存 储 空 间, 得 依 据 系 统 不 同 具 体 情 况 来 确 定 FORTRAN 提 供 了 三 个 固 有 函 数, 可 以 用 于 查 询 具 体 的 某 个 系 统 对 整 型 数 据 的 存 储 模 式 的 设 置 : KIND RANGE SELECTED_INT_KIND 固 有 函 数 KIND 这 个 函 数 能 够 给 出 任 意 属 于 固 有 数 据 类 型 的 数 据 对 象 的 种 别 参 数 句 法 :

46 result = KIND (x) 输 入 x, 可 以 是 任 意 属 于 固 有 数 据 类 型 的 数 据 对 象, 如 变 量 或 常 量 输 出 为 一 个 属 于 默 认 整 型 数 据 的 标 量, 就 是 x 的 种 别 参 数 值 例 5-10 KIND (0) 为 默 认 整 型 的 种 别 参 数 值 ; KIND (12) 同 样 为 默 认 整 型 的 种 别 参 数 值 ; 输 出 为 一 个 属 于 默 认 整 型 数 据 的 标 量, 表 示 数 据 用 十 进 制 表 示 时 的 幂 次 范 围 对 于 一 个 整 型 变 量, 输 出 值 为 INT(LOG10( HUGE(x) )) 如 果 变 量 X属 于 REAL(4), 那 么 RANGE (X) 的 值 为 37. ( 因 为 HUGE(X) = ( ) x TINY(X) = 2 固 有 查 询 函 数 RANGE 这 个 函 数 能 够 给 出 数 据 用 十 进 制 表 示 时 的 幂 次 范 围 一 般 句 法 为 : result = RANGE (x) 输 入 x 是 数 值 型 数 据 由 于 机 器 的 存 储 模 式 是 以 二 进 制 的 位 数 为 单 位 的, 因 此 这 个 函 数 的 作 用 就 在 于 把 二 进 制 的 幂 次 范 围 转 换 为 十 进 制 的 幂 次 范 围 对 于 一 个 实 型 或 复 型 变 量, 输 出 值 为 INT(MIN (LOG10( HUGE(x) ), -LOG10( TINY(x) ))). 例 固 有 转 换 函 数 SELECTED_INT_KIND 这 个 函 数 能 够 根 据 数 据 取 值 的 十 进 制 幂 次 范 围, 给 出 其 种 别 参 数 值 一 般 句 法 为 : 输 入 十 进 制 最 大 幂 次 l, 而 输 出 满 足 -10 l < n < 10 l 的 变 量 n 的 种 别 参 数 值 如 果 系 统 不 支 持 相 应 的 整 型 种 别, 就 会 返 回 数 值 -1 如 果 该 数 据 同 时 满 足 不 止 一 个 种 别 参 数 值, 则 取 具 有 最 小 十 进 制 幂 次 范 围 的 种 别 参 数 INTEGER (SELECTED_INT_KIND (6))X! 等 价 于 INTEGER(4)X, 而 X! 的 取 值 最 大 可 以 达 到 10 6, 而 最 小 ) 值 result = SELECTED_INT_KIND (l) 由 于 很 多 情 况 下, 我 们 只 知 道 数 据 取 值 的 十 进 制 幂 次 范 围, 因 此 这 个 函 数 就 提 供 了 通 过 十 进 制 幂 次 范 围 来 指 定 种 别 参 数 的 方 法 例 5-12! 可 以 达 到 10-6 INTEGER (SELECTED_INT_KIND (5)) N,M! 声 明 了 变 量 N 和 M 的 取! 值 最 大 可 以 达 到 10, 而 最 小 可 以 达 5 ;

47 ! 到 10-5 i = SELECTED_INT_KIND(8)! 返 回 4 i = SELECTED_INT_KIND(3)! 返 回 2 i = SELECTED_INT_KIND(10)! 返 回 -1, 因 为 系 统 不 提 供 如 此 高! 的 精 度 3. 运 算 施 加 于 整 型 数 据 的 运 算 包 括 : 一 元 固 有 算 术 运 算 : 求 反 运 算 -; 求 同 运 算 + 二 元 固 有 算 术 运 算 : 加 法 运 算 +; 减 法 运 算 -; 乘 法 运 算 *; 除 法 运 算 /; 乘 幂 运 算 ** 二 元 固 有 关 系 运 算 : 大 于.GT. 或 >; 大 于 等 于.GE. 或 >=; 小 于.LT. 或 <; 小 于 等 于.LE. 或 < =; 等 于.EQ. 或 ==; 不 等 于.NE. 或 /= 固 有 算 术 运 算 的 结 果 仍 然 为 整 型 数 据, 而 固 有 关 系 运 算 的 结 果 为 默 认 种 别 类 型 的 逻 辑 型 数 据 4. 常 量 的 表 示 形 式 所 谓 常 量, 可 以 理 解 为 取 了 具 体 的 定 值 的 数 据 对 象, 因 此 整 型 常 量 从 形 式 上 讲, 就 是 一 串 数 字, 可 能 在 前 面 ( 左 端 ) 加 上 正 负 号, 也 可 能 在 后 面 ( 右 端 ) 加 上 下 划 线, 然 后 跟 一 个 种 别 参 数 整 型 字 面 常 量 的 一 般 形 式 为 (R403): [s]n[n...][ _k] 其 中 : s 表 示 正 负 号 ; 如 果 取 负 号 (-), 则 这 个 负 号 是 不 可 缺 的, 如 果 取 正 号 (+), 则 是 可 选 的 因 此 不 带 任 何 符 号 的 数 字 串 被 默 认 为 正 数 n 表 示 数 字 (0 到 9), 从 左 端 开 始 第 一 个 非 0 数 字 开 始, 它 左 边 的 任 何 0 都 会 被 忽 略 在 默 认 情 形 下, 这 些 数 字 都 被 认 为 是 十 进 制 表 示 形 式 的 数 值 k 是 一 个 可 选 的 种 别 参 数, 必 须 用 下 划 线 ( _ ) 和 表 示 数 据 的 数 字 串 区 分 开 种 别 参 数 的 一 般 语 法 形 式 为 : digit-string scalar-integer-constant-name 即 数 字 串, 或 者 是 取 整 型 标 量 值 的 命 名 常 量 例 表 示 INTEGER(1); 2 表 示 INTEGER(2); 4 表 示 INTEGER(4); 8 表 示 INTEGER(8); LONG SHORT 其 中 1,2,4,8 同 样 属 于 默 认 种 别 的 整 型 数 字, 而 LONG 和 SHORT 都 是 命 名 常 量, 它 们 的 具 体 取 值 完 全 依 赖 于 编 译 系 统 在 默 认 情 形 下, 整 型 常 量 总 是 被 解 释 为 十 进 制 表 示 的 数 值, 除 了 这 种 默 认 的 十 进 制 表 达 形 式 之 外, 还 可 以 在 DATA 语 句 当 中 初 始 化 表 示 为 其 他 系 统 许 可 的 进 制 形 式

48 在 F ORTRAN 语 言 标 准 里 面, 规 定 了 十 进 制 之 外 的 三 种 进 制 形 式 : 二 进 制 常 量 形 式 (R408): B digit [ digit ] B digit [ digit ] 其 中 的 数 字 只 能 是 0 或 1. 即 二 进 制 常 量 表 示 为 以 字 母 B 开 头, 后 跟 用 一 对 撇 号 或 引 号 括 起 来 的 数 字 串, 而 且 每 个 数 字 不 是 0 就 是 l 八 进 制 常 量 形 式 (R409): O digit [ digit ] O digit [ digit ] 其 中 的 数 字 只 能 是 0 到 7. 八 进 制 常 量 表 示 为 以 字 母 O 开 头, 后 跟 用 一 对 撇 号 或 引 号 括 起 来 的 数 字 串, 而 且 每 个 数 字 是 0 到 7 之 间 的 一 个 数 字 十 六 进 制 常 量 形 式 (R410): Z digit [ digit ] Z digit [ digit ] 其 中 的 数 字 只 能 是 0 到 9, 和 A 到 F 这 五 个 字 母, 用 来 表 示 10 到 15. 十 六 进 制 常 量 表 示 为 以 字 母 z 开 头, 后 服 用 一 对 撇 号 或 引 号 括 起 来 的 数 字 或 字 母 的 串, 而 且 每 个 数 字 是 数 字 0 到 9 或 字 母 A 到 F 之 一 这 里 定 义 的 二 进 制 八 进 制 和 十 六 进 制 的 字 面 常 量 形 式 只 能 用 于 DATA 语 句 中 如 果 要 在 CVF 系 统 里 面 使 用 非 十 进 制 来 表 示 数 值, 除 了 属 于 FORTRAN 标 准 的 二 进 制, 八 进 制, 十 六 进 制 三 种 额 外 的 进 制 形 式 之 外, 还 可 以 使 用 如 下 的 语 法 形 式 表 示 更 多 的 进 制 形 式 : [s] [[base] #] nnn... 其 中 : base 是 从 2 到 36 的 任 意 整 数 这 表 明 CVF 可 以 使 用 从 2 进 制 一 直 到 36 进 制 来 表 示 整 数 而 如 果 base 省 略 了, 但 是 给 出 了 符 号 #, 那 么 表 示 后 面 的 整 型 数 据 被 看 成 16 进 制, 如 果 base 和 # 都 被 省 略 了, 那 么 后 面 的 整 型 数 据 就 被 看 成 默 认 的 10 进 制 为 什 么 取 能 够 表 示 的 最 大 进 制 是 36 呢, 因 为 一 般 从 英 文 26 字 母 里 面 来 取 得 符 号 来 表 示 0 到 9 之 外 的 数 字 表 示 符 号, 一 般 的 约 定 就 是 按 照 字 典 顺 序, 例 如 如 果 使 用 11 进 制, 那 么 A 表 示 10, 如 果 使 用 36 进 制, 那 么 A 表 示 10,B 表 示 11,C 表 示 12 等 等 一 直 到 Z 表 示 35 这 种 表 示 方 法 里 面, 字 母 的 大 小 写 是 不 加 区 别 的 例 5-14 下 面 的 7 个 变 量 所 赋 予 的 整 型 数 值 都 是 表 示 十 进 制 的 3,994,575: I = 2# m = 7# J = +8# K = #3CF3CF

49 n = +17#2DE110 L = index = 36#2DM8F 例 5-15 这 些 都 是 正 确 的 整 型 常 量 ; _ _8 31_SHORT _LONG 例 5-16 这 些 都 是 错 误 的 整 型 常 量 : ! 对 于 默 认 的 种 别 参 数 来 说, 这 个 数 太 大 了 3.14! 不 允 许 出 现 小 数 点 32,767! 不 允 许 出 现 逗 号 33_3!3 不 是 一 个 有 定 义 的 种 别 参 数 例 5-17 下 面 都 是 非 十 进 制 形 式 的 整 型 常 量 : FORTRAN 赋 值 LOGICAL(1)X INTEGER(1)X 十 进 制 值 十 六 进 制 值 X = Z'80' X = Z'7F' X = Z'FF' X = Z'FF' X = Z'8000' X = Z'7FFF' X = Z'FFFF' 数 字 串 后 的 下 划 线 和 种 别 参 数 是 可 选 项 如 果 省 略, 就 被 认 为 是 默 认 整 型, 这 时 系 统 默 认 的 种 别 参 数 值 就 是 固 有 查 询 函 数 KIND(0) 的 结 果 SHORT 是 命 名 常 量, 且 具 有 常 量 值, 这 个 值 必 须 是 非 负 的, 而 且 与 一 种 表 示 方 法 相 对 应 非 字 面 常 量 的 数 值 数 据 都 有 一 个 名 字, 对 于 名 字 要 说 明 其 类 型, 具 体 说 明 的 方 法 参 见 第 6 章 实 型 何 谓 FORTRAN 里 的 实 数? 计 算 机 显 然 也 不 能 表 示 所 有 的 实 数, 因 为 计 算 机 只 能 表 示 有 限 形 式 的 数 值, 并 且 表 达 一 个 数 值 所 使 用 的 数 字 数 目 也 是 受 到 限 制 的 对 于 计 算 机 来 说, 只 能 用 下 面 的 形 式 来 表 示 实 数 :

50 l e k x = s r wk r k= 1 其 中 : x 是 一 个 实 数 s 表 示 正 负 符 号 ( 可 以 取 +1 或 -1) r 是 一 个 大 于 1 的 正 整 数, 表 示 x 的 进 制 的 基 数, 即 逢 r 进 一 位 的 意 思 l 是 一 个 大 于 1 的 正 整 数, 表 示 x 的 位 数, 即 表 示 x 需 要 多 少 个 浮 点 数 字 来 表 示 显 然 这 依 赖 于 系 统 对 r 的 选 择 w 是 一 个 小 于 r 的 非 负 整 数, 表 示 了 x 的 每 一 位 的 值, 而 且 w 不 能 是 0 k 1 e 为 幂 次 范 围 e n 到 e 的 一 个 整 数 mi max 如 果 x = 0, 那 么 w k 和 e 定 义 为 0 从 实 型 数 据 的 数 学 表 达 式 可 以 看 出, 如 果 要 对 实 型 数 据 的 存 储 模 式 进 行 分 类 的 话, 在 默 认 取 十 进 制 的 情 况 下, 就 一 定 是 围 绕 l 和 e 来 进 行 的, 例 如 单 精 度 实 型 (REAL(4)) 的 定 义 如 下 : x=0, 或 者 24 x k 2 [1/ 2 wk e k=2 = s + 2 ], 一 个 实 型 数 据 值 最 多 可 以 用 多 少 个 浮 点 数 字 来 表 示, 依 赖 于 系 统 的 约 定, 下 表 5-7 是 CVF 在 不 同 环 境 里 的 相 应 约 定 表 5-7 实 型 数 据 值 的 浮 点 数 字 IEEE S_floating 24 Compaq ( 以 前 是 DIGITAL) VAX F_floating 1 24 IEEE T_floating 53 Compaq VAX D_floating Compaq VAX G_floating 仅 限 于 VMS 2 VAX D_floating 的 内 存 格 式 是 56 位 浮 点 数, 不 过 实 际 只 有 53 位 用 于 计 算, 因 此 Compaq Fortran 认 为 它 是 53 位 幂 次 范 围 e min 到 e max 同 样 依 赖 于 系 统 的 约 定, 下 表 5-8 是 CVF 在 不 同 环 境 里 的 相 应 约 定 : 表 5-8 幂 次 范 围 的 浮 点 数 字 e min e max IEEE S_floating Compaq VAX F_floating IEEE T_floating Compaq VAX D_floating Compaq VAX G_floating VMS only

51 1. 名 称 实 型 数 据 的 名 称 是 REAL, 不 过 实 型 数 据 还 有 一 个 种 别, 拥 有 单 独 的 名 称, 即 DOUBLE PRECISI ON, 这 属 于 历 史 的 遗 留, 是 在 FORTRAN 没 有 出 现 种 别 参 数 的 时 候 所 增 加 的 双 精 度 实 型 数 据 的 名 称, 当 然 使 用 种 别 参 数 是 完 全 可 以 代 替 使 用 这 个 名 称 实 型 数 据 的 声 明 的 语 法 形 式 如 下 : REAL [ ( [KIND=] n) ] [,attribute-list::] entity-list DOUBLE PRECISION [,attribute-list::] entity-list 其 中 : n 取 值 为 种 别 参 数 4, 8, 或 16 种 别 参 数 16 只 出 现 在 OpenVMS, Tru64 UNIX, 和 Linux 环 境 当 中 种 别 参 数 是 可 选 的, 如 果 使 用 了 种 别 参 数, 那 么 给 出 的 实 型 数 据 对 象 就 属 于 相 应 的 种 别 ; 如 果 没 有 使 用 种 别 参 数, 那 么 给 出 的 实 型 数 据 对 象 就 属 于 默 认 实 型 DOUBLE PRECISION 实 际 上 就 是 REAL(8) 如 果 使 用 DOUBLE PRECISION 就 不 能 再 使 用 种 别 参 数 如 果 要 改 变 实 型 的 默 认 指 定 可 以 使 用 编 译 选 项 /real_size:size 给 出 实 型 数 据 对 象 的 名 称 的 例 子 如 下 例 5-18 这 些 声 明 语 句 主 要 说 明 数 据 项 REAL (KIND = high), OPTIONAL :: testval REAL, SAVE :: a(10), b(20,30) 这 些 声 明 语 句 主 要 说 明 数 据 属 性 REAL (KIND = high) testval REAL a(10), b(20,30) OPTIONAL testval SAVE a, b 2. 实 型 的 取 值 鉴 于 FORTRAN 的 所 谓 实 型 只 是 有 限 位 有 理 数 的 集 合, 因 此 同 样 有 必 要 依 据 精 度 对 实 型 数 据 进 行 分 类, 以 避 免 给 任 意 的 实 型 数 据 安 排 同 一 个 存 储 模 式, 从 而 有 可 能 导 致 非 常 大 的 内 存 空 间 的 浪 费 FORTRAN 标 准 规 定 了 实 型 至 少 要 有 两 种 精 度 形 式, 一 种 是 默 认 实 型, 一 种 是 在 默 认 实 型 的 基 础 上 精 度 加 倍, 得 到 双 精 度 实 型 在 FORTRAN90 以 后, 为 了 与 早 期 的 语 言 版 本 相 容, 保 留 了 说 明 默 认 双 精 度 实 型 的 关 键 词 DOUBL E PRECISION, 不 过 可 以 使 用 REAL 加 双 精 度 种 别 参 数 (REAL(8)) 的 形 式, 或 直 接 使 用 指 数 符 D 加 指 数 的 形 式 代 替 和 整 型 类 似,FORTRAN 设 置 了 四 个 固 有 函 数, 可 以 用 来 查 询 具 体 的 某 个 系 统 对 实 型 数 据 在 精 度 方 面 的 约 定 这 四 个 固 有 函 数 为 : KIND PRECISION RANGE

52 SELECTED_REAL_KIND 固 有 函 数 KIND 这 个 函 数 用 于 查 询 变 量 的 种 别 参 数 由 于 实 型 数 据 的 双 精 度 型 被 认 为 是 一 种 单 独 的 实 型 数 据 种 别, 因 此 针 对 它 的 种 别 参 数 查 询 函 数 使 用 KIND(0.0D0), 而 对 于 默 认 实 型 则 使 用 KIND(0.0) 句 法 : result = KIND (x) 输 入 x 可 以 是 任 何 属 于 固 有 数 据 类 型 的 数 据 对 象 函 数 结 果 为 一 个 属 于 默 认 整 型 的 标 量, 表 示 x 的 种 别 参 数 例 5-19 KIND (0.0) 为 默 认 实 型 的 种 别 参 数 固 有 函 数 PRECISION 这 个 函 数 给 出 实 数 的 有 限 十 进 制 小 数 表 示 或 近 似 表 示 的 十 进 制 精 度 函 数 输 出 为 一 个 正 整 数 p, 表 示 数 据 取 值 至 少 含 有 p 个 有 效 数 句 法 : result = PRECISION (x) 输 入 x 必 须 是 实 型 或 复 型, 可 以 取 值 为 标 量 或 数 组 函 数 结 果 为 一 个 属 于 默 认 整 型 的 数 值, 等 于 INT( (DIGITS(x) - 1) * LOG10(RADIX(x))) 如 果 RADIX(x) 等 于 10 的 某 个 整 数 次 幂, 则 结 果 加 1 如 果 X 是 一 个 REAL(4) 值, 那 么 PRECISION(X) 等 于 6 因 为 : INT ((24-1) * LOG10 (2.)) = INT ( ) 固 有 函 数 RANGE 参 见 应 用 于 整 型 数 据 的 该 函 数 的 说 明 固 有 函 数 SELECTED_REAL_KIND 这 个 函 数 能 够 根 据 数 据 的 十 进 制 精 度 和 十 进 制 幂 次 范 围, 给 出 其 种 别 参 数 值 使 用 这 个 函 数, 就 可 以 在 只 了 解 数 据 的 十 进 制 表 示 的 精 度 与 幂 次 范 围 要 求 的 情 况 下, 在 数 据 说 明 当 中 指 定 其 种 别 参 数 一 般 形 式 : result = SELECTED_REAL_KIND ([p] [,r]) 其 中 : p 作 为 可 选 输 入, 属 于 默 认 整 型 的 标 量 ; r 作 为 可 选 输 入, 属 于 默 认 整 型 的 标 量 这 两 个 可 选 量 必 须 至 少 出 现 一 个 输 入 表 示 十 进 制 精 度 的 p 或 ( 和 ) 十 进 制 最 大 幂 次 r 输 出 具 有 十 进 制 精 度 的 p 或 ( 和 ) 满 足 -10 r < n < 10 r 的 变 量 n 的 种 别 参 数 值 显 然 其 中 的 p 就 是 函 数 PRECISION 返 回 的 结 果,r 就 是 函 数 RANGE 返 回 的 结 果 如 果 系 统 不 支 持 相 应 的 实 型 种 别, 就 会 出 现 如 下 结 果 : 如 果 系 统 不 支 持 相 应 精 度, 则 得 到 -1; 如 果 系 统 不 支 持 相 应 幂 次 范 围, 则 得 到 -2; 如 果 系 统 两 者 都 不 支 持, 则 得 到 -3

53 如 果 该 数 据 同 时 满 足 不 止 一 个 种 别 参 数 值, 则 取 具 有 最 小 精 度 的 种 别 参 数 值 例 5-20 REAL (SELECTED_REAL_KIND (5))X! 表 示 X 具 有 至 少 5 位 有 效 数, 并 且! 没 有 指 定 幂 次 范 围 REAL (SELECTED_REAL_KIND (6, 50))X! 表 示 X 具 有 至 少 6 位 有 效 数,! 并 且 指 定 幂 次 范 围 为 到 REAL (SELECTED_REAL_KIND (6, 70))! 等 价 于 REAL (8) i = SELECTED_REAL_KIND(r=200)! returns 8 i = SELECTED_REAL_KIND(13)! returns 实 型 数 据 的 运 算 施 加 于 实 型 数 据 的 运 算 包 括 : 一 元 固 有 算 术 运 算 : 求 反 运 算 -; 求 同 运 算 + 二 元 固 有 算 术 运 算 : 加 法 运 算 +; 减 法 运 算 -; 乘 法 运 算 *; 除 法 运 算 /; 乘 幂 运 算 ** 二 元 固 有 关 系 运 算 : 大 于.GT. 或 >; 大 于 等 于.GE. 或 >=; 小 于.LT. 或 <; 小 于 等 于.LE. 或 <=; 等 于.EQ. 或 ==; 不 等 于.NE. 或 /= 对 实 型 数 据 施 加 固 有 算 术 运 算 的 结 果 总 是 实 型 数 据, 即 使 二 元 运 算 的 某 个 运 算 元 为 整 型, 结 果 仍 然 被 视 为 实 型 固 有 关 系 运 算 的 结 果 为 属 于 默 认 种 别 类 型 的 逻 辑 型 数 据 实 型 常 量 的 形 式 FORTRAN 可 以 写 出 有 限 位 的 整 数, 也 可 以 写 出 有 限 位 的 小 数, 然 后 可 以 再 加 上 正 负 号, 到 此 为 止, 实 数 里 面 的 非 有 限 小 数 就 只 能 用 有 限 小 数 来 近 似 了 带 符 号 的 实 型 字 面 常 量 的 写 法 (R412) 有 以 下 几 种 形 式 : 不 含 指 数 部 分 的 实 常 量 : [s]n[n...][ _k] 含 指 数 部 分 的 实 常 量 : [s]n[n...]e[s]nn...[_k] [s]n[n...]d[s]nn... [s]n[n...]q[s]nn 其 中 : s 表 示 正 负 号, 如 果 是 负 数 必 须 有 (-), 如 果 是 正 数,(+) 可 选 n 表 示 从 0 到 9 的 数 字 ( 默 认 实 型 的 情 况 下 ) 如 果 不 含 指 数 部 分, 则 其 中 必 须 包 含 小 数 点 在 整 数 与 小 数 部 分 的 数 字 串 遵 循 R402, 指 数 部 分 的 数 字 串 遵 循 R416 和 R401

54 k 是 种 别 参 数 :REAL(4) 是 4, REAL(8) 是 8, 种 别 参 数 前 面 必 须 有 下 划 线 ( _ ) E,D 表 示 指 数 符 (R415) 后 接 指 数 表 示 10 的 幂 次, 例 如 1.0E6 表 示 1.0 * 10**6 FORTRAN 只 能 表 示 实 数 的 有 限 小 数 部 分, 并 且 按 十 进 制 科 学 记 数 法 解 释, 即 有 效 数 乘 以 10 的 指 数 幂 书 写 的 有 效 数 字 个 数 可 以 多 于 系 统 约 定 的 用 来 近 似 表 示 该 常 量 值 的 位 数 在 一 个 实 型 常 量 里 同 时 出 现 种 别 参 数 与 指 数 时, 使 用 E 指 数 符 使 用 D, 表 示 常 量 为 双 精 度 实 型 数 据 (REAL(8)), 由 于 这 种 精 度 的 实 型 是 单 独 定 义 的, 因 此 不 能 再 带 有 种 别 参 数 它 的 种 别 参 数 值 是 固 有 查 询 函 数 KIND(0.0D0) 的 结 果, 而 且 约 定 其 表 示 方 法 的 十 进 制 精 度 要 大 于 默 认 实 型 的 精 度 带 种 别 参 数 的 实 型 常 量 受 到 其 种 别 参 数 的 约 定 既 不 带 指 数, 也 没 有 种 别 参 数 的 实 型 常 量 为 默 认 的 单 精 度 常 量, 即 REAL(4), 此 时 种 别 参 数 值 是 固 有 查 询 函 数 KIND(0.0) 的 结 果 应 用 种 别 参 数 来 规 定 所 谓 的 有 效 数 的 个 数 时, 数 字 串 里 第 一 个 非 0 数 字 左 边 所 有 的 0 全 被 忽 略 例 如 里 面,5 之 前 所 有 的 0 都 不 计 入 有 效 数 如 果 实 型 常 量 不 含 指 数 部 分, 则 在 数 字 串 部 分 必 须 包 含 小 数 点, 如 果 有 效 数 为 不 带 小 数 点 的 数 字 串, 即 整 型 字 面 常 量 时, 必 须 出 现 指 数 符 及 指 数, 否 则 就 变 为 整 型 数 据 了 ; 如 果 含 指 数 部 分, 则 小 数 点 不 是 必 须 的, 而 指 数 部 分 的 数 字 串 里 不 能 出 现 小 数 点 在 默 认 情 况 下, 指 数 符 E 指 单 精 度 实 型 (REAL(4)), 而 如 果 带 有 种 别 参 数, 则 依 种 别 参 数, 例 如 -7.E2_8 为 双 精 度 实 型 常 量, 也 可 以 写 为 -7.D2 如 果 实 型 常 量 的 数 字 串 当 中 出 现 指 数 符, 那 么 指 数 数 字 串 不 能 省 略, 但 可 以 是 0 种 别 参 数 可 以 使 用 HIGH,LOW,QUAD 等 命 名 常 量, 其 具 体 取 值 由 系 统 约 定 单 精 度 实 型 (REAL(4)) 的 定 义 如 下 : x=0, 或 者 e k x = s 2 [1/ 2 + w 2 ], 125 e 128 k= 2 例 5-21 下 面 都 是 合 法 的 实 型 常 量 : E2-13.6E_ E7_QUAD.96D _ E3 2E-3_ D E+5_ D00 2E200_ Q Q k

55 例 5-22 下 面 都 是 不 合 法 的 实 型 常 量 : 1,234,567.! 数 字 串 当 中 不 能 含 有 逗 号 325E-47! 对 于 REAL 来 说, 这 个 数 太 小 ; 但 是 属 于 合 法 的 DOUBLE PRECISION! 常 量 -47.E47! 对 于 REAL 来 说, 这 个 数 太 大 ; 但 是 属 于 合 法 的 DOUBLE PRECISION 常! 量 625._6!6 不 是 合 法 的 实 型 种 别 参 数 100! 在 不 含 指 数 部 分 的 情 况 下, 没 有 小 数 点, 故 只 能 是 合 法 的 整 型 常 量 $25.00! 不 允 许 含 特 许 字 符 -.25D0_2!2 不 是 合 法 的 实 型 种 别 参 数 ! 没 写 指 数 符 D, 不 过 在 忽 略 7 个 有 效 数 之 外 的 数 字 之 后, 可! 以 视 为 合 法 的 单 精 度 实 型 常 量 D45! 这 个 数 对 于 D_floating 格 式 来 说 太 大 ; 但 属 于 合 法 的 G_floating 和!T_floating 格 式 D400! 这 个 数 对 于 双 精 度 格 式 来 说 太 大 D-400! 这 个 数 对 于 双 精 度 格 式 来 说 太 小 1.Q5000! 这 个 数 对 于 三 倍 精 度 格 式 来 说 太 大 1.Q-5000! 这 个 数 对 于 三 倍 精 度 格 式 来 说 太 小 5.6 复 型 两 个 实 型 数 据 就 构 成 一 个 复 型 数 据, 因 为 在 数 学 上, 一 个 复 数 本 质 上 就 是 一 个 实 数 二 元 组 和 实 型 值 集 合 只 是 实 数 的 一 个 子 集 一 样, 复 型 值 集 合 只 是 数 学 上 复 数 的 近 似 表 示 的 一 个 子 集 复 型 的 值 运 用 实 值 的 有 序 对 来 表 示, 第 一 个 实 值 称 为 实 部, 第 二 个 实 值 称 为 虚 部 复 型 数 据 的 取 值 的 写 法 如 下 : (c,c) 其 中 逗 号 与 括 号 不 可 或 缺, 而 c 可 以 取 : 整 型 常 量 或 REAL(4) 常 量, 得 到 COMPLEX(4) 常 量 ; 整 型 常 量,REAL(4) 常 量, 或 DOUBLE PRECISION (REAL(8)) 常 量, 得 到 COMPLEX(8) 常 量 ; 正 是 由 于 复 型 本 质 上 由 实 型 组 合 成, 因 此 复 型 数 据 的 存 储 模 式 依 据 实 型 而 定 名 称 复 型 的 名 称 为 COMPLEX, 说 明 复 型 数 据 类 型 的 句 法 为 : COMPLEX [([KIND = ] kind-parameter)] [,attribute-list::] entity-list 其 中 : n 为 种 别 参 数 4 or 8, 同 于 实 型 由 于 复 型 数 据 种 别 参 数 是 应 用 于 实 部 和 虚 部 两 个 实 型 数 据 的, 如 果 出 现 种 别 参 数, 该 种 别 参 数 指 定 实 部 和 虚 部 两 个 实 型 数 据 的 种 别 ; 如 果 不 带 种 别 参 数, 则 称

56 此 复 型 数 据 为 默 认 复 型, 即 实 部 和 虚 部 都 属 于 默 认 实 型 例 5-23 COMPLEX ch COMPLEX (KIND=4),PRIVATE :: zz, yy! 等 价 于 COMPLEX*8 zz, yy COMPLEX(8) ax, by! 等 价 于 COMPLEX*16 ax, by COMPLEX ( kind(4)) y(10) complex (kind=8) x, z(10) 复 型 数 据 的 取 值 复 型 数 据 对 象 的 取 值 的 种 别 完 全 由 实 型 而 来, 根 据 两 个 实 型 分 量 的 组 合, 可 以 分 为 如 下 情 形 : 两 个 实 型 分 量 都 是 默 认 实 型, 则 相 应 复 型 也 称 为 默 认 复 型 ; 两 个 实 型 分 量 都 是 双 精 度 实 型, 则 相 应 复 型 也 称 为 双 精 度 复 型 ; 给 复 型 对 象 指 定 一 个 种 别 参 数, 意 味 着 同 时 给 它 的 两 个 实 型 分 量 指 定 了 同 样 的 种 别 参 数 ; 两 个 分 量 都 是 整 型 对 象, 则 都 转 换 成 默 认 实 型, 因 而 认 为 是 默 认 复 型 的 ; 其 中 一 个 分 量 是 整 型 对 象, 另 一 个 分 量 是 实 型 对 象, 则 将 整 型 的 分 量 转 换 成 与 另 一 实 型 分 量 相 同 种 别 的 实 型 对 象, 其 种 别 参 数 就 是 实 型 分 量 的 种 别 参 数 如 果 两 个 实 型 分 量 的 种 别 参 数 不 同, 则 具 有 精 度 高 的 分 量 的 种 别 参 数 就 是 复 型 的 种 别 参 数, 并 且 把 另 一 分 量 转 换 为 这 个 精 度 高 的 种 别 形 式 这 里 显 然 符 合 FORTRAN 对 存 储 模 式 一 致 性 处 理 的 一 般 原 则, 即 当 需 要 统 一 存 储 具 有 不 同 存 储 模 式 的 几 种 数 据 时, 就 一 律 采 用 需 要 存 储 空 间 最 大 的 那 种 模 式 应 用 于 复 型 的 固 有 查 询 函 数 与 实 型 相 同, 其 中 有 关 KIND,RANGE,PRECISION 的 说 明 参 见 实 型 的 相 应 说 明 SELECTED_REAL_KIND 也 可 以 直 接 用 于 复 型 对 象, 用 法 与 功 能 都 与 用 于 实 型 对 象 一 致 例 5-24 COMPLEX (SELECTED_REAL_KIND(5,50))CY!5 位 有 效 数, 同 时 取 值 范 围! 可 达 到 10 50! 表 示 复 型 变 量 CY 至 少 具 有 复 型 的 运 算 施 加 于 复 型 数 据 的 运 算 包 括 : 一 元 固 有 算 术 运 算 : 求 反 运 算 -; 求 同 运 算 + 二 元 固 有 算 术 运 算 : 加 法 运 算 +; 减 法 运 算 -; 乘 法 运 算 *; 除 法 运 算 /; 乘 幂 运 算 ** 二 元 固 有 关 系 运 算 : 大 于.GT. 或 >; 大 于 等 于.GE. 或 >=; 小 于.LT. 或 <; 小 于 等 于.LE. 或 <=; 等 于.EQ. 或 ==; 不 等 于.NE. 或 /= 这 里 的 算 术 运 算 就 是 定 义 在 复 数 集 合 上 算 术 运 算 对 复 型 数 据 施 加 固 有 算 术 运 算 的 结 果 总 是 复 型 数 据, 即 使 二 元 运 算 的 某 个 运 算 元 为 整 型, 或 实 型, 结 果 仍 然 被 视 为 复 型 固 有 关 系 运 算 的 结 果 为 属 于 默 认 种 别 类 型 的 逻 辑 型 数 据

57 5.6.4 复 型 常 量 的 形 式 复 型 字 面 常 量 的 句 法 (R417) 为 : (real-part,imaginary-part) 其 中 实 部 和 虚 部 可 以 是 带 号 整 型 字 面 常 量 (R403) 与 带 号 实 型 字 面 常 量 (R412) 的 任 意 组 合 复 型 数 据 对 象 的 种 别 如 何 确 定, 参 见 上 面 的 节 例 5-25 下 面 是 合 法 的 复 型 常 量 : (1,3)! 默 认 复 型 (7.0,-7.0)! 默 认 复 型 (0,3.6E5)! 默 认 复 型 (0.5_4,+8.6E29)! 如 果 假 定 种 别 参 数 值 4 比 8 所 表 示 的 实 数 精 度 低, 则 该 复 型 数 据 具 有! 种 别 参 数 值 8 例 5-26 下 面 是 不 合 法 的 复 型 常 量 : (1.23,)! 漏 写 了 作 为 虚 部 的 整 型 或 单 精 度 实 型 常 量 值 (1.0, 2H12)! 不 能 用 Hollerith 常 量 (,1.23Q0)! 漏 写 了 实 部 (1.7039E0, D0)! 2 个 常 量 都 不 属 于 REAL(16), 但 属 于 合 法 的 双 精 度 常 量 5.7 逻 辑 型 用 来 作 为 任 何 判 断 的 结 果 的 变 量 或 常 量, 就 是 逻 辑 型 数 据 对 象 之 所 以 把 它 单 独 归 结 为 一 种 数 据 类 型, 是 因 为 它 的 取 值 只 有 是 和 否 两 个, 在 存 储 方 面 可 以 非 常 简 单, 为 了 充 分 显 示 这 个 特 点, 有 必 要 单 独 作 为 一 种 数 据 的 类 型 名 称 逻 辑 型 数 据 对 象 的 名 称 为 LOGICAL, 它 的 声 明 语 句 的 句 法 为 : LOGICAL [([KIND = ] kind-parameter n)] [,attribute-list::] entity-list 其 中 n 可 取 种 别 参 数 1, 2, 4, 或 8 种 别 参 数 是 可 选 项, 如 果 没 有 使 用 种 别 参 数, 则 为 默 认 逻 辑 型 例 5-27 下 面 的 声 明 语 句 主 要 说 明 逻 辑 型 对 象 LOGICAL, ALLOCATABLE :: flag1, flag2 LOGICAL (KIND = byte), SAVE :: doit, don t 例 5-28 下 面 的 声 明 语 句 主 要 说 明 对 象 的 属 性 LOGICAL flag1, flag2 LOGICAL (KIND = byte) doit, dont ALLOCATABLE flag1, flag2

58 SAVE doit, dont 逻 辑 型 数 据 取 值 逻 辑 型 数 据 取 值 只 有 两 个 可 能, 即 表 示 真 的 (.TRUE.) 和 表 示 假 的 (.FALSE.) 的 两 个 值, 它 们 后 面 可 以 跟 可 选 的 下 划 线 与 种 别 参 数 一 个 系 统 至 少 要 提 供 一 种 表 示 方 法 作 为 默 认 逻 辑 型, 在 默 认 的 情 形 下, 一 个 逻 辑 型 值 需 要 和 默 认 实 型 值 一 样 大 的 存 储 空 间, 它 的 表 示 方 法 就 是 省 略 可 选 的 下 划 线 和 种 别 参 数, 此 时 种 别 参 数 值 可 以 通 过 固 有 查 询 函 数 KIND(.FALSE.) 获 得 大 多 数 系 统 还 提 供 其 他 存 储 模 式, 例 如 一 个 逻 辑 型 值 采 用 一 个 bit 或 一 个 byte 来 存 储, 具 体 的 种 别 参 数 的 约 定 依 赖 于 具 体 的 系 统 至 于 查 询 数 值 型 数 据 的 种 别 参 数 的 固 有 函 数 SELECTED_INT_KIND 和 SELECT ED_REAL_KIND 对 于 逻 辑 型 没 有 相 应 的 函 数 逻 辑 型 数 据 的 运 算 施 加 于 逻 辑 型 对 象 的 运 算 包 括 : 一 元 固 有 运 算 : 非 (.NOT.) 二 元 固 有 运 算 : 与 运 算 (.AND.); 或 运 算 (.OR.); 逻 辑 等 值 运 算 (.EQV.); 逻 辑 不 等 值 运 算 (.NEQV.) 对 逻 辑 型 值 施 加 上 面 的 运 算, 仍 然 得 到 逻 辑 型 值 逻 辑 型 常 量 逻 辑 型 常 量 只 有 两 个, 它 们 也 可 以 附 加 系 统 约 定 的 种 别 参 数, 句 法 为 :.TRUE.[_k].FALSE.[_k] 其 中 k 为 可 选 的 种 别 参 数 : LOGICAL(1) 是 1;LOGICAL(2) 是 2;LOGICAL(4) 是 4;LOGICAL(8) 是 8 注 意 种 别 参 数 前 面 一 定 要 有 下 划 线 ( _ ) 这 里 的 种 别 参 数 是 与 实 型 数 据 的 种 别 参 数 保 持 一 致 的 例 5-29.TRUE._BIT.FALSE._LONG! 这 里 的 LONG 必 须 是 已 说 明 的 有 名 常 量, 并 且 具 有 非 负 的 整 常 量 值! 其 存 储 模 式 必 须 是 已 经 说 明 的. 5.8 字 符 型 字 符 型 数 据 对 象 在 系 统 认 可 的 字 符 集 当 中 取 值, 其 唯 一 形 式 就 是 由 有 限 个 属 于 系 统 字 符 集 当 中 的 字 符 构 成 字 符 串

59 5.8.1 名 称 字 符 型 数 据 的 名 词 为 CHARACTER, 字 符 型 对 象 的 基 本 声 明 句 法 为 : CHARACTER [([LEN = ] length-parameter & [, [KIND = ] kind-parameter])] [,attribute-list::] entity-list 可 以 看 到 其 中 各 种 可 选 项 的 组 合 情 况 比 较 多, 为 清 晰 起 见, 分 别 写 出 如 下 : CHARACTER CHARACTER([KIND=]n) CHARACTER([LEN=]len) CHARACTER([LEN=]len [, [KIND=]n]) CHARACTER(KIND=n [, LEN=len]) CHARACTER*len[,] 其 中 n 取 种 别 参 数 值 1; len 是 字 符 长 度 值, 不 是 种 别 参 数 值, 一 般 取 正 整 数 值, 也 可 能 取 星 号 或 特 定 表 达 式 参 见 表 达 式 有 关 CHARACTER 声 明 语 句, 还 参 见 数 据 声 明 例 5-30 下 面 是 不 同 形 式 的 字 符 型 数 据 的 声 明 语 句 CHARACTER (70) PROJECT CHARACTER (LEN=30, KIND=GERMAN)TRANSFORMATION CHARACTER (LEN=25,KIND=GREEK),DIMENSION(11)::Z 字 符 型 的 取 值 字 符 型 能 取 的 值 的 集 合 就 是 所 有 有 限 字 符 串 的 集 合 所 谓 一 个 有 限 字 符 串 就 是 一 个 字 符 按 照 文 字 方 式 排 列 的 有 限 序 列, 如 果 从 左 到 右 对 每 一 个 字 符 进 行 编 号, 得 到 1,2,3.,n, 那 么 n 就 是 该 字 符 串 的 长 度, 即 该 字 符 串 所 有 字 符 ( 包 括 重 复 字 符 ) 的 数 目 决 定 一 个 字 符 串 变 量 的 值 的 存 储 空 间 的 因 素 有 两 个 : 字 符 串 的 长 度 ; 字 符 的 存 储 单 位 的 大 小 因 此 这 两 个 因 素 都 是 在 描 述 字 符 型 对 象 时, 系 统 需 要 知 道 的 参 数 字 符 长 度 作 为 一 种 种 别 参 数, 它 的 取 值 分 为 如 下 情 形 : 可 以 等 于 0, 这 时 称 长 度 等 于 零 的 字 符 串 为 空 串 ; 在 没 有 指 定 LEN 值 的 时 候, 默 认 长 度 值 为 1; 根 据 字 符 数 目, 取 大 于 0 的 整 数 当 然 这 个 整 数 存 在 上 界, 由 系 统 给 出 约 定 系 统 至 少 需 提 供 一 种 定 义 字 符 型 数 据 值 的 集 合 的 表 示 方 法, 一 般 是 会 有 几 种 方 法, 每 种 方 法 用 不 同 的 种 别 参 数 来 区 分 种 别 参 数 的 具 体 取 值 依 赖 于 具 体 的 系 统 的 约 定 字 符 型 数 据 还 有 一 个 需 要 仔 细 加 以 约 定 的 属 性 是 字 符 集 的 排 序 问 题 由 于 字 符 型 数 据 的 运 算 除 了 串 联 之 外, 还 有 一 类 关 系 运 算, 需 要 依 据 对 字 符 集 的 字 符 顺 序 的

60 规 定 一 般 原 则 如 下 : 首 先 出 于 可 移 植 性 的 要 求, 最 好 把 字 符 集 限 制 在 FORTRAN 的 基 本 字 符 集 空 格 优 先 于 所 有 字 母 与 数 字 ; 字 母 按 照 英 文 字 母 表 排 序 ; 数 字 按 照 0,1,2,,9 的 顺 序 排 序 ; 字 母 与 数 字 不 能 间 杂 ; 除 了 空 格, 对 其 他 特 殊 字 符 与 下 划 线 的 位 置 都 没 有 约 束 ; 语 言 标 准 不 要 求 系 统 支 持 ASCII 编 码, 但 要 求 提 供 固 有 函 数,ACHAR 和 IACHAR, 用 来 在 系 统 编 码 和 ASCII 编 码 之 间 进 行 转 换 固 有 函 数 LGT,LGE,LLE,LLT 可 用 来 基 于 ASCII 顺 序 进 行 排 序 比 较 运 算 运 算 可 以 施 加 于 字 符 型 数 据 的 运 算 包 括 : 串 联 运 算 : 运 算 符 是 //, 针 对 具 有 相 同 种 别 参 数 的 字 符 型 数 据 而 定 义 其 运 算 结 果 仍 然 为 一 个 保 持 种 别 参 数 不 变 的 字 符 型 数 据 关 系 运 算 : 大 于, 其 运 算 符 为.GT., 或 >; 大 于 等 于, 其 运 算 符 为.GE., 或 >=; 小 于, 其 运 算 符 为.LT., 或 <; 小 于 等 于, 其 运 算 符 为.LE., 或 <=; 等 于, 其 运 算 符 为.EQ., 或 ==; 不 等 于, 其 运 算 符 为.NE., 或 /= 关 系 运 算 的 结 果 为 逻 辑 型 数 据, 即 只 能 取.TRUE. 和.FALSE. 两 个 值 之 一 字 符 型 数 据 常 量 字 符 字 面 常 量 用 可 选 的 种 别 参 数, 然 后 是 下 划 线 后 跟 用 撇 号 或 引 号 为 界 的, 由 可 表 示 字 符 组 成 的 字 符 串 来 表 示 字 符 型 字 面 常 量 的 构 成 句 法 (R420) 如 下 : [k_]'[ch...]' [k_]"[ch...]" 其 中 : k 为 可 选 种 别 参 数, 默 认 情 形 为 1, 后 接 下 划 线 ( _ ) 注 意 字 符 型 数 据 的 种 别 参 数 置 于 常 量 前 面 ( 左 边 ) ch 为 ASCII 字 符, 或 者 说 系 统 可 表 示 字 符 前 一 个 撇 号 或 引 号 称 为 前 定 界 符, 后 一 个 称 为 尾 定 界 符, 它 们 统 称 为 定 界 符 字 符 型 常 量 的 值 限 制 在 定 界 符 之 间, 而 定 界 符 本 身 不 属 于 字 符 串 定 界 符 之 间 的 任 意 字 符, 包 括 空 格 和 Tab 键 都 属 于 字 符 串, 不 过 对 于 控 制 符 得 参 考 系 统 的 约 定 字 符 串 当 中 可 以 包 含 定 界 符 本 身, 不 过 就 只 能 看 成 字 符, 不 能 看 成 是 字 符 型 常 量 的 定 界 符 当 用 引 号 作 定 界 符 时, 则 用 一 个 撇 号 来 表 示 该 字 符, 当 用 撇 号 作 定 界 符 时, 则 用 两 个 连 续 的 撇 号 来 表 示, 且 其 间 不 夹 有 空 格 字 符, 此 时 两 个 连 续 的 撇

61 号 计 作 一 个 字 符 对 字 符 字 面 值 中 的 引 号 也 类 似 地 处 理 长 度 为 0 的 字 符 常 量, 也 就 是 空 串, 由 两 个 连 续 的 同 样 的 定 界 符 表 示, 中 间 不 夹 空 格 如 果 前 定 界 符 前 不 出 现 种 别 参 数 和 下 划 线, 则 该 字 符 常 量 为 默 认 字 符 型 对 于 可 表 示 字 符 的 约 定 与 源 程 序 形 式 有 关 在 固 定 源 码 形 式 中, 它 依 赖 于 系 统 字 符 集, 它 是 除 一 部 分 ( 甚 至 全 部 ) 控 制 字 符 外 的 所 有 字 符 ; 在 自 由 源 码 形 式 中, 它 可 以 包 含 系 统 的 附 加 图 形 字 符 例 5-31 下 面 是 合 法 的 字 符 常 量 "WHAT KIND TYPE? " 'TODAY''S DATE IS: ' "The average is: " '' I m a student I m a student CHINESE_ 汉 字 的 种 别 参 数 CHINESE 作 为 命 名 常 量 已 经 被 定 义 例 5-32 下 面 是 不 合 法 的 字 符 常 量 : 'HEADINGS! 缺 少 尾 定 界 符 'Map Number:"! 定 界 符 的 首 尾 不 配 套 第 6 章 构 造 数 据 固 有 数 据 类 型 只 是 描 述 了 问 题 当 中 出 现 的 基 本 数 据 形 式, 但 在 实 际 的 计 算 当 中, 计 算 对 象 往 往 并 不 只 是 限 于 那 些 固 有 数 据 类 型, 而 是 一 些 数 据 结 构 例 如 : 线 性 数 学 问 题 里 面 的 计 算 对 象 很 少 是 单 纯 的 标 量, 而 是 诸 如 行 列 式, 向 量 这 样 的 由 一 系 列 标 量 组 成 的 数 据 结 构 甚 至 在 计 算 过 程 中, 还 需 要 以 这 种 数 据 结 构 的 某 个 特 定 部 分 作 为 计 算 对 象, 例 如 行 列 式 或 向 量 的 单 独 的 行 与 列, 或 对 角 线, 部 分 块 等 又 例 如 : 样 品 的 属 性 值 可 以 是 多 方 面 的, 例 如 在 测 量 一 个 导 体 样 品 的 交 流 输 运 性 质 时, 需 要 考 虑 的 物 理 量 包 括 电 流, 电 压, 相 位 等, 如 果 以 每 个 样 品 的 属 性 值 作 为 数 据 对 象, 那 么 这 种 数 据 对 象 就 至 少 包 括 3 个 成 员 : 电 流, 电 压, 相 位 它 们 的 取 值 的 类 型 不 同, 精 度 要 求 也 可 能 不 同, 这 3 个 数 值 同 样 构 成 一 个 数 据 结 构 因 此, 进 一 步 FORTRAN 95 需 要 以 固 有 数 据 对 象 为 基 础, 能 够 构 造 一 定 的 数 据 结 构, 从 而 能 够 作 到 基 于 数 据 结 构 进 行 运 算 本 章 讨 论 的 就 是 FORTRAN 95 构 造 数 据 结 构 的 几 种 方 式 : 派 生 数 据 类 型 ;

62 数 据 结 构 的 子 对 象 ; 数 据 结 构 的 成 员 ; 数 组 ; 指 针 特 别 的, 我 们 首 先 讨 论 FORTRAN 95 关 于 数 据 对 象 的 一 个 基 本 分 类 : 变 量 与 常 量 它 们 是 数 据 在 程 序 当 中 的 2 种 基 本 行 为 方 式, 是 我 们 理 解 FORTRAN 95 语 言 范 畴 的 关 键 6.1 数 据 的 2 种 基 本 行 为 变 量 与 常 量 首 先 我 们 给 出 几 个 抽 象 的 基 本 概 念, 在 这 里 只 是 给 出 大 意 而 不 作 更 加 形 式 化 的 讨 论, 完 全 只 是 为 了 后 面 行 文 的 方 便 读 者 不 用 深 究 它 们 的 精 确 定 义, 只 需 要 在 后 面 行 文 当 中 遇 到 这 些 概 念 时, 知 道 回 到 这 里 稍 加 体 会 即 可 数 据 对 象 : 计 算 过 程 当 中, 任 何 充 当 计 算 对 象 的 数 据 内 容, 都 称 为 数 据 对 象, 是 最 一 般 意 义 上 的 数 据 个 体, 今 后 提 到 数 据 对 象, 我 们 可 以 理 解 为 一 个 固 有 数 据 类 型, 一 个 属 于 某 固 有 数 据 类 型 的 变 量, 一 个 常 量, 一 个 标 量, 一 个 数 据 结 构, 一 个 数 据 结 构 的 成 员 或 子 对 象, 表 达 式 求 值 的 结 果, 或 函 数 引 用 的 执 行 结 果 ( 即 函 数 值 ) 数 据 对 象 有 数 据 类 型 ( 固 有 的 或 派 生 的 ), 可 以 有 数 据 值 可 以 是 一 个 数 据 的 集 合, 集 合 的 元 素 数 目 称 为 秩, 每 个 数 据 对 象 有 一 个 秩 它 可 以 是 一 个 标 量 或 是 一 个 数 组 有 名 数 据 对 象 的 类 型 可 以 显 式 或 隐 式 地 规 定 子 对 象 : 子 对 象 是 某 些 有 名 对 象 的 一 部 分, 可 由 程 序 的 其 他 部 分 引 用 和 独 立 地 定 义 包 括 数 据 组 的 部 分, 字 符 串 的 部 分 ( 子 串 ) 和 结 构 的 部 分 ( 成 员 ) 作 为 子 对 象 的 来 源 的 数 据 对 象 称 为 该 子 对 象 的 父 对 象 子 对 象 只 能 用 子 对 象 描 述 符 来 引 用 变 量 的 子 对 象 是 变 量 标 量 : 任 何 单 一 的 数 据 对 象, 无 论 它 是 属 于 固 有 数 据 类 型 还 是 属 于 派 生 数 据 类 型, 就 称 为 标 量 数 组 : 一 个 标 量 的 集 合, 如 果 其 中 每 一 个 元 素 都 具 有 相 同 的 数 据 类 型, 相 同 的 种 别 参 数, 那 么 无 论 它 们 组 织 成 什 么 形 式, 例 如 行, 列, 块, 甚 至 更 高 维 度, 都 把 这 种 集 合 称 为 数 组 派 生 数 据 类 型 : 一 个 标 量 的 集 合, 如 果 其 中 元 素 的 种 别 参 数 不 同, 或 者 数 据 类 型 不 同, 那 么 把 这 个 集 合 称 为 结 构, 或 派 生 数 据 类 型 从 程 序 运 行 这 么 一 个 动 态 过 程 的 角 度 来 看, 特 别 是 基 于 下 面 的 基 本 计 算 模 式 : 输 入 数 据 程 序 运 行 输 出 数 据 数 据 可 以 有 2 种 基 本 行 为 方 式 : 数 据 对 象 在 整 个 程 序 运 行 过 程 当 中 保 持 不 变 ; 数 据 对 象 在 整 个 程 序 运 行 过 程 当 中 发 生 变 化 保 持 不 变 的 称 为 常 量, 发 生 变 化 的 称 为 变 量

63 FORTRAN 95 中 常 量 与 变 量, 标 量 与 数 组 这 些 概 念 与 早 期 的 FORTRAN 版 本 有 微 妙 的 差 异 请 熟 悉 FORTRAN77 的 读 者 注 意 常 量 有 两 种, 一 种 是 字 面 常 量, 早 期 的 FORTRAN 版 本 称 为 常 量 ; 另 一 种 是 命 名 常 量, 早 期 的 FORTRAN 版 本 称 为 常 数 符 号 名, 显 然 新 的 名 称 突 出 表 达 了 该 数 据 作 为 常 量 的 特 点, 它 与 字 面 常 量 的 最 大 差 别 在 于 有 一 个 名 字 这 个 名 字 可 以 在 它 的 定 义 作 用 域 当 中 任 意 引 用 它 们 的 共 同 点 在 于, 它 们 的 值 在 可 执 行 程 序 执 行 期 间 是 不 变 的 字 面 常 量 是 标 量, 根 据 它 的 字 面 的 句 法 构 成 来 表 明 其 数 据 类 型, 种 别 参 数 以 及 值 在 一 个 可 执 行 程 序 中, 所 有 具 有 相 同 形 式 的 字 面 常 量 具 有 相 同 的 值 命 名 常 量 则 是 一 个 与 具 有 PARAMETBR 属 性 的 名 字 相 结 合 的 常 量 它 的 数 据 类 型, 种 别 参 数 和 取 值, 都 需 要 预 先 定 义, 而 一 旦 定 义 之 后, 在 其 定 义 的 作 用 域 内 都 不 会 改 变, 而 且 这 个 名 称 也 必 须 接 受 唯 一 解 释 的 变 量 的 值 即 使 用 DATA 语 句 给 以 初 始 化 也 能 在 程 序 运 行 过 程 当 中 发 生 变 化 而 F ORTRAN 95 的 变 量 包 括 了 早 期 FORTRAN 标 准 里 面 所 谓 的 变 量 和 数 组 具 有 D IMENSION 属 性 的 名 字 在 FORTRAN 95 标 准 里 面 也 称 为 变 量, 属 于 数 组 数 组 是 标 量 的 有 序 集 合, 它 在 FORTRAN 95 标 准 当 中 有 许 多 新 的 扩 充, 将 在 后 面 作 详 细 讨 论 在 程 序 运 行 过 程 当 中, 对 数 据 的 使 用 首 先 必 须 是 定 义, 然 后 才 能 是 引 用, 所 谓 定 义 和 引 用 的 差 别 在 于 : 对 于 一 个 变 量, 当 程 序 中 确 定 其 值 时 称 为 定 义, 而 使 用 其 值 时 称 为 引 用, 已 经 定 义 了 的 变 量 可 以 重 定 义 或 者 回 复 为 无 定 义 例 如, 在 程 序 单 元 中 使 用 DATA 语 句 使 得 一 个 变 量 具 有 初 值, 在 程 序 执 行 过 程 中 又 可 以 对 它 赋 值 而 得 到 重 定 义 ; 如 果 该 变 量 不 具 有 SAVE 属 性 的 话, 当 该 程 序 单 元 执 行 RETURN 语 句 或 END 语 句 后, 它 就 回 复 为 无 定 义 状 态 对 于 一 个 常 量, 它 的 值 可 以 被 引 用 但 不 能 被 重 定 义 命 名 常 量 虽 然 出 现 的 形 式 是 一 个 名 字, 而 不 是 一 个 具 体 的 值, 但 它 只 是 常 量 的 一 个 便 于 引 用 的 标 记 例 6-1 X = 0 N = X+1 在 第 一 个 语 句 当 中, 变 量 X 被 赋 值 为 常 量 值 0, 这 个 语 句 的 执 行 与 X 是 否 在 此 之 前 被 定 义 为 其 他 值 无 关, 总 之 此 时 X 得 到 一 个 定 义, 此 后 只 要 X 没 有 被 重 定 义, 它 就 能 用 值 0 被 程 序 引 用 在 第 二 个 语 句 当 中, X 被 引 用, 并 且 在 执 行 加 1 的 运 算 之 后, 得 到 的 值 被 赋 值 给 N 在 第 一 个 语 句 当 中 的 X 和 在 第 二 个 语 句 当 中 的 N 都 不 是 被 引 用, 而 是 被 定 义, 而 在 第 二 个 语 句 当 中 的 X 属 于 被 引 用 变 量 (variable) 的 句 法 形 式 (R601) 为 ; scalar-variable-name array- variable-name subobject 其 中 子 对 象 (subobject) 的 句 法 形 式 (R602) 为 : array-element array-section

64 structure-component substring 变 量 可 以 是 任 意 的 数 据 类 型, 在 一 定 的 上 下 文 当 中, 变 量 也 必 须 取 一 定 的 数 据 类 型 常 量 父 对 象 的 子 对 象 不 可 能 是 变 量 6.2 数 据 的 结 构 ---- 派 生 数 据 类 型 五 个 固 有 数 据 类 型 已 经 能 够 作 到 描 述, 或 者 近 似 描 述 整 数, 实 数, 复 数, 逻 辑 值, 字 符 串 这 五 类 常 用 数 据 对 象 考 虑 一 下 FORTRAN 建 立 这 五 种 相 对 独 立 的 数 据 类 型 的 出 发 点, 是 有 助 于 我 们 进 一 步 理 解 语 言 的 数 据 描 述 这 个 重 要 任 务 的 首 先 考 虑 整 数 似 乎 整 数 是 一 切 计 算 的 基 本 出 发 点, 这 里 是 没 有 省 略 的 余 地 的, 想 像 一 下, 没 有 了 整 数, 我 们 还 能 做 什 么 计 算 呢? 别 忘 了 Kronecker 的 名 言 : 上 帝 创 造 了 自 然 数, 其 余 都 是 人 造 的 然 后 就 是 实 数 由 于 FORTRAN 本 质 上 只 能 表 示 有 限 位 有 理 数, 因 此 实 际 上 也 可 以 通 过 整 数 的 除 法 来 得 到 实 型 数 据 的 近 似 表 示, 比 方 说 用 一 个 整 数 二 元 组 (37,71) 来 表 示 37/71 这 个 有 理 数, 相 应 的 也 可 以 用 来 近 似 地 表 示 实 数, 我 们 可 以 来 衡 量 一 下 这 样 做 的 利 弊 : 好 处 就 是 可 以 不 用 建 立 实 型 数 据 类 型, 也 就 是 不 用 引 入 小 数 点, 减 少 了 一 个 数 据 类 型, 也 就 简 化 了 FORTRAN 语 言 的 实 现 ; 但 同 时 坏 处 就 是 把 麻 烦 留 给 了 程 序 作 者, 在 处 理 涉 及 实 数 的 问 题 时, 肯 定 会 因 为 不 能 直 接 表 达 实 数 而 增 加 算 法 的 复 杂 性, 甚 至 在 语 言 本 身, 也 有 可 能 不 得 不 增 加 一 些 函 数 之 类 的 语 言 成 分, 用 来 解 决 由 此 产 生 的 一 些 问 题 所 以 FORTRAN 的 解 决 方 案 就 是 直 接 引 入 实 数 的 有 限 有 理 小 数 表 示 ( 实 际 上 一 般 的 程 序 语 言 都 是 这 样 做 的 ), 对 于 语 言 本 身 来 说, 无 非 就 是 增 加 了 对 小 数 点 的 语 义 解 释, 增 加 了 对 浮 点 数 值 的 多 种 存 储 模 式 (FORTRAN 使 用 种 别 参 数 来 进 行 分 类 ) 的 建 立 等, 由 此 而 可 以 在 语 言 当 中 自 然 的 使 用 有 限 有 理 小 数 所 表 示 的 实 数 再 来 分 析 一 下 复 数 本 质 上 复 数 就 是 一 个 实 数 的 二 元 组, 而 且 这 个 二 元 组 与 复 数 是 一 一 对 应 的, 因 此 可 以 很 完 美 的 通 过 运 用 二 元 实 数 组 来 代 替 复 数, 这 也 是 大 多 数 程 序 语 言 的 处 理 方 式 但 是 FORTRAN 的 选 择 是 建 立 一 个 独 立 的 复 型 数 据 类 型, 尽 管 得 为 这 个 独 立 的 数 据 类 型 定 义 相 应 的 运 算, 但 是 由 于 FORTRAN 主 要 就 是 面 向 科 学 计 算 的 语 言, 因 此 FORTRAN 能 够 直 接 写 出 复 数, 成 为 FORTRAN 的 一 个 优 点, 极 大 地 方 便 了 程 序 作 者 由 此 可 见, 建 立 一 个 数 据 类 型 的 主 要 功 能 就 是 面 向 问 题, 以 能 够 直 接 描 述 算 法 为 目 的 那 么 我 们 是 否 有 可 能 从 实 际 问 题 当 中 归 纳 出 一 些 数 据 类 型, 然 后 可 以 期 望 这 些 数 据 类 型 就 可 以 满 足 任 何 问 题 的 需 要 呢? 显 然 是 不 可 能 的 一 方 面, 程 序 语 言 必 须 能 够 精 确 描 述 任 何 需 要 用 它 来 解 决 的 问 题 当 中 出 现 的 数 据 ; 另 一 方 面 我 们 不 可 能 给 每 一 个 新 问 题 当 中 出 现 的 独 特 的 数 据 结 构 形 式 规 定 一 种 相 应 的 数 据 类 型, 唯 一 的 解 决 方 法, 就 是 在 FORTRAN 里 面 约 定 一 种 语 法 机 制, 可 以 依 据 这 种 语 法 机 制 来 描 述 与 问 题 要 求 相

65 适 应 的 数 据 类 型 反 过 来 只 要 是 依 据 这 个 语 法 机 制 构 造 出 来 的 语 言 结 构 都 能 被 FORTRAN 编 译 器 辨 认 为 一 种 数 据 类 型, 从 而 知 道 按 照 什 么 存 储 模 式 来 存 储 该 数 据, 也 知 道 应 该 对 该 种 数 据 施 加 什 么 运 算 这 就 是 FORTRAN 从 90 版 标 准 以 来 设 置 派 生 数 据 类 型 的 出 发 点 鉴 于 固 有 数 据 类 型 被 认 为 是 真 实 世 界 最 基 本 的 数 据 类 型, 任 何 的 数 据 对 象, 或 者 就 是 属 于 某 种 固 有 数 据 类 型, 或 者 就 是 可 以 由 一 系 列 固 有 数 据 描 述, 因 此 构 造 派 生 数 据 类 型 的 基 本 思 想 就 是 认 为 一 个 派 生 数 据 等 于 一 系 列 成 员 的 集 合, 这 个 集 合 构 成 一 种 数 据 结 构, 而 每 一 个 成 员 或 者 仍 然 属 于 一 个 派 生 数 据 类 型, 或 者 就 是 属 于 某 种 固 有 数 据 类 型 这 样 对 一 个 派 生 数 据 类 型 的 描 述, 就 归 结 到 对 它 的 成 员 的 描 述, 另 外 再 加 上 给 出 该 数 据 类 型 的 名 称, 并 可 选 择 性 地 描 述 其 他 属 性 这 样 得 到 的 所 谓 派 生 数 据 类 型, 和 五 种 固 有 数 据 类 型 不 同 的 地 方 主 要 在 于 : 每 一 种 固 有 数 据 类 型 都 拥 有 一 个 特 定 的 名 称, 用 来 作 为 数 据 声 明 的 关 键 词 ; 而 派 生 数 据 类 型 则 需 要 程 序 作 者 自 己 首 先 定 义 一 个 名 称, 然 后 才 能 在 后 面 作 为 关 键 词 进 行 声 明 每 一 种 固 有 数 据 类 型 都 已 经 定 义 好 了 自 己 的 常 量 书 写 方 式 ; 而 派 生 数 据 类 型 则 依 据 其 成 员 的 常 量 形 式 来 确 定 自 己 的 常 量 的 形 式 每 一 种 固 有 数 据 类 型 都 已 经 定 义 好 了 自 己 的 特 定 的 运 算 ; 而 派 生 数 据 类 型 则 需 要 程 序 作 者 自 己 预 先 依 据 实 际 问 题 的 需 要 来 定 义 好 相 应 的 运 算 每 一 种 固 有 数 据 类 型 都 已 经 定 义 好 了 自 己 的 取 值 范 围 以 及 相 应 的 多 种 存 储 模 式 ; 而 派 生 数 据 类 型, 则 完 全 依 据 其 成 员 的 取 值 范 围 与 存 储 模 式, 来 确 定 自 己 的 取 值 范 围 和 存 储 方 式 派 生 数 据 类 型 可 以 在 数 据 类 型 的 定 义 里, 就 给 出 该 数 据 类 型 的 默 认 初 始 值, 使 得 今 后 属 于 该 类 型 的 数 据 对 象 都 一 定 取 该 初 始 值 ; 而 固 有 数 据 类 型 的 定 义 里 面 不 含 有 定 义 初 始 值 的 部 分, 要 想 显 式 地 给 出 变 量 初 始 值, 得 需 要 使 用 数 据 类 型 声 明 语 句 或 者 DATA 语 句 固 有 类 型 的 名 称 是 全 局 性 的, 在 任 何 环 境 总 是 可 访 问 的, 而 派 生 类 型 只 可 在 其 定 义 的 作 用 域 内 访 问 它 们 FORTRAN 定 义 的 数 组 同 样 是 数 据 对 象 的 集 合, 不 过 派 生 数 据 类 型 与 数 组 的 差 别 在 于 组 成 数 组 的 各 个 成 员 必 须 是 相 同 的 数 据 类 型, 而 派 生 数 据 类 型 的 特 点 就 在 于 它 的 成 员 可 以 是 属 于 不 同 的 数 据 类 型 派 生 数 据 类 型 的 成 员 可 以 仍 然 是 某 个 派 生 数 据 类 型, 但 数 组 的 成 员 就 不 能 是 数 组 要 想 让 数 组 的 成 员 为 数 组 只 能 通 过 间 接 的 方 式, 即 取 数 组 的 唯 一 成 员 为 一 个 派 生 数 据 类 型, 然 后 该 派 生 数 据 类 型 的 成 员 取 为 数 组 对 于 这 样 构 造 出 来 的 与 具 体 问 题 密 切 相 关 的 派 生 数 据 类 型, 由 于 其 所 具 有 的 内 部 结 构 个 性 太 强, 显 然 我 们 需 要 定 义 一 些 与 这 种 结 构 相 关 的 特 征 属 性, 可 以 用 来 描 述 这 种 个 性 : 正 是 由 于 一 个 已 经 定 义 好 的 派 生 数 据 类 型 具 有 完 全 个 性 化 的 内 部 结 构, 因 此 如 果 一 个 派 生 数 据 类 型 是 定 义 在 一 个 模 块 内 部 的 话, 自 然 的 问 题 就 是 这 个 派 生 数 据 类 型 的 面 向 模 块 外 部 的 可 访 问 性 如 何 控 制 在 默 认 情 形 下, 一 个 在 模 块 内 部 定 义 的 派 生 数 据 类 型 可 以 被 模 块 外 部 的 任 意 程 序 单 元 访 问, 这 个 默 认 状 态 等 价 于 使 用 PUBLIC 语 句 反 之, 也 可 以 通 过 使 用 PRIVATE 语 句 来 阻 止 模 块 外 程 序 单 元 的 访 问 不 过, 由 于 一 个 模 块 包 含 许 多 不 同 层 次 的 数 据 对 象, 因 此 PRIVATE 的 作 用 对 象 必 须 是 精 确 指 定 的, 这 里 分 为 以 下 几 种 情 况 : 每 一 个 对 象 都 可 以 单 独 地 通 过 使 用 属 性 PUBLIC 或 PRIVATE 来 指 定 其 可 访 问 性 对 于 一 个 派 生 数 据 类 型, 可 以 在 定 义 类 型 的 语 句 当 中 设 置 可 选 的 PUBLIC 或 PRIVATE 描

66 述 符 使 用 单 独 的 针 对 类 型 名 称 的 PRIVATE 语 句 或 在 类 型 定 义 当 中 使 用 PRIVATE 描 述 符, 可 以 把 对 该 类 型 访 问 控 制 在 本 模 块 之 内 在 类 型 定 义 的 内 部 使 用 单 独 的 PRIVATE 语 句, 可 以 只 控 制 该 派 生 类 型 的 特 定 的 组 元 的 模 块 可 访 问 性, 而 不 影 响 整 个 类 型 的 默 认 下 的 可 访 问 性 组 成 一 个 派 生 类 型 的 各 个 成 员 可 以 按 照 一 定 的 顺 序 进 行 存 储, 这 是 通 过 在 派 生 类 型 的 定 义 当 中 运 用 SEQUENCE 语 句 得 到 的 一 个 派 生 类 型 的 定 义 当 中, 成 员 的 叙 述 上 的 顺 序 并 不 表 示 它 们 具 有 相 应 的 存 储 上 的 顺 序, 只 有 在 定 义 当 中 设 置 一 个 SEQUENCE 语 句, 才 能 对 这 些 成 员 的 存 储 进 行 排 序 从 而 可 以 进 一 步 对 这 些 成 员 应 用 COMMON 语 句 或 EQUIVALENCE 语 句 一 个 派 生 数 据 类 型 的 取 值 范 围 显 然 就 是 它 的 所 有 成 员 的 取 值 范 围 的 组 合, 使 用 集 合 论 语 言 就 是 各 成 员 值 集 的 乘 积 FORTRAN 规 定 了 一 个 语 法 机 制 来 给 派 生 数 据 类 型 构 造 值 的 形 式, 例 如 用 来 定 义 命 名 常 量, 这 样 就 可 以 在 类 型 声 明 语 句 或 PARAMETER 语 句 当 中 使 用 其 命 名 常 量 这 种 语 法 机 制 称 为 派 生 数 据 类 型 的 结 构 构 造 器 至 此 我 们 可 以 看 到 FORTRAN 语 言 对 派 生 数 据 类 型 的 定 义, 不 是 以 某 种 真 实 世 界 的 自 然 的 数 据 集 合 为 依 据, 而 是 提 供 一 种 描 述 方 式, 并 且 在 语 言 当 中 约 定, 只 有 运 用 这 种 方 式 进 行 描 述, 就 可 以 成 立 为 一 种 数 据 类 型 而 对 于 通 过 这 种 方 式 成 立 的 数 据 类 型, 同 样 包 含 四 个 方 面 的 基 本 属 性 : 拥 有 名 称, 以 备 引 用 ; 取 值 在 一 定 的 集 合 上 ; 可 以 施 加 的 运 算 ; 常 量 的 写 法 下 面 就 从 这 四 个 方 面 来 说 明 派 生 数 据 类 型 派 生 数 据 类 型 的 构 造 给 出 一 个 派 生 数 据 类 型 的 名 称, 同 时 意 味 着 要 给 出 该 派 生 数 据 类 型 的 完 整 定 义 或 着 说 描 述 一 个 完 整 的 派 生 数 据 类 型 的 句 法 形 式 (R422) 为 : TYPE [[, access-specification] :: ] type-name [private-sequence-statement] component-definition-statement [component-definition-statement] END TYPE [type-name] 其 中 : 可 选 的 访 问 说 明 (access-specification) 为 关 键 词 PUBLIC 或 PRIVATE 类 型 名 称 (type-name) 需 要 由 程 序 作 者 自 己 给 出, 最 好 是 有 意 义 的 英 文 词 汇 或 缩 写 私 用 序 列 语 句 (private-sequence-statement) 为 PRIVATE 语 句 和 SEQUENCE 语 句 每 一 条 成 员 定 义 语 句 (component-definition-statement)(r425) 包 含 一 个 数 据 对 象 的 类 型 说 明 (R502), 其 句 法 形 式 为 : type-specification[ [, component-attribute-list] :: ] component-declaration-list 其 中 : 类 型 说 明 (type-specification) 表 示 一 个 固 有 数 据 类 型, 或 者 是 一 个 已 经 定 义 过 的 派 生 数 据

67 类 型, 不 过 如 果 这 个 描 述 符 后 面 带 有 POINTER 属 性, 由 于 指 针 的 赋 值 特 性, 那 么 该 成 员 就 可 以 表 示 任 意 可 访 问 的 派 生 类 型, 包 括 正 在 被 定 义 的 派 生 类 型 自 身 成 员 属 性 (component-attribute)(r426) 只 能 是 POINTER 或 DIMENSION, 即 对 于 指 针 性 质 的 成 员, 使 用 可 选 的 属 性 POINTER; 而 对 于 数 组 成 员, 使 用 可 选 的 属 性 DIMENSION, 后 面 还 可 以 再 加 上 数 组 描 述 POINTER 和 DIMENSION 这 两 个 属 性 可 以 同 时 出 现 成 员 声 明 (component-declaration) 给 出 成 员 的 名 称 成 员 声 明 (R428) 的 句 法 形 式 为 : component-name[(component-array-specification)] & [*character-length] [component-initialization] 其 中 : 成 员 数 组 说 明 (component-array-specification) 是 可 选 项, 放 置 在 括 号 当 中 如 果 该 数 组 具 有 指 针 属 性, 那 么 它 的 形 状 未 定, 否 则 就 是 显 形 状 在 显 形 状 的 描 述 当 中, 数 组 的 界 都 必 须 是 标 量 整 型 常 量 表 达 式 如 果 在 这 里 没 有 指 出 数 组 的 界, 那 么 一 定 要 在 后 面 的 DIMENSION 属 性 里 说 明 字 符 长 度 参 数 (character-length) 是 一 个 可 选 的 标 量 整 型 字 面 常 量, 它 必 须 以 星 号 开 头 当 然 这 个 参 数 只 能 用 于 修 饰 字 符 型 成 员 成 员 初 始 化 (component-initialization)(r429) 取 下 面 2 种 形 式 之 一 : =initialization-expression =>NULL() 其 中 : 初 始 化 表 达 式 (initialization-expression) 用 来 说 明 非 指 针 成 员 的 默 认 初 始 值 =>NULL() 即 把 成 员 作 为 指 针 赋 值 为 不 带 变 元 的 固 有 函 数 NULL 的 结 果, 表 示 指 针 成 员 的 未 结 合 或 空 置 这 2 种 初 始 结 合 状 态 初 始 化 指 针 状 态 的 用 处 在 于, 很 多 情 形 下, 要 设 置 一 个 指 针, 都 必 须 首 先 要 求 该 指 针 具 有 确 定 的 结 合 状 态 构 造 了 一 个 派 生 数 据 类 型 之 后, 要 使 用 这 个 派 生 类 型, 自 然 需 要 声 明 属 于 该 类 型 的 变 量, 对 于 派 生 类 型 来 说, 变 量 的 声 明 采 用 如 下 句 法 形 式 : TYPE(type-name)[,attribute-list::] entity-list 注 意 这 个 TYPE 语 句 和 定 义 派 生 类 型 的 TYPE 语 句 在 句 法 上 有 差 别 : 声 明 变 量 时,TYPE 后 面 必 须 接 括 号 里 面 的 变 量 所 属 派 生 类 型 名 称 ; 而 定 义 派 生 类 型 时, 后 接 不 带 括 号 的 派 生 类 型 名 称 构 造 了 一 个 派 生 数 据 类 型 之 后, 经 常 需 要 引 用 其 中 的 成 员, 引 用 的 句 法 形 式 为 : parent-structure % component-name 其 中 父 结 构 (parent-structure) 指 需 要 引 用 的 成 员 所 属 的 派 生 数 据 类 型 ( 或 数 据 结 构 ) 派 生 数 据 类 型 构 造 的 一 般 规 则 如 下 : 派 生 数 据 类 型 的 定 义 当 中 给 出 的 类 型 名 称 不 能 与 任 何 固 有 数 据 类 型 的 名 称 重 合, 也 不 能 与 任 何 本 模 块 能 够 访 问 的 其 他 派 生 数 据 类 型 的 名 称 重 合 必 须 保 证 该 名 称 在 它 的 有 效 作 用 域 内 是 指 称 同 一 个 类 型 对 象 而 派 生 数 据 类 型 内 部 成 员 的 名 称 的 作 用 域 只 局 限 于 该 派 生 类 型 内 部, 因 此 不 同 派 生 类 型 的 成 员 可 以 使 用 相 同 的 名 称, 即 使 这 些 不 同 的 派 生 类 型 属 于 同 一

68 个 作 用 域 同 样 的, 不 同 作 用 域 当 中 如 果 出 现 了 相 同 的 派 生 类 型 名 称, 那 么 它 们 实 际 上 是 不 相 干 的 数 据 对 象 END TYPE 语 句 后 面 或 者 省 略 类 型 名 称, 或 者 后 接 该 类 型 的 名 称, 不 能 出 现 不 一 致 的 情 况 一 个 作 用 域 内, 一 个 派 生 类 型 的 名 称 只 能 定 义 一 次 在 一 个 派 生 类 型 的 定 义 当 中,PRIVATE 语 句 只 能 出 现 一 次 在 一 个 派 生 类 型 的 定 义 当 中,SEQUENCE 语 句 也 只 能 出 现 一 次 只 有 当 一 个 类 型 定 义 是 放 置 于 一 个 模 块 的 规 则 说 明 部 分 时, 才 能 使 用 访 问 控 制 符 PUBLIC 或 PRIVATE 只 要 派 生 类 型 的 定 义 当 中 出 现 SEQUENCE 语 句, 就 说 明 该 派 生 类 型 的 所 有 成 员 都 必 须 具 有 顺 序 属 性 ( 即 其 中 也 必 须 出 现 SEQUENCE), 并 且 在 定 义 中 成 员 定 义 的 次 序 就 说 明 了 该 类 型 的 对 象 的 存 储 序 列 在 一 个 派 生 类 型 的 定 义 当 中, 必 须 至 少 包 含 一 个 成 员 的 定 义 在 成 员 定 义 当 中, 任 何 特 定 的 成 员 属 性 都 只 能 出 现 一 次 一 个 成 员 只 有 在 具 有 指 针 属 性 时, 才 可 声 明 为 属 于 被 定 义 的 派 生 类 型 本 身 任 何 非 指 针 的 数 组 成 员, 都 必 须 表 示 为 显 形 状 形 式, 其 上 下 界 都 是 整 型 常 量 表 达 式 如 果 成 员 是 指 定 了 长 度 的 字 符 型 数 据, 那 么 它 的 长 度 必 须 是 整 型 常 量 描 述 表 达 式 如 果 没 有 指 定 长 度 值, 那 么 默 认 值 为 1 如 果 进 行 成 员 初 始 化, 那 么 必 须 使 用 双 分 号 间 隔 符 在 2 种 初 始 化 方 式 中, 初 始 化 表 达 式 只 能 用 于 非 指 针 变 量, 也 可 以 说 等 价 赋 值 符 号 (=) 只 能 用 于 非 指 针 变 量 而 固 有 函 数 NULL() 则 是 用 于 指 针 变 量 的 初 始 化 表 达 式 只 能 在 派 生 类 型 的 作 用 域 当 中 取 值 一 个 派 生 类 型 内 部 的 成 员 当 中, 可 以 只 有 部 分 成 员 是 默 认 初 始 化 的, 即 取 得 默 认 初 始 值, 或 取 得 默 认 初 始 结 合 状 态, 而 不 是 一 定 要 求 所 有 成 员 都 必 须 初 始 化 一 个 成 员 如 果 是 数 组, 那 么 它 的 默 认 初 始 值 必 须 满 足 数 组 的 定 义, 可 以 是 一 个 数 组 构 造 器, 也 可 以 是 一 个 标 量, 这 个 标 量 表 示 了 该 数 组 成 员 的 每 个 元 素 的 初 始 值 下 面 给 出 不 同 情 形 下 构 造 派 生 数 据 类 型 的 例 子 : 例 6-2 TYPE SET INTEGER N, M END TYPE TYPE (SET), DIMENSION (2, 2) :: a, b(3) 在 这 个 派 生 类 型 的 定 义 当 中,a 和 b 都 是 属 于 派 生 数 据 类 型 SET 的 数 组 变 量 例 6-3 TYPE CURRENT REAL::HIGH=5.5, LOW=1.2 END TYPE CURRENT 在 这 个 派 生 类 型 的 定 义 当 中 给 出 了 其 唯 一 实 型 成 员 的 初 始 值. 例 6-4

69 TYPE employee_name CHARACTER(25) last_name CHARACTER(15) first_name END TYPE TYPE employee_addr CHARACTER(20) street_name INTEGER(2) street_number INTEGER(2) apt_number CHARACTER(20) city CHARACTER(2) state INTEGER(4) zip END TYPE 在 上 面 2 个 派 生 类 型 的 定 义 当 中, 一 个 派 生 数 据 对 象 是 另 一 个 派 生 数 据 对 象 的 成 员 例 6-5 例 6-4 中 定 义 的 数 据 对 象 还 可 以 被 第 3 个 数 据 类 型 引 用, 如 : TYPE employee_data TYPE (employee_name) :: name TYPE (employee_addr) :: addr INTEGER(4) telephone INTEGER(2) date_of_birth INTEGER(2) date_of_hire INTEGER(2) social_security(3) LOGICAL(2) married INTEGER(2) dependents END TYPE 例 6-6 TYPE ARTICLE CHARACTER(LEN=100)ABSTRACT INTEGER LINES CHARACTER,POINTER::TEXT(:) END TYPE ARTICLE 在 这 个 派 生 数 据 类 型 里 面 包 含 一 个 指 针 成 员 例 6-7 TYPE LINK INTEGER VALUE TYPE(LINK),POINTER::PREVIOUS=>NULL() TYPE(LINK),POINTER::NEXT=>NULL() END TYPE LINK TYPE (LINK),POINTRE::A_LINK ALLOCATE(LINK)

70 在 这 个 派 生 数 据 类 型 当 中, 指 针 成 员 的 类 型 已 经 被 定 义, 这 种 派 生 数 据 类 型 被 广 泛 应 用 于 链 表 与 树 结 构 例 6-8 TYPE,PRIVATE::FILE INTEGER FILE_NO CHARACTER(LEN=30) FOLDER_NAME CHARACTER(LEN=10) ACCESS_LEVEL END TYPE 这 个 派 生 数 据 类 型 定 义 在 一 个 模 块 当 中, 但 是 对 这 个 模 块 保 持 私 用 状 态 派 生 数 据 类 型 的 取 值, 运 算, 以 及 常 量 表 达 式 一 个 派 生 数 据 类 型 的 值 集 就 是 它 的 成 员 的 值 集 的 乘 积, 也 就 是 它 的 成 员 的 所 有 可 能 取 值 的 所 有 可 能 的 组 合. 我 们 知 道 每 个 固 有 类 型 都 有 一 个 固 定 的 值 集, 在 任 何 环 境 下 引 用 固 有 类 型, 这 个 值 集 都 是 一 致 的, 而 派 生 类 型 的 数 据 值 集 则 完 全 是 根 据 它 的 成 分 的 数 据 值 集 确 定 的 由 于 派 生 数 据 类 型 本 质 上 是 一 种 数 据 结 构, 因 此 对 派 生 类 型 对 象 的 运 算 的 定 义, 需 要 使 用 具 有 OPERATOR 界 面 的 函 数, 而 赋 值 则 使 用 具 有 ASSIGNMENT 界 面 的 子 例 行 程 序 详 细 的 有 关 子 例 行 程 序 及 其 界 面 的 讨 论 参 见 第 13 章 上 面 给 出 的 派 生 数 据 类 型 的 定 义 过 程, 实 质 上 就 是 给 出 了 一 个 语 法 机 制, 根 据 这 个 语 法 机 制 构 造 出 来 的 语 言 结 构 肯 定 能 够 被 FORTRAN 编 译 器 识 别 为 派 生 数 据 类 型 对 象, 即 或 者 是 属 于 该 派 生 数 据 类 型 的 变 量, 或 者 是 属 于 它 的 变 量 的 具 体 取 值 因 此 派 生 数 据 类 型 的 定 义 自 动 给 出 它 的 取 值 的 结 构 构 造 器, 该 结 构 构 造 器 生 成 一 个 数 据 序 列, 其 中 每 一 个 数 据 对 应 着 该 类 型 数 据 对 象 的 一 个 成 员 的 取 值 而 该 类 型 数 据 对 象 的 所 有 成 员 的 所 有 取 值 的 任 意 组 合, 正 是 该 结 构 构 造 器 所 能 生 成 的 所 有 常 量 通 过 这 样 的 结 构 构 造 器 生 成 的 常 量, 也 可 以 用 来 给 定 义 为 该 派 生 类 型 的 命 名 常 量 赋 值 由 于 派 生 数 据 类 型 的 成 员 除 了 可 以 是 固 有 数 据 类 型 之 外, 还 可 以 是 任 意 的 数 据 结 构, 特 别 是 设 置 为 FORTRAN 的 一 种 重 要 的 数 据 结 构 - 数 组 在 这 种 情 况 下, 特 别 定 义 了 一 种 用 来 描 述 派 生 类 型 的 数 组 成 员 的 语 法 机 制, 称 为 数 组 构 造 器 当 数 组 构 造 器 的 取 值 全 是 常 量 表 达 式 时, 得 到 数 组 值 常 量 表 达 式, 这 样 一 个 表 达 式 可 以 作 为 一 个 命 名 常 量 的 数 组 成 员 数 组 构 造 器 不 仅 是 可 以 用 来 给 出 一 个 数 据 结 构 的 成 员 的 值, 也 可 以 用 来 给 出 任 意 数 据 类 型 的 数 组 值 数 据 结 构 构 造 器 一 个 属 于 派 生 数 据 类 型 的 常 量 的 句 法 形 式 (R431) 为 : type-name (expression-list) 其 中 类 型 名 称 (type-name) 为 某 个 派 生 数 据 类 型 的 名 称 表 达 式 列 表 (expression-list) 为 给 出 派 生 数 据 类 型 的 各 个 成 员 值 的 表 达 式 序 列 结 构 构 造 器 的 一 般 规 则 如 下 :

71 结 构 构 造 器 不 能 在 它 所 代 表 的 派 生 数 据 类 型 被 定 义 之 前 出 现, 也 就 是 说 它 给 出 的 派 生 类 型 名 称 不 能 置 空 结 构 构 造 器 给 出 的 值 必 须 与 type-name 所 指 的 派 生 类 型 的 成 员 一 一 对 应, 书 写 顺 序 也 必 须 和 派 生 类 型 定 义 里 各 成 员 的 排 列 顺 序 保 持 一 致 为 了 保 证 与 各 个 成 员 在 类 型, 种 别 参 数, 长 度 以 及 秩 的 一 致, 有 时 可 能 需 要 对 值 进 行 适 当 的 转 换 如 果 派 生 类 型 包 含 数 组 成 员, 那 么 在 各 个 成 员 值 的 表 达 式 序 列 当 中 数 组 的 形 状, 必 须 与 类 型 定 义 当 中 的 该 数 组 成 员 的 形 状 保 持 一 致 如 果 派 生 类 型 包 含 指 针 成 员, 那 么 在 各 个 成 员 值 的 表 达 式 序 列 当 中, 该 指 针 所 对 应 的 值, 必 须 是 相 应 指 针 赋 值 语 句 当 中 的 有 效 目 标 如 果 结 构 构 造 器 的 所 有 成 员 值 都 是 常 量 表 达 式, 那 么 该 构 造 器 实 质 上 就 构 成 一 个 派 生 类 型 的 常 量 表 达 式 例 6-9 考 虑 下 面 的 派 生 数 据 类 型 : TYPE EMPLOYEE INTEGER ID CHARACTER(LEN=40) NAME END TYPE EMPLOYEE 可 以 得 到 下 面 的 结 构 构 造 器 : EMPLOYEE(5645, " 陈 辉 ") 例 子 6-10 下 面 的 派 生 数 据 类 型 包 含 另 外 的 派 生 类 型 作 为 成 员 : TYPE ITEM REAL COST CHARACTER(LEN=30) SUPPLIER CHARACTER(LEN=20) ITEM_NAME END TYPE ITEM TYPE PRODUCE REAL MARKUP TYPE(ITEM) BOOK END TYPE PRODUCE 这 时, 就 需 要 使 用 内 嵌 的 结 构 构 造 器 来 得 到 成 员 取 值 : PRODUCE(.70, ITEM (.25, "XIN HUA", "A BOY")) 6.3 子 串 从 符 号 的 意 义 上 来 看, 下 面 两 个 数 据 对 象 都 是 属 于 字 符 串 : ASDFJASDF

72 如 果 我 们 把 看 成 是 标 量, 那 么 没 有 理 由 不 把 ASDFJASDF 也 看 成 是 标 量 然 后 进 一 步 由 标 量 构 造 成 数 组, 同 样 可 以 用 字 符 串 作 为 数 组 的 分 量, 由 于 字 符 串 的 参 数 就 是 它 的 长 度, 因 此 在 用 字 符 串 构 成 数 组 时, 有 必 要 限 制 它 们 的 长 度 保 持 一 样 要 以 长 度 为 参 数 构 造 字 符 串, 一 个 自 然 的 途 径 就 是 从 一 个 字 符 串 当 中, 按 照 长 度 截 取 其 连 续 的 某 个 部 分, 这 就 提 出 了 子 串 的 概 念 子 串 的 句 法 形 式 (R609) 为 : parent-string(substring-range) 其 中 父 串 (parent-string) 的 句 法 形 式 (R610) 为 以 下 诸 种 形 式 之 一 : scalar-variable-name array-element scalar-structure-component scalar-constant 子 串 范 围 (substring-range) 的 句 法 形 式 (R611) 为 : [starting-position]:[ending-position] 其 中 子 串 的 始 点 和 终 点 为 标 记 父 串 里 字 符 位 置 的 下 标 的 整 型 表 达 式, 始 点 为 子 串 最 左 边 的 字 符 在 父 串 里 所 处 的 下 标 表 达 式, 终 点 为 子 串 最 右 边 的 字 符 在 父 串 里 所 处 的 下 标 表 达 式, 显 然, 始 点 和 终 点 都 处 于 1 到 LEN 之 间,LEN 为 父 串 的 长 度 如 果 始 点 值 大 于 终 点 值, 那 么 系 统 认 为 该 子 串 的 长 度 为 0 给 出 始 点 和 终 点, 就 能 从 父 串 截 取 到 相 应 的 子 串 子 串 的 一 般 规 则 如 下 : 字 符 串 属 于 字 符 型 数 据 类 型, 父 串 与 子 串 都 是 字 符 串 字 符 串 的 下 标 是 按 照 从 左 到 右 的 顺 序, 从 1 开 始, 一 直 到 LEN,LEN 为 字 符 串 的 长 度 子 串 是 父 串 里 从 第 i 个 字 符 开 始, 到 第 j 个 字 符 结 束 的 连 续 的 一 段 字 符 串,I 和 j 都 大 于 等 于 1, 小 于 等 于 LEN, 下 标 为 i 的 字 符 称 为 子 串 的 始 点, 下 标 为 j 的 字 符 称 为 子 串 的 终 点 如 果 始 点 与 终 点 的 下 标 表 达 式 的 值 不 是 整 型, 则 必 须 转 换 为 整 型 如 果 i 没 有 给 出, 默 认 i 为 1; 如 果 j 没 有 给 出, 默 认 j 为 LEN 子 串 的 长 度 可 以 是 0, 但 不 能 是 负 值, 如 果 给 出 的 i 大 于 j, 则 系 统 认 为 子 串 的 长 度 为 0 计 算 子 串 的 长 度 使 用 函 数 MAX, 公 式 为 : MAX(ending-position - starting-position + 1,0) 如 果 父 串 的 长 度 为 0, 那 么 它 的 任 意 子 串 的 长 度 都 是 0 例 6-11 CHARACTER(10)signal_peptide signal_peptide = HLA-A*0301 signal_peptide(1:3) = HAI PRINT *, signal_peptide(7:10) 在 这 个 例 子 里,signal_peptide 被 定 义 为 长 度 为 10 个 字 符 的 字 符 型 变 量, 在 第 一 个 赋 值 语 句 里, 该 变 量 被 赋 值 为 字 符 串 HLA-A*0301, 在 第 二 个 赋 值 语 句 里, 该 变 量 的 下 标 从 1 到 3 的 子

73 串 被 引 用, 并 且 被 赋 值 为 字 符 串 HAI, 这 样 signal_peptide 的 值 就 变 成 了 HAI-A*0301, 接 下 来 的 打 印 语 句 的 执 行 结 果 是 打 印 下 标 从 7 到 10 的 子 串, 为 0301 例 6-12 CHARACTER*8 A, Asteroid Asteroid = '2000 DG8' A = Asteroid (1:4) 在 这 个 例 子 里, 首 先 定 义 了 长 度 为 8 的 2 个 字 符 型 变 量 A 和 Asteroid, 然 后 给 出 2 个 赋 值 语 句, 对 字 符 型 变 量 Asteroid 赋 值 为 '2000 DG8', 而 对 A 赋 值 为 Asteroid 的 一 个 子 串 '2000' 例 6-13 TYPE nearly_isotropic_comets INTEGER inclination REAL semi-major_axis, eccentricity, perihelion_distance, Absolute_Magnitude CHARACTER*12 designation END TYPE nearly_isotropic_comets TYPE(nearly_isotropic_comets) 2000YEAR CHARACTER*12 ASTEROID, BIG_INCLINATION(5) 由 上 面 定 义 的 字 符 串, 可 以 得 到 如 下 合 法 子 串 : BIG_INCLINATION(2) (1:4)! 父 串 为 数 组 元 素 2000YEAR % designation(6:12)! 父 串 为 结 构 成 员 ASTEROID (1:4)! 父 串 为 标 量 变 量 ABCDEFGH (N:N+1)! 父 串 为 字 符 常 量 如 果 一 个 数 组 的 分 量 为 字 符 串, 那 么 由 这 个 数 组 构 造 子 串, 可 以 有 很 多 种 合 法 的 可 能 性, 例 如, BIG_INCLINATION(:) (1:4), 表 示 对 一 个 由 子 串 组 成 的 数 组 片 断 的 引 用 ; BIG_INCLINATION(1:4) (1:4), 同 样 表 示 一 个 由 子 串 组 成 的 数 组 片 断 的 引 用 因 此 如 果 要 从 一 系 列 长 度 一 致 的 字 符 串 构 造 相 同 下 标 范 围 的 子 串, 可 以 通 过 对 数 据 组 的 片 断 引 用 而 实 现 不 过 必 须 注 意 数 组 片 断 下 标 放 置 于 子 串 下 标 之 前 由 于 表 示 数 组 片 断 的 句 法 形 式 和 表 示 子 串 下 标 范 围 的 句 法 形 式 一 样, 因 此 必 须 使 用 这 个 顺 序 安 排, 才 能 得 到 无 歧 义 的 表 示 例 6-14 下 面 2 个 引 用 含 义 完 全 不 同 : BIG_INCLINATION(:) (1:4) BIG_INCLINATION (1:4) 前 者 表 示 由 5 个 子 串 构 成 的 数 组, 后 者 表 示 由 4 个 父 串 构 成 的 数 组 由 ABCDEFGH (N:N+1) 得 到 的 子 串 既 非 常 量, 也 非 变 量, 因 为 它 的 下 标 是 一 个 变 量, 得 到 的 子 串 称 为 常 量 子 对 象 参 见 表 达 式 的 形 式

74 6.4 结 构 成 员 所 谓 结 构 就 是 一 个 集 合, 其 元 素 可 以 是 任 意 数 据 类 型, 也 可 以 是 标 量 或 数 组, 一 个 结 构 至 少 包 含 一 个 元 素, 这 样 的 结 构 本 身 就 是 一 种 派 生 数 据 类 型, 由 同 一 类 型 的 多 个 结 构 又 可 以 组 成 一 个 数 组 因 此 我 们 可 以 看 到, 结 构 的 定 义 包 含 递 归 的 成 分, 这 样 能 够 保 证 提 供 最 大 的 灵 活 性, 以 便 足 够 充 分 地 描 述 实 际 问 题 当 中 出 现 的 数 据 结 构, 减 少 因 为 数 据 结 构 复 杂 而 导 致 算 法 复 杂 的 压 力 定 义 一 个 结 构 之 后, 如 果 要 引 用 其 成 员, 可 以 直 接 使 用 如 下 形 式 : parent [%component [(section-subscript-list)]]... %component [(section-subscript-list)] 其 中 : parent 为 父 结 构 名 称 百 分 符 号 (%) 称 为 成 员 选 择 符 component 为 其 左 边 邻 接 父 结 构 或 成 员 的 成 员 section-subscript-list 表 示 片 断 下 标 列, 如 果 该 下 标 列 包 含 下 标 三 元 组 或 者 向 量 下 标, 那 么 就 表 示 引 用 一 个 数 组 片 断 由 于 结 构 定 义 具 有 递 归 成 分, 因 此 要 引 用 结 构 的 成 员, 就 会 出 现 很 多 的 情 形, 更 加 抽 象 的 理 解 是 把 结 构 成 员 的 引 用 (R614) 看 是 一 种 数 据 引 用 (R612) 的 形 式 所 谓 数 据 引 用, 是 把 任 何 被 引 用 的 数 据 看 成 某 个 数 据 集 合 的 部 件, 这 种 包 含 关 系 可 以 任 意 多 层 地 嵌 套, 因 此 结 构 成 员 的 引 用 也 可 以 运 用 句 法 形 式 ( 参 见 附 录 B) 递 归 定 义 如 下 : part-reference [%part-reference] 其 中 部 件 引 用 (part-reference)(r613) 的 形 式 定 义 为 : part-name [(section-subscript-list)] 其 中 片 断 下 标 (section-subscript)( R618) 的 形 式 定 义 为 以 下 几 种 情 况 之 一 : subscript subscript-triplet vector-subscript 有 关 数 组 片 断 的 下 标 参 见 节 结 构 成 员 引 用 的 一 般 规 则 如 下 : 结 构 成 员 的 引 用 作 为 数 据 部 件 的 引 用, 要 求 被 引 用 的 部 件 是 属 于 多 个 部 件 之 中 的 一 个 作 为 结 构 成 员 引 用 的 数 据 引 用 的 最 右 边 的 被 引 用 的 部 件, 必 须 是 一 个 部 件 名 称, 如 果 该 部 件 引 用 具 有 形 式 : part-name (section-subscript-list) 那 么 被 引 用 的 就 是 一 个 数 组 片 断, 在 最 简 单 的 情 形 下, 是 一 个 数 组 元 素 在 上 述 数 据 引 用 定 义 里, 除 了 最 右 边 的 部 件 名 之 外, 每 一 个 部 件 名 称 都 必 须 是 指 称 一 个 派 生 类 型 数 据 对 象 数 据 引 用 时, 除 了 最 左 边 的 部 件 名 之 外, 每 一 个 部 件 名 称 都 必 须 是 其 左 边 邻 接 部 件 名 称 所 表 示 的 派 生 类 型 的 成 员 在 上 述 数 据 引 用 定 义 里, 任 意 位 置 的 部 件 都 可 以 是 数 组, 一 个 数 组 右 边 邻 接

75 的 成 员 不 能 具 有 指 针 属 性 如 果 父 结 构 具 有 INTENT, TARGET, 或 PARAMETER 属 性, 则 其 结 构 成 员 也 具 有 同 样 的 属 性 在 父 结 构 还 没 有 被 声 明 之 前, 其 结 构 成 员 不 能 被 引 用 结 构 成 员 如 果 含 有 非 0 秩 的 部 件, 那 么 它 的 秩 就 是 非 0 秩 的 部 件 的 秩, 否 则 秩 为 0 结 构 成 员 的 类 型 和 类 型 参 量 ( 如 果 存 在 的 话 ), 与 最 右 边 的 部 件 保 持 一 致 例 6-15 下 面 定 义 一 个 包 含 2 个 成 员 的 派 生 数 据 类 型 : TYPE EMPLOYEE INTEGER ID CHARACTER(LEN=40) NAME END TYPE EMPLOYEE 然 后 声 明 变 量 CONTRACT 属 于 派 生 数 据 类 型 EMPLOYEE, 并 且 引 用 该 变 量 的 一 个 成 员 TYPE(EMPLOYEE) :: CONTRACT CONTRACT%ID 例 6-16 下 面 定 义 一 个 派 生 类 型 作 为 另 一 个 派 生 类 型 的 成 员 : TYPE DOT REAL X, Y END TYPE DOT... TYPE SCREEN TYPE(DOT) C, D END TYPE SCREEN 然 后 声 明 变 量 M 属 于 派 生 类 型 SCREEN, 并 且 引 用 该 变 量 的 几 个 成 员 : TYPE(SCREEN) M M%C M%D (both of type DOT); M%C has components M%C%X M%C%Y of type REAL. 例 6-17 下 面 定 义 一 个 包 含 数 组 成 员 的 派 生 类 型 : TYPE CAR_INFO INTEGER YEAR CHARACTER(LEN=15), DIMENSION(10) :: MAKER CHARACTER(LEN=10) MODEL, BODY_TYPE*8 REAL PRICE END TYPE... TYPE(CAR_INFO) MY_CAR

76 例 6-18 下 面 定 义 派 生 类 型 以 及 属 于 该 类 型 的 2 个 变 量 : TYPE CHARGE INTEGER PARTS(40) REAL LABOR REAL MILEAGE END TYPE CHARGE TYPE(CHARGE) MONTH TYPE(CHARGE) YEAR(12) 如 下 引 用 的 数 组 都 是 合 法 的 : MONTH%PARTS(I)! An array element MONTH%PARTS(I:K)! An array section YEAR(I)%PARTS! An array structure component (a whole array) YEAR(J)%PARTS(I)! An array element YEAR(J)%PARTS(I:K)! An array section YEAR(J:K)%PARTS(I)! An array section YEAR%PARTS(I)! An array section 例 6-19 下 面 定 义 的 派 生 类 型 包 含 一 个 已 有 定 义 的 指 针 成 员 : TYPE NUMBER INTEGER NUM TYPE(NUMBER), POINTER :: START_NUM => NULL( ) TYPE(NUMBER), POINTER :: NEXT_NUM => NULL( ) END TYPE 这 样 的 结 构 可 以 用 来 构 造 链 表, 注 意 其 中 的 指 针 为 默 认 的 非 结 合 初 始 状 态 例 6-20 下 面 定 义 一 个 私 用 派 生 类 型 : TYPE, PRIVATE :: SYMBOL LOGICAL TEST CHARACTER(LEN=50) EXPLANATION END TYPE SYMBOL 这 个 派 生 类 型 属 于 模 块 私 用 类 型, 该 模 块 可 以 被 其 他 作 用 域 访 问, 但 该 类 型 只 能 被 本 模 块 引 用 6.5 数 组 数 组 同 样 是 一 个 集 合, 它 的 元 素 必 须 是 标 量, 其 标 量 元 素 可 以 属 于 任 何 的 固 有 数 据 类 型, 派 生 数 据 类 型, 甚 至 是 结 构, 但 数 组 最 关 键 的 一 个 特 征 是 : 数 组 的 所 有 标 量 元 素 必 须 属 于 同 一 个 数 据 类 型, 并 且 具 有 同 样 的 种 别 参 数

77 这 个 特 征 决 定 了 数 组 是 一 种 功 能 强 大 的 数 据 结 构, 因 为 存 在 大 量 的 实 际 问 题, 需 要 用 同 一 个 计 算 过 程 来 处 理 大 规 模 的 同 种 类 型 的 数 据, 因 此 FORTRAN 95 提 供 了 强 大 的 内 部 运 算 和 固 有 函 数, 专 门 用 来 处 理 整 个 数 组, 或 者 数 组 元 素, 或 者 数 组 片 断, 同 时 硬 件 的 并 行 化 发 展, 也 为 这 一 类 通 常 是 极 大 规 模 的 运 算, 提 供 了 优 化 的 解 决 方 案 在 FORTRAN 的 早 期 版 本 里 面, 数 组 是 作 为 数 据 的 一 种 属 性 加 以 描 述 的, 所 使 用 的 关 键 词 为 DIMENSION 这 个 规 则 一 直 被 保 留 下 来, 因 此 任 何 数 据 对 象 只 要 是 具 有 DIMENSION 属 性, 就 一 定 为 数 组 数 组 的 结 构 数 组 的 结 构 可 以 抽 象 地 理 解 为 多 维 离 散 空 间 的 点 的 集 合, 即 这 些 点 都 有 相 同 的 维 度, 在 每 一 维 上 的 坐 标 取 值 都 是 离 散 的 标 量 格 : 一 个 具 体 的 例 子 就 是 表 格 实 际 上 表 格 总 是 可 以 用 二 维 数 组 加 以 描 述, 例 如 取 上 章 的 如 下 表 表 6-1 表 格 可 以 看 成 数 组 作 用 单 元 的 种 类 语 句 主 程 序 模 块 数 据 块 外 部 子 程 序 模 块 子 程 序 内 部 子 程 序 接 口 块 USE 语 句 Y Y Y Y Y Y Y ENTRY 语 句 N N N Y Y N N FORMAT 语 句 Y N N Y Y Y N 其 他 声 明 Y Y Y Y Y Y Y DATA 语 句 Y Y Y Y Y Y N 导 出 类 型 定 义 Y Y Y Y Y Y Y 接 口 块 Y Y N Y Y Y Y 语 句 函 数 Y N N Y Y Y N CONTAINS Y Y N Y Y N N 可 执 行 语 句 Y N N Y Y Y N 如 果 该 表 格 的 行, 即 作 用 单 元 的 种 类 看 成 是 一 个 维 度 a; 把 该 表 格 的 列, 即 语 句 的 种 类, 看 成 是 另 一 个 维 度 b, 那 么 该 表 格 的 每 一 个 元 素 都 可 以 用 符 号 E 作 用 单 元 的 种 类, 语 句 的 种 类, 或 者 E a,b, 来 表 示, 其 中 a 可 以 取 7 个 值 : 主 程 序, 模 块, 数 据 块, 外 部 子 程 序, 模 块 子 程 序, 内 部 子 程 序, 接 口 块 b 可 以 取 10 个 值 : USE 语 句,ENTRY 语 句,FORMAT 语 句, 其 他 声 明,DATA 语 句, 导 出 类 型 定 义, 接 口 块, 语 句 函 数,CONTAINS, 可 执 行 语 句 而 每 个 元 素 E a,b 取 值 为 符 号 Y 或 N 这 样 我 们 就 把 一 个 表 格 完 全 的 用 一 个 数 组 加 以 描 述 了 从 上 面 的 例 子 可 以 看 到, 数 组 的 结 构 是 由 维 度, 和 每 个 维 度 的 取 值 数 目 决 定 的 其 中 : 一 个 数 组 的 维 度 的 数 目 称 为 该 数 组 的 秩 ; 每 个 维 度 的 坐 标 数 目 称 为 数 组 在 该 维 度 的 宽 度 ; 那 么 一 个 数 组 的 秩 和 每 个 维 度 的 宽 度 就 决 定 了 该 数 组 的 形 状 ;

78 一 个 数 组 的 所 有 维 度 的 宽 度 的 乘 积, 称 为 该 数 组 的 尺 度, 也 就 是 该 数 组 的 元 素 的 数 目 数 组 的 秩 至 少 可 以 达 到 7, 这 是 FORTRAN 标 准 所 要 求 的 任 何 编 译 器 都 必 需 达 到 的 数 组 处 理 规 模, 当 然 实 际 的 编 译 器 所 能 处 理 的 数 组 的 秩 都 要 大 于 7 同 时 FORTRAN 标 准 对 于 宽 度 的 大 小 没 有 限 制 数 组 的 形 状 可 以 用 类 似 于 向 量 的 形 式 表 示, 即 括 号 当 中 的 一 串 标 量 数 值, 用 逗 号 相 隔, 每 个 数 值 表 示 相 应 的 维 度 的 宽 度 例 如 : REAL A(2,25,10) 这 个 数 组 可 以 用 上 面 的 语 句 来 描 述, 但 是 这 里 的 描 述 方 式 更 加 具 体 地 说 明 了 数 组 的 第 2 个 维 度 的 下 标 标 示 方 式, 即 用 从 0 到 24 的 下 标 了 标 示 25 个 该 维 度 的 坐 标 显 然 数 组 A 的 尺 度 为 可 以 用 别 的 形 式 加 以 说 明 例 6-21 TARGET A(2,0:24,10), 即 数 组 A 包 含 500 个 元 素 同 样 形 状 的 数 组 A 还 由 于 机 器 表 达 数 据 的 有 限 性, 数 组 在 每 个 维 度 上 的 坐 标 都 必 定 有 上 下 界, 当 在 数 组 描 述 时 使 用 了 下 标, 那 么 最 小 下 标 值 就 是 数 组 在 该 维 度 的 下 界, 最 大 下 标 值 就 是 数 组 在 该 维 度 的 上 界 必 需 注 意 的 是 这 时 数 组 的 下 标 范 围 可 以 取 任 意 的 整 数 值 范 围, 而 如 果 没 有 在 数 组 说 明 当 中 说 明 下 标 范 围, 只 是 给 出 其 宽 度 n, 那 么 数 组 在 该 维 度 的 默 认 下 标 范 围 是 1:n, 即 从 1 到 n 的 自 然 数 表 示 以 实 型 数 值 为 元 素 的 数 组 A, 含 有 3 维, 每 个 维 度 的 宽 度 分 别 是 2,25,10 在 描 述 每 个 维 度 的 宽 度 时, 可 以 使 用 下 标 范 围 的 形 式, 也 就 同 时 说 明 了 该 维 度 的 元 素 的 下 标 表 示 方 法, 例 如 : REAL A(2,0:24,10) DIMENSION A(2,0:24,10) 因 此 与 上 面 同 样 形 状 的 数 组 A 还 可 以 表 示 为 : REAL A(2, 5:29,10) 关 于 形 状 的 描 述 里 面 的 上 下 界 的 表 示, 参 见 第 8 章 的 有 关 小 节 全 数 组 = 500 REAL,DIMENSION(2,0:24,10):: A COMMON A(2,0:24,10) REAL A(2,-5:19,10) 由 于 数 组 是 一 个 数 据 结 构, 因 此 对 于 数 组 的 引 用, 可 以 是 引 用 整 个 数 组, 也 可 以 是 引 用 数 组 的 某 个 元 素, 某 些 元 素, 或 数 组 的 片 断, 具 体 的 分 别 在 于, 如 果 是 引 用 了 数 组 的 名 称, 无 论 是 一 个 常 量 数 组 的 名 称, 还 是 一 个 变 量 数 组 的 名 称, 只 要 在 引 用 该 数 组 名 称 时, 不 包 含 该 数 组 的 下 标 列, 或 数 组 片 断 的 下 标 列, 那 么 就 是 把 该 数 组 作 为 一 个 整 体 加 以 引 用, 即 作 为 一 个 全 数 组 一 个 全 数 组 如 果 具 有 INTENT,TARGET,PARAMETER 这 些 属 性, 那 么 它 的 任 意 元 素 和 片 断 都 具 有 相 应 的 属 性 ;

79 一 个 全 数 组 如 果 具 有 POINTER 属 性, 注 意, 它 的 任 意 元 素 和 片 断 都 不 具 有 相 应 的 POINTER 属 性 数 组 元 素 数 组 元 素 的 引 用 很 简 单, 直 接 用 下 标 给 出 该 元 素 在 每 一 个 维 度 上 的 坐 标 即 可 例 6-22 声 明 1 维 数 组 X 如 下 : INTEGER,DIMENSION(25)::X 那 么 对 X 的 元 素 的 引 用 例 子 为 : X(3),X(12),X(24) 声 明 3 维 数 组 A 如 下 : REAL,DIMENSION(2,25,10):: A 那 么 对 A 的 元 素 的 引 用 例 子 为 : A(1,12,5),A(2,22,8),A(1,17,10) 这 里 的 (1,12,5) 等 称 为 下 标 列 数 组 片 断 数 组 最 灵 活 的 功 能 体 现 在 能 够 以 数 组 的 任 意 部 分 为 对 象 作 运 算, 把 一 个 数 组 的 任 意 指 定 部 分 作 为 一 个 新 的 数 组, 称 为 数 组 片 断, 而 其 所 属 的 数 组 称 为 该 数 组 片 断 的 父 数 组 数 组 片 断 的 引 用, 首 先 是 一 个 父 数 组 变 量 名 称, 然 后 是 下 标 列, 不 过 这 里 的 下 标 列 里 面, 必 需 至 少 包 含 一 个 下 标 是 用 下 标 三 元 组, 或 者 是 下 标 向 量 来 表 示 的, 否 则 这 个 引 用 就 成 了 对 数 组 元 素 的 引 用 下 标 三 元 组 和 下 标 向 量 的 定 义 见 下 节 例 6-23 下 面 是 引 用 了 一 个 数 组 片 断 : INTEGER,DIMENSION(25)::X X(10:16)=78 上 面 定 义 了 1 维 整 型 数 组 X, 其 宽 度 为 25, 后 面 引 用 了 X 的 一 个 片 断, 由 X 的 第 10 个 坐 标 到 第 16 个 坐 标 这 7 个 元 素 组 成, 在 这 个 引 用 当 中,X 所 指 定 的 这 7 个 元 素 都 被 赋 值 为 78 注 意 这 里 的 坐 标 引 用 (10:16) 为 一 个 省 略 了 第 3 项 的 下 标 三 元 组 数 组 元 素 和 数 组 片 断 的 句 法 形 式 数 组 元 素 的 引 用 实 质 上 就 是 数 据 引 用, 因 此 数 组 元 素 的 一 般 句 法 形 式 就 是 R612 数 组 片 断 的 一 般 句 法 形 式 (R616) 为 一 个 数 据 引 用, 后 接 一 个 可 选 的 包 含 在 括 号 当 中 的 子 串 范 围 子 串 范 围 的 句 法 形 式 见 6.3 节 的 R611 数 据 引 用 当 中 的 组 分 名 称 可 以 后 接 一 个 可 选 的 片 断 下 标 列, 片 断 下 标 的 句 法 形 式 (R618) 可 以

80 是 如 下 3 种 之 一 : subscript subscript-triplet vector-subscript 其 中 下 标 三 元 组 (subscript-triplet) 的 句 法 形 式 (R619) 是 : [subscript]:[subscript]:[stride] 下 标 向 量 (vector-subscript)(r621) 则 就 是 一 般 的 秩 为 1 的 整 型 数 组 表 达 式 这 里 的 下 标 和 步 长 (stride) 都 必 须 是 整 型 标 量 表 达 式 一 般 规 则 如 下 : 如 果 被 引 用 数 据 是 一 个 数 组 元 素, 那 么 这 个 数 据 引 用 的 每 个 部 件 引 用 都 必 需 是 秩 为 0, 而 最 后 的 部 件 引 用 必 需 包 含 一 个 下 标 列 如 果 被 引 用 数 据 是 一 个 数 组 片 断, 那 么 必 须 有 一 个 部 件 引 用 为 非 0 秩, 并 且 或 者 是 最 后 的 部 件 引 用 非 0 秩 的 片 断 下 标 列, 或 者 是 另 外 一 个 部 件 引 用 具 有 非 0 秩 如 果 一 个 数 组 片 断 以 后 接 子 串 范 围 的 数 据 引 用 的 形 式 出 现, 那 么 最 右 边 的 部 件 名 称 必 须 是 字 符 型 在 数 组 的 每 一 个 维 度 上, 片 断 的 下 标 都 必 须 给 出 例 6-24 下 面 都 是 合 法 的 数 组 元 素 与 数 组 片 断 的 引 用 : X(2,3) X(1:N:2,M) Y(:, :, :)(1:3) SCALAR_A % ARRAY_D(L) SCALAR_A % ARRAY_D(1:L) SCALAR_A % ARRAY_E(1:N)%SCALAR_D ARRAY_F(1:N:2) % ARRAY_G(I,J) % STRING( K)(:) TYPE REPAIR_BILL REAL PARTS (30) REAL LABOR END TYPE REPAIR_BILL TYPE VEHICLE CHARACTER(LEN=35)OWNER INTEGER MILEAGE TYPE(REPAIR_BILL)COST END TYPE VEHICLE TYPE(VEHICLE)BLACK_BURK YELLOW_XIALI PRINT*,BLACK_BURK % COST % PARTS PRINT*,YELLOW_XIALI % COST % LABOR PRINT*,BLACK_BURK % OWNER

81 TYPE(REPAIR_BILL)FIRST TYPE(REPAIR_BILL)FOR2000(10) 例 6-25 下 面 都 是 合 法 的 标 量 父 结 构 : FIRST % LABOR FIRST % PARTS(I) FIRST % PARTS FIRST % PARTS(I:J) FOR2000(K)% LABOR FOR2000(K)% PARTS(I) FOR2000(K)% PARTS FOR2000(K)% PARTS(I:J) 例 6-26 下 面 都 是 合 法 的 向 量 父 结 构 : FOR2000 % LABOR FOR2000 % PARTS(I) FOR2000(K:L)% LABOR FOR2000(K:L) % PARTS(I) 例 6-27 下 面 都 是 非 法 的 向 量 父 结 构 : FOR2000(K:L) % PARTS! 非 法 FOR2000(K:L) % PARTS(I:J)! 非 法 FOR2000 % PARTS! 非 法 FOR2000 % PARTS(I:J)! 非 法 1. 下 标 在 对 数 组 元 素 作 引 用 时, 每 一 个 下 标 都 必 须 处 于 该 元 素 所 属 维 度 的 下 标 上 下 界 之 中 如 果 下 标 出 现 在 数 组 片 断 的 引 用 当 中, 那 就 意 味 着 该 被 引 用 的 片 断 相 对 于 其 父 数 组 缺 少 了 相 应 的 维 度, 因 此 片 断 的 秩 也 就 相 应 地 要 减 少 1, 因 此 在 引 用 数 组 片 断 时, 如 果 父 数 组 的 某 个 维 度 只 是 以 其 上 下 界 的 某 个 坐 标 出 现 在 其 片 断 引 用 当 中, 显 然 该 维 度 实 际 上 在 其 片 断 里 就 被 压 缩 为 1 点 了, 也 就 是 减 少 了 一 个 维 度 2. 下 标 三 元 组 所 谓 下 标 三 元 组 是 一 种 表 示 从 在 某 个 维 度 上 连 续 取 值 的 数 组 里, 有 规 律 地 按 照 固 定 间 隔 取 数 组 片 断 的 表 达 形 式 下 标 三 元 组 的 一 般 形 式 (R619) 见 上 其 中 第 一 个 数 值 表 示 取 片 断 的 相 应 维 度 上 的 下 界 ; 第 二 个 数 值 表 示 取 片 断 的 相 应 维 度 上 的 上 界 ; 第 三 个 数 值 表 示 在 从 上 界 到 下 界, 按 照 固 定 间 隔 取 坐 标 时 的 步 长 下 标 三 元 组 的 一 般 规 则 如 下 : 如 果 下 界 被 省 略 了, 那 么 所 取 默 认 值 为 父 数 组 所 声 明 的 下 界 ; 如 果 上 界 被 省 略 了, 那 么 所 取 默 认 值 为 父 数 组 所 声 明 的 上 界 ; 如 果 步 长 被 省 略 了, 那 么 所 取 默 认 值 为 1; 如 果 上 下 界 和 步 长 都 被 省 略 了, 而 只 剩 下 冒 号 (:), 那 么 就 是 取 整 个 维 度 范 围 ;

82 如 果 步 长 为 正 整 数, 那 么 该 片 断 的 下 标 为 一 个 数 列, 取 值 为 从 下 界 开 始, 以 步 长 为 间 隔, 递 增 直 至 不 大 于 上 界 的 最 大 下 标 值 ; 这 时 如 果 下 界 大 于 上 界, 那 么 该 片 断 的 下 标 数 列 为 空 集 ; 如 果 一 个 片 断 的 下 标 数 列 为 空 集, 那 么 该 数 组 片 断 的 尺 度 为 0; 步 长 不 能 取 0; 如 果 步 长 为 负 整 数, 那 么 该 片 断 的 下 标 为 一 个 数 列, 取 值 为 从 下 界 开 始, 以 步 长 为 间 隔, 递 减 直 至 不 小 于 上 界 的 最 小 下 标 值 ; 这 时 如 果 下 界 小 于 上 界, 那 么 该 片 断 的 下 标 数 列 为 空 集 ; 只 要 按 照 三 元 组 所 取 的 数 组 元 素 都 包 含 在 父 数 组 的 某 个 维 度 范 围 里 面, 那 么 该 三 元 组 所 给 出 的 范 围 可 以 超 出 父 数 组 所 声 明 的 相 应 维 度 范 围 例 6-28 如 果 数 组 A 声 明 如 下 : A(7,8,9) 而 A 的 一 个 片 断 为 : A(4:7,5,3:4) 那 么 该 片 断 的 秩 为 2, 比 其 父 数 组 A 的 秩 小 1, 因 为 该 片 断 引 用 当 中 的 第 2 个 维 度 出 现 了 一 个 单 独 的 下 标, 故 维 度 减 小 了 1; 而 片 断 的 形 状 为 (4,2), 尺 度 为 8, 它 的 8 个 元 素 为 : A(4,5,3) A(4,5,4) A(5, 5,3) A(5,5,4) A(6,5, 3) A(6,5,4) A(7,5,3) A(7,5,4) 例 6-29 给 出 数 组 A(100), 而 它 的 一 个 片 断 为 A(45:28:-5), 那 么 该 片 断 的 秩 为 1, 形 状 为 (4), 尺 度 为 4, 它 的 所 有 元 素 为 : A(45) A(40) A(35) A(30) 而 如 果 取 其 片 断 为 A(45:28), 这 时 默 认 步 长 为 1, 显 然 其 尺 度 为 0; 如 果 取 其 片 断 为 A(25:110:35), 尽 管 第 2 个 下 标 超 出 了 父 数 组 A 的 下 标 范 围, 但 是 该 片 断 的 元 素 却 没 有 超 出 父 数 组 的 元 素 范 围, 因 此 这 种 片 断 取 法 是 合 法 的, 它 的 所 有 元 素 为 : A(25) A(60) A(95) 3. 下 标 向 量 鉴 于 依 靠 下 标 三 元 组 所 截 取 的 数 组 片 断 是 具 有 规 则 形 式 的 数 组 片 断, 当 我 们 需 要 其 他 形 式 的

83 数 组 片 断 时, 三 元 组 就 无 法 胜 任 相 应 的 描 述 数 组 的 任 务 了, 因 此 FORTRAN 给 出 了 一 种 具 有 最 大 的 灵 活 性 的 截 取 数 组 片 断 的 方 式, 即 下 标 向 量 所 谓 下 标 向 量, 就 是 由 一 些 下 标 值 构 成 的 一 个 向 量, 这 些 下 标 值 取 自 父 数 组 在 某 个 维 度 上 的 下 标 范 围, 由 与 这 些 下 标 值 相 应 的 坐 标 就 构 成 了 父 数 组 的 一 个 数 组 片 断 例 6-30 INTEGER I(10) REAL A(100) I=(/ 23,35,11,46,57,65,78,89,90,1/) A(I)=3.34 这 段 例 程 里 首 先 定 义 了 2 个 秩 为 1 的 数 组 变 量 I(10) 和 A(100), 也 即 向 量, 然 后 在 后 面 用 赋 值 语 句 给 出 I 的 一 个 具 体 赋 值, 接 着 以 I 为 数 组 下 标 变 量, 给 出 了 数 组 A 的 部 分 元 素 的 一 个 具 体 赋 值, 实 际 上, 这 里 I 就 是 下 标 向 量, 而 A(I) 则 是 由 下 标 向 量 I 所 给 出 的 父 数 组 A(100) 的 一 个 数 组 片 断 注 意 其 中 根 据 向 量 I 的 赋 值,A 的 片 断 截 取 是 任 意 顺 序 的, 这 就 体 现 了 利 用 下 标 向 量 来 截 取 数 组 片 断 的 特 点 不 过 虽 然 由 下 标 向 量 来 截 取 数 组 片 断 具 有 极 大 的 灵 活 性, 但 是 根 据 下 标 向 量 而 得 到 的 数 组 片 断 具 有 如 下 限 制 : 1. 不 能 作 为 外 部 文 件 ; 2. 不 能 作 为 指 针 目 标 ; 3. 不 能 作 为 哑 元 INTENT(OUT) 或 INTENT(INPUT) 的 实 元 下 标 向 量 的 构 成 允 许 出 现 重 复 的 元 素, 例 如 在 上 面 的 例 子 里 面, 下 标 向 量 I 可 以 赋 值 为 : I=(/ 23,35,23,46,57,65,78,89,90,1/) 这 样 A(23) 就 会 被 访 问 2 次, 即 A(I(1)) 和 A(I(3)), 这 样 得 到 的 数 组 片 断 仍 然 是 合 法 的, 被 称 为 多 对 一 数 组 片 断, 这 样 的 数 组 片 断 不 能 出 现 在 如 下 场 合 : 赋 值 语 句 当 中 等 号 的 左 边 ; READ 语 句 的 输 入 项 下 标, 下 标 三 元 组 和 下 标 向 量 的 混 合 使 用 上 面 说 明 了 如 何 分 别 使 用 下 标, 下 标 三 元 组 和 下 标 向 量 这 三 种 方 式 来 截 取 数 组 片 断, 实 际 上, 这 三 种 方 式 可 以 根 据 具 体 问 题 的 要 求 来 混 合 使 用, 下 面 是 1 个 例 子 例 6-31 给 出 父 数 组 A 如 下 : A(20,10,20) 可 以 构 造 A 的 一 个 数 组 片 断 如 下 : A(4:22:7, 9, 10:15:3) 该 片 断 的 所 有 元 素 如 下 : A(4,9,10) A(11,9,10)

84 A(18,9,10) A(4,9,13) A(11,9, 13) A(18,9,13) 然 后 我 们 还 可 以 给 出 下 标 数 组 ( 向 量 ): INTEGER DIMENSION(4)::I=(/3,7,3,9/) 运 用 这 个 下 标 向 量 可 以 构 造 数 组 片 断 : A(10:20:8, I, 14) 该 数 组 片 断 的 所 有 元 素 为 : A(10,3,14) A(18,3,14) A(10,7,14) A(18,7,14) A(10,3,14) A(18,3,14) A(10,9,14) A(18,9,14) 可 以 看 到 其 中 包 含 了 重 复 的 元 素, 即 多 对 一 数 组 片 断 数 组 元 素 序 由 于 计 算 机 在 实 质 上 只 能 按 照 一 维 的 串 行 顺 序 来 处 理 数 据, 因 此 对 于 高 于 1 维 的 数 组, 就 产 生 一 个 如 何 表 达 其 中 数 据 的 问 题, 这 就 需 要 约 定 一 个 统 一 的 把 多 维 数 组 转 化 为 一 个 便 于 计 算 机 处 理 的 数 据 序 列 的 方 法, 按 照 这 个 统 一 约 定 得 到 的 数 列 就 表 示 了 数 组 元 素 的 顺 序, 即 数 组 元 素 序 由 于 一 个 多 维 数 组 的 各 个 维 度 是 可 以 用 序 列 的 方 式 表 示 出 来 的, 因 此 一 个 自 然 的 表 达 数 组 元 素 序 的 方 法 就 是, 规 定 数 组 维 度 的 顺 序 即 各 个 维 度 被 依 次 遍 历 的 顺 序, 例 6-32 取 如 下 2 维 数 组 : A(2,3) 按 照 它 的 形 状 的 表 示 方 法, 它 的 第 1 维 有 2 个 下 标, 第 2 维 有 3 个 下 标, 那 么 这 个 数 组 的 元 素 的 排 列 顺 序 就 是 : A(1,1),A(2,1),A(1,2),A(2,2),A(1,3),A(2,3) 即 先 遍 历 第 1 维 的 2 个 下 标 而 保 持 第 2 维 的 下 标 不 变, 然 后 再 遍 历 第 2 维 的 下 标, 直 观 地 看, 就 是 依 照 数 组 元 素 顺 序 排 列 下 来 后, 第 1 维 的 下 标 的 变 化 最 快, 而 最 后 1 维 的 下 标 变 化 最 慢, 其 他 维 度 的 下 标 的 变 化 依 次 类 推 对 于 按 照 数 组 元 素 序 排 列 的 数 组 元 素 数 列, 可 以 给 以 这 个 数 列 本 身 的 下 标 标 记, 这 个 下 标 称 为 下 标 顺 序 值 按 照 上 面 约 定 的 从 多 维 数 组 到 串 行 序 列 的 转 换 规 则, 可 以 给 出 一 般 的 多 维 数 组 的 元 素 的 下 标 顺 序 值 的 计 算 公 式

85 当 然, 对 于 一 个 数 组 片 断, 它 的 元 素 的 下 标 顺 序 值 不 能 指 定 为 其 所 在 父 数 组 里 的 下 标 顺 序 值, 而 只 能 是 把 该 片 断 本 身 看 成 一 个 数 组 之 后, 重 新 给 出 的 下 标 顺 序 值 例 如 对 于 数 组 A(10), 取 其 片 断 A(2:9:3), 该 片 断 元 素 包 括 A(2),A(5),A(8), 对 于 1 维 数 组 A(10) 来 说, 这 些 元 素 的 下 标 顺 序 值 就 是 它 们 的 下 标, 即 2,5,8 而 对 于 数 组 A(2:9:3) 来 说, 它 们 的 下 标 顺 序 值 却 分 别 是 1,2, 数 组 构 造 器 所 谓 数 组 构 造 器 就 是 给 数 组 元 素 赋 值 时 的 句 法 形 式, 即 数 组 元 素 的 写 法 由 于 语 言 的 表 述 在 本 质 上 只 能 是 一 个 字 符 串, 因 此 数 组 元 素 的 取 值 的 写 法 只 能 是 针 对 1 维 数 组 而 言, 因 此 数 组 构 造 器 在 形 式 上 得 到 的 是 一 个 秩 为 1 的 数 组 的 元 素 具 体 取 值 作 为 一 个 秩 为 1 的 数 组 的 元 素, 自 然 的 形 式 就 是 一 个 元 素 组 成 的 序 列, 但 是 为 了 在 句 法 上 标 志 其 构 成 一 个 数 组, 约 定 使 用 一 对 括 号 与 斜 线 把 所 有 元 素 值 和 其 上 下 文 区 分 开, 因 此 一 个 数 组 构 造 器 的 句 法 形 式 (R432) 为 : (/ ac-value-list /) 数 组 构 造 器 元 素 取 值 列 (ac-value-list) 中 的 元 素 取 值 作 为 数 据 对 象, 可 以 是 表 达 式 (R723), 或 者 是 隐 性 do 变 量 取 值 (R434), 所 谓 隐 性 do 变 量 取 值 是 直 接 以 变 量 的 形 式 来 表 示 do 结 构 含 义 的 变 量 的 具 体 取 值 例 6-33 ( SQRT(REAL(K)),K=10,13) 这 里 REAL(K) 为 变 量 形 式,(SQRT(REAL(K)),K=10,20) 则 具 有 do 结 构 的 含 义, 经 过 K 的 具 体 取 值, 得 到 一 个 数 组 : (/ 3.162,3.317,3.464,3.606 /) 它 的 一 般 句 法 为 : (ac-value-list,ac-do-variable=scalar-integer-expression,& scalar-integer-expression [,scalar-integer-expression]) 其 中 数 组 构 造 器 值 可 能 有 三 种 形 式 : 标 量 表 达 式 例 6-34 /2.4,6.4,2.4,2.5,9.8/) 数 组 表 达 式 例 6-35 (/X(1:10,I),X(30:30,I-2)/) 隐 式 do 变 量 例 6-36 (/(SQRT(REAL(I)),I=0,10)/)

86 数 组 构 造 器 的 一 般 规 则 为 : 数 组 构 造 器 里 的 每 一 个 元 素 取 值 都 必 须 是 相 同 的 数 据 类 型, 相 同 的 种 别 参 数, 相 同 的 长 度 参 数 数 组 构 造 器 的 数 据 类 型 与 种 别 参 数 就 是 它 的 表 达 式 取 值 的 数 据 类 型 与 种 别 参 数 如 果 数 组 构 造 器 不 含 有 表 达 式 或 者 其 隐 性 do 变 量 无 法 实 际 取 值, 那 么 得 到 一 个 秩 为 0, 尺 度 为 0 的 数 组 数 组 构 造 器 do 变 量 必 须 是 标 量 整 型 命 名 变 量, 该 变 量 具 有 数 组 构 造 器 do 变 量 的 作 用 域 如 果 一 个 数 组 构 造 器 do 变 量 包 含 在 另 一 个 数 组 构 造 器 do 变 量 里 面, 它 们 不 能 是 同 一 个 变 量 第 7 章 属 性 的 声 明 最 后, 对 于 数 据 我 们 剩 下 的 工 作, 就 是 如 何 运 用 FROTRAN 语 言 来 完 整 地 加 以 描 述 FORTRAN 语 言 完 成 对 数 据 的 描 述 的 语 法 单 位 是 数 据 声 明 语 句, 在 前 面 2 章 里 面, 我 们 整 理 好 问 题 当 中 需 要 涉 及 的 数 据 及 其 结 构 之 后, 要 以 FORTRAN 语 言 写 下 来, 就 是 使 用 FORTRAN 的 声 明 语 句, 这 些 语 句 的 句 法 设 计 保 证 能 够 完 备 的 描 述 我 们 关 于 数 据 所 需 要 说 明 的 一 切 属 性 数 据 对 象 首 先 需 要 予 以 说 明 的 当 然 就 是 它 的 类 型, 因 此 我 们 首 先 给 出 对 象 的 类 型 声 明 语 句, 特 别 地, 需 要 说 明 在 最 初 FORTRAN 标 准 里 面 遗 留 下 来 的 一 种 数 据 类 型 描 述 方 法 隐 式 类 型 描 述 法, 然 后 讨 论 各 种 数 据 对 象 所 可 能 具 有 的 属 性 数 组 属 性 ; 指 针 属 性 ; 值 特 征 ; 对 象 可 访 问 性 与 使 用 属 性 ; 特 征 兼 容 性 ; 自 动 数 据 对 象 ; 存 储 关 联 由 于 本 章 集 中 讨 论 FORTRAN 的 声 明 语 句, 而 声 明 的 对 象 除 了 数 据 之 外, 其 他 的 程 序 对 象, 例 如 函 数, 过 程 等 也 需 要 声 明 其 类 型 或 属 性, 因 此 本 章 一 并 讨 论 对 其 他 程 序 对 象 的 声 明 : 过 程 属 性 ; NAMELIST 语 句 ; 7.1 属 性 及 其 声 明 方 式 所 谓 一 个 对 象 的 属 性, 就 是 程 序 使 用 该 对 象 的 方 式 本 章 所 讨 论 的 属 性 的 大 体 分 类 与 作 为 其 名 称 的 关 键 词 见 表 7-1:

87 表 7-1 属 性 的 分 类 及 其 关 键 词 数 据 类 型 INTEGER REAL( 以 及 DOUBLE PRECISION) COMPLEX LOGICAL CHARACTER TYPE( 派 生 类 型 的 名 称 由 用 户 命 名 ) 数 组 属 性 DIMENSION ALLOCATABLE 指 针 属 性 POINTER TARGET 值 设 置 DATA PARAMETER 对 象 可 访 问 性 与 调 用 PUBLIC PRIVATE INTENT OPTIONAL SAVE 过 程 属 性 EXTERNAL INTRINSIC 对 象 关 系 属 性 NAMELIST EQUIVALENCE COMMON 这 些 关 键 词 的 使 用, 或 者 说 属 性 的 声 明 有 2 种 方 式 : 在 类 型 声 明 时 附 加 属 性 说 明, 这 种 语 句 形 式 侧 重 在 给 出 数 据 对 象, 属 性 说 明 是 附 加 的 ; 使 用 单 独 的 属 性 声 明 语 句, 这 种 语 句 形 式 侧 重 在 说 明 属 性 本 身 之 所 以 会 出 现 2 种 声 明 方 式, 完 全 是 历 史 的 缘 故 FORTRAN 的 早 期 版 本 里, 任 何 的 对 象 属 性 说 明, 都 是 运 用 单 独 的 属 性 声 明 语 句, 如 果 一 个 数 据 对 象 同 时 具 有 多 种 属 性, 就 需 要 使 用 相 应 的 多 个 属 性 声 明 语 句, 从 程 序 阅 读 的 角 度 来 看, 会 显 得 很 烦 琐, 因 此 到 了 FORTRAN90 和 95 版 本, 只 要 在 程 序 单 元 当 中 需 要 声 明 一 个 数 据 对 象 的 类 型, 那 么 就 可 以 把 它 的 其 他 所 有 属 性 都 附 加 到 它 的 类 型 声 明 语 句 当 中, 使 得 程 序 显 得 更 加 紧 凑 例 7-1 我 们 要 定 义 2 个 实 型 变 量 X,Y, 同 时 还 要 声 明 它 们 都 具 有 指 针 属 性, 在 早 期 FORTRAN 语 言 里 写 为 : REAL X,Y POINTER X,Y 换 一 种 更 加 紧 凑 的 写 法 就 是 把 这 2 条 语 句 写 为 1 句 : REAL POINTER::X,Y 之 所 以 我 们 还 需 要 讨 论 单 独 的 属 性 语 句, 主 要 是 有 时 候 需 要 保 持 源 码 的 向 前 兼 容 性, 而 且 在 少 数 情 况 下, 这 2 种 形 式 也 并 完 全 等 价 因 此 在 本 章 在 讨 论 各 种 属 性 的 声 明 方 式 的 时 候, 将 首 先

88 给 出 面 向 数 据 对 象 的 声 明 方 式, 然 后 给 出 等 价 的 面 向 属 性 的 声 明 方 式 在 这 2 种 表 示 属 性 的 方 式 里, 同 样 由 于 历 史 的 缘 故, 数 组 的 维 度 属 性 DIMENSION 既 可 以 附 加 在 类 型 声 明 语 句 当 中 表 述, 也 可 以 单 独 声 明, 实 际 上 DIMENSION 这 个 关 键 词 属 于 老 式 FORTRAN 的 遗 留 物, 在 新 的 表 述 方 式 里 面, 完 全 可 以 省 略 它 例 7-2 COMPLEX X DIMENSION X(35) SAVE X COMPLEX X(35) SAVE X COMPLEX,DIMENSION(35),SAVE::X COMPLEX,SAVE::X(35) 以 上 4 种 表 述 方 式 是 完 全 等 价 的, 显 然 最 后 一 种 最 简 洁 在 一 个 程 序 单 元 里 面, 引 用 一 个 数 据 对 象 的 前 提 是 已 经 声 明 了 它 的 种 种 必 需 属 性, 数 据 对 象 的 各 种 属 性 里 面, 最 为 基 本 的 当 然 是 数 据 对 象 的 类 型, 然 后 还 需 要 声 明 其 各 种 必 需 的 属 性, 这 样 该 数 据 对 象 才 能 被 程 序 正 确 地 调 用 访 问 然 而 在 一 个 实 际 的 程 序 里 面, 数 据 对 象 的 声 明 在 表 面 上 可 能 并 不 是 完 备 的, 同 时 又 不 是 非 法 的 语 法, 出 现 这 种 情 况 的 原 因 如 下 : 在 FORTRAN 的 早 期 版 本 里, 为 了 求 简 化 的 缘 故, 使 用 了 一 种 隐 式 约 定 数 据 类 型 的 方 式, 即 通 过 数 据 对 象 的 名 称 的 第 一 个 字 母 来 分 辨 其 所 属 类 型, 这 种 类 型 声 明 方 式 被 后 来 的 FORTRAN 版 本 一 直 沿 用 下 来 了, 因 此 如 果 一 个 程 序 单 元 里 出 现 的 数 据 对 象 没 有 经 过 类 型 声 明 语 句 的 专 门 声 明, 则 需 要 考 虑 其 是 否 属 于 隐 式 声 明 相 反, 如 果 想 排 除 这 种 隐 式 声 明 的 影 响, 则 需 要 另 外 单 独 加 以 IMPLICIT NONE 语 句 作 为 声 明 任 何 其 他 的 属 性 如 果 没 有 出 现 的 话, 或 者 是 因 为 该 数 据 对 象 不 需 要 某 种 属 性, 或 者 是 该 数 据 对 象 的 某 种 属 性 采 取 了 默 认 设 置 从 上 面 的 分 类 表 7-1 可 以 看 到,FORTRAN 的 属 性 除 了 用 来 说 明 数 据 类 型 的 属 性 之 外, 其 他 属 性 都 是 针 对 不 同 的 数 据 类 型 或 程 序 对 象, 以 及 它 们 的 各 种 特 征 的 例 如 数 组 属 性 只 是 用 来 说 明 数 组, 指 针 属 性 只 是 用 来 说 明 指 针, 而 过 程 属 性 只 是 用 来 说 明 过 程, 下 面 将 分 类 讨 论 这 些 属 性 7.2 类 型 声 明 语 句 我 们 在 讨 论 第 5 章 讨 论 数 据 类 型 的 时 候 给 出 数 据 类 型 的 基 本 声 明 语 句 的 句 法 形 式, 这 里 将 侧 重 于 数 据 类 型 的 声 明 与 其 他 相 关 属 性 的 兼 容, 因 为 从 语 言 的 简 洁 与 自 然 的 角 度 出 发, 把 一 个 数 据 对 象 的 类 型 和 其 他 属 性 都 归 结 为 一 条 数 据 声 明 语 句 是 非 常 可 取 的, 所 以 我 们 得 到 如 下 的 一 般 的 类 型 声 明 句 法 形 式 (R501): type-specification [[,attribute- specification] :: ] entity-declaration-list 即 作 为 选 项, 在 一 条 数 据 对 象 的 类 型 声 明 (type-specification) 语 句 当 中, 在 数 据 项 声 明 的 列 表 (entity-declaration-list) 之 前, 给 出 相 应 的 属 性 说 明 (attribute- specification), 方 括 号 [] 表 示 可 选

89 类 型 说 明 (type-specification) 的 一 般 句 法 形 式 (R502) 是 如 下 几 种 形 式 之 一 : INTEGER [kind-selector] REAL [kind-selector] DOUBLE PRECISION COMPLEX [kind-selector] CHARACTER [character-selector] LOGICAL [kind-selector] TYPE(type-name) 其 中 种 别 选 择 符 (kind-selector) 的 句 法 形 式 (R506) 为 : ([KIND = ] kind-value) 其 中 种 别 值 (kind-value) 是 一 个 标 量 整 型 表 达 式 属 性 说 明 (attribute- specification) 的 一 般 句 法 形 式 (R503) 为 如 下 几 种 形 式 之 一 : PARAMETER ALLOCATABLE DIMENSION(array- specification) EXTERNAL INTENT(intent-specification) INTRINSIC OPTIONAL POINTER SAVE TARGET access- specification 其 中 的 可 访 问 性 说 明 (access- specification) 包 括 PUBLIC 和 PRIVATE 数 据 项 声 明 的 一 般 句 法 形 式 (R505) 为 如 下 2 种 形 式 之 一 : object-name [(array- specification)] [*character-length] [initialization] function-name [(array- specification)] [*character-length] 其 中 初 始 化 (initialization) 的 一 般 句 法 形 式 (R505) 为 如 下 2 种 形 式 之 一 : = initialization-expression =>NULL() 类 型 声 明 的 一 般 规 则 如 下 : 对 数 据 对 象 的 说 明 优 先 于 隐 式 类 型 描 述, 即 隐 式 类 型 描 述 法 永 远 只 是 在 数 据 对 象 没 有 获 得 任 何 说 明 的 情 况 下 的 默 认 法 则, 而 显 式 说 明 既 可 以 与 隐 式 法 则 一 致, 也 可 以 不 一 致 在 一 个 类 型 声 明 语 句 当 中, 同 一 个 属 性 只 能 出 现 一 次 在 一 个 作 用 域 内, 一 个 数 据 项 的 任 何 属 性 只 要 约 定 了 一 次, 就 不 可 再 次 约 定 种 别 选 择 符 所 取 的 种 别 值 只 能 是 编 译 系 统 所 许 可 的 相 应 类 型 的 种 别 参 数 之 一 字 符 长 度 (character-length) 选 项 只 能 出 现 在 CHARACTER 类 型 的 声 明 语 句 当 中

90 如 果 使 用 初 始 化 语 句, 则 必 须 在 数 据 项 声 明 前 使 用 双 冒 号 (;;) 如 果 数 据 变 量 被 初 始 化 设 置 为 数 组, 那 么 该 数 组 的 形 状 一 定 要 得 到 说 明, 或 者 是 在 类 型 声 明 语 句 当 中, 或 者 是 在 同 一 个 作 用 域 内 此 前 的 属 性 声 明 语 句 当 中 如 果 数 据 对 象 被 赋 予 PARAMETER 属 性, 那 么 其 中 必 须 包 含 初 始 化 语 句 如 果 在 初 始 化 语 句 当 中 出 现 符 号 =>, 那 么 该 被 初 始 化 的 对 象 必 定 具 有 POINTER 属 性 ; 如 果 在 初 始 化 语 句 当 中 出 现 符 号 =, 那 么 该 被 初 始 化 的 对 象 肯 定 不 具 有 POINTER 属 性 所 谓 函 数 名 称 (function-name), 或 者 是 一 个 外 部 函 数 的 名 称, 或 者 是 一 个 固 有 函 数 的 名 称, 或 者 是 一 个 函 数 哑 过 程 的 名 称, 或 者 是 一 个 语 句 函 数 的 名 称 一 个 数 组 函 数 名 称 或 者 是 被 指 定 为 显 形 数 组, 或 者 是 具 有 POINTER 属 性, 从 而 被 指 定 为 待 定 形 数 组 有 关 属 性 声 明 的 其 他 规 则 以 及 属 性 之 间 的 兼 容 性 在 后 面 会 详 悉 讨 论 例 7-3 下 面 是 一 些 附 加 了 其 他 属 性 的 数 据 类 型 声 明 语 句 : REAL, INTENT(IN) :: COS REAL, INTRINSIC :: SIN INTEGER X(25) LOGICAL,DIMENSION(10,15)::RESULT1,RESULT2 INTEGER,PARAMETER::SHORT=SELECTED_INT_KIND(4) COMPLEX :: SQUARE_ROOT = ( 2.76, -0.85) REAL, ALLOCATABLE :: X( :, : ) TYPE, POINTER :: CURRENT_OF_SAMPLE => NULL() 整 型 INTEGER 语 句 声 明 了 整 型 数 据 对 象 的 名 称, 同 时 也 可 以 附 加 种 别 参 数 以 及 其 他 属 性 如 果 给 出 种 别 选 择 符, 即 说 明 该 整 型 数 据 的 表 示 方 法 声 明 一 个 数 据 对 象 属 于 整 型 数 据 的 基 本 语 句 句 法 为 : INTEGER [ ( [ KIND = ] kind-value ) ] [ [, attribute-list] :: ] entry-list 例 7-4 以 下 这 些 声 明 语 句 主 要 是 要 说 明 数 据 项 : INTEGER X INTEGER DIMENSION(:), POINTER :: days, hours INTEGER(SHORT)RED_BALL INTEGER(2) POINTER :: k, limit INTEGER(1) DIMENSION(10) :: min 例 7-5 以 下 这 些 声 明 语 句 主 要 是 要 说 明 数 据 的 属 性 : INTEGER days, hours INTEGER(2) k, limit INTEGER(1) min DIMENSION days(:), hours(:), min (10)

91 POINTER days, hours, k, limit 实 型 REAL 语 句 声 明 了 实 型 数 据 对 象 的 名 称, 同 时 也 可 以 附 加 种 别 参 数 以 及 其 他 属 性 如 果 给 出 种 别 选 择 符, 即 说 明 该 实 型 数 据 的 表 示 方 法 双 精 度 实 型 数 据 还 可 以 使 用 DOUBLE PRECISION 语 句 加 以 声 明, 当 然 与 在 REAL 语 句 当 中 使 用 种 别 参 数 是 完 全 等 价 的 由 于 DOUBLE PRECISION 本 身 指 出 了 精 度 表 示 方 法, 因 此 不 能 再 在 后 面 附 加 种 别 选 择 符 不 过 DOUBLE 这 个 词 也 可 以 作 为 一 个 命 名 整 型 常 量, 取 双 精 度 实 型 的 种 别 参 数 值, 这 样 就 可 以 使 用 REAL(DOUBLE) 来 声 明 双 精 度 实 型 数 据 了 实 型 数 据 的 声 明 的 格 式 如 下 : REAL [ ( [KIND=] kind-value ) ] [ [, attribute-list] :: ] entry-list DOUBLE PRECISION [,attribute-list] :: ] entry-list 例 7-6 下 面 是 各 种 形 式 的 主 要 说 明 数 据 项 的 声 明 语 句 : REAL (KIND = high), OPTIONAL :: testval REAL, SAVE :: a(10), b(20,30) DOUBLE PRECISION,POINTER::A,B(:,:) DOUBLE PRECISION,DIMENSION(5,10)::TABLE1,TABLE2 REAL(DOUBLE),POINTER::A,B(:,:) REAL(DOUBLE),DIMENSION(5,10)::TABLE1,TABLE2 例 7-7 下 面 是 各 种 形 式 的 主 要 说 明 数 据 属 性 的 声 明 语 句 : REAL (KIND = high) testval REAL a(10), b(20,30) OPTIONAL testval SAVE a, b DOUBLE PRECISION TABLE1,TABLE2 DIMENSION TABLE1(5,10),TABLE2(5,10),B(:,:) POINTER A 可 以 比 较 什 么 两 种 表 示 方 法, 在 说 明 了 同 样 的 意 思 的 前 提 下, 把 属 性 说 明 附 加 在 数 据 类 型 说 明 语 句 当 中, 比 每 一 种 属 性 单 独 一 个 语 句 加 以 说 明 要 简 洁 自 然 得 多 复 型 COMPLEX 语 句 声 明 了 复 型 数 据 对 象 的 名 称, 同 时 也 可 以 附 加 种 别 参 数 以 及 其 他 属 性 如 果 给 出 种 别 选 择 符, 即 说 明 该 复 型 数 据 的 表 示 方 法 说 明 复 型 数 据 类 型 的 句 法 为 : COMPLEX [([KIND = ] kind-value ) ] [ [, attribute-list] :: ] entry-list 例 7-8 下 面 是 各 种 形 式 的 复 型 数 据 对 象 声 明 语 句 :

92 COMPLEX ch COMPLEX (KIND=4),PRIVATE :: zz, yy! 等 价 于 COMPLEX*8 zz, yy COMPLEX(8) ax, by! 等 价 于 COMPLEX*16 ax, by COMPLEX (kind(4)) y(10) complex (kind=8) x, z(10) 逻 辑 型 LOGICA 语 句 声 明 了 逻 辑 型 数 据 对 象 的 名 称, 同 时 也 可 以 附 加 种 别 参 数 以 及 其 他 属 性 如 果 给 出 种 别 选 择 符, 即 说 明 该 逻 辑 型 数 据 的 表 示 方 法 说 明 逻 辑 型 数 据 类 型 的 句 法 为 : LOGICAL [([KIND = ] kind-value ) ] [ [, attribute-list] :: ] entry-list 例 7-9 下 面 是 各 种 形 式 的 主 要 说 明 逻 辑 型 对 象 的 声 明 语 句 : LOGICAL, ALLOCATABLE :: flag1, flag2 LOGICAL (KIND = byte), SAVE :: doit, dont 例 7-10 下 面 是 各 种 形 式 的 主 要 说 明 对 象 的 属 性 的 声 明 语 句 : LOGICAL flag1, flag2 LOGICAL (KIND = byte) doit, dont ALLOCATABLE flag1, flag2 SAVE doit, don t 字 符 型 CHARACTER 语 句 声 明 了 字 符 型 数 据 对 象 的 名 称, 同 时 也 可 以 附 加 种 别 参 数 以 及 其 他 属 性 如 果 给 出 字 符 选 择 符, 即 说 明 该 字 符 型 数 据 的 最 大 字 符 长 度 说 明 字 符 型 数 据 类 型 的 句 法 为 : CHARACTER [character-selector] [, attribute-list :: ] entry-list 其 中 的 字 符 选 择 符 (character-selector) 的 句 法 形 式 (R507) 可 以 为 如 下 几 种 : length-selector (LEN =length-value, KIND = kind-value ) (length-value, [ KIND = ] kind-value ) (KIND = kind-value [,LEN =length-value] ) 其 中 长 度 选 择 符 (length-selector) 的 句 法 形 式 (R508) 可 以 是 : ([LEN =] length-value) * character-length[,] 其 中 字 符 长 度 (LEN)(R509) 可 以 是 : (length-value) scalar-integer-literal-constant 其 中 长 度 值 (length-value)(r510) 可 以 是 :

93 specification-expression * 在 上 面 的 类 型 说 明 当 中, 使 用 星 号 * 来 标 志 字 符 长 度 的 方 式 属 于 过 时 的 方 式, 不 过 不 是 指 在 数 据 项 里 面 使 用 的 星 号 * 字 符 型 数 据 对 象 类 型 声 明 语 句 的 一 般 规 则 如 下 : 只 有 在 没 有 使 用 双 冒 号 的 情 况 下, 在 长 度 选 择 符 里 才 可 以 使 用 逗 号 字 符 型 数 据 对 象 的 字 符 长 度 在 一 定 的 情 形 下, 是 可 以 发 生 动 态 变 化 的, 即 当 一 个 字 符 型 数 据 的 声 明 语 句 出 现 在 一 个 过 程 或 者 是 过 程 界 面 当 中, 同 时 该 数 据 对 象 又 不 是 某 个 派 生 数 据 对 象 的 成 员, 那 么 它 的 字 符 长 度 可 以 使 用 非 常 量 表 达 式, 该 表 达 式 的 具 体 取 值 只 有 当 访 问 该 过 程 时 才 被 确 定, 并 且 当 该 过 程 的 运 行 时, 表 达 式 里 变 量 的 变 化 并 不 影 响 字 符 长 度 值 这 样 一 种 数 据 对 象 如 果 不 属 于 哑 元, 则 属 于 自 动 数 据 对 象 的 范 畴 字 符 长 度 的 说 明 有 三 种 情 形 : 首 先 在 数 据 项 或 数 据 项 列 的 成 员 里 给 出 字 符 长 度 ; 如 果 没 有 上 面 的 长 度 说 明, 则 在 数 据 类 型 说 明 部 分 给 出 命 名 字 符 数 据 项 或 派 生 类 型 定 义 当 中 的 字 符 成 员 的 字 符 选 择 符, 用 来 给 出 长 度 属 性 ; 如 果 一 个 字 符 型 数 据 既 没 有 使 用 字 符 选 择 符, 也 没 有 使 用 字 符 长 度 来 说 明 其 长 度, 那 么 默 认 的 字 符 长 度 为 1 如 果 长 度 参 数 取 负 值, 那 么 相 应 的 字 符 项 长 度 为 0 给 定 了 字 符 长 度 的 标 量 整 型 文 字 常 量 不 能 再 附 加 任 何 种 别 参 数, 否 则 在 固 定 源 码 形 式 里 面 就 会 导 致 歧 义 采 用 带 星 号 * 的 长 度 说 明 只 能 使 用 于 以 下 几 种 情 形 : 可 以 应 用 于 过 程 的 哑 元, 当 过 程 被 调 用 时, 哑 元 就 被 赋 予 相 应 实 元 的 长 度 ; 可 以 用 于 声 明 命 名 常 量, 这 时 它 的 长 度 是 一 个 常 量 值 ; 可 以 用 于 声 明 一 个 外 部 函 数 的 结 果 变 量 的 长 度 任 何 调 用 该 函 数 的 作 用 域 单 元 如 果 使 用 带 星 号 的 长 度 说 明, 就 意 味 着 主 程 序 可 以 访 问 该 声 明 当 函 数 被 调 用 的 时 候, 结 果 变 量 的 长 度 的 取 值 由 引 用 该 函 数 的 程 序 单 元 里 面 的 相 应 声 明 语 句 决 定 本 规 则 暗 示 了 在 IMPLICIT 语 句 当 中 不 能 使 用 带 星 号 * 的 长 度 说 明 方 式 如 果 一 个 函 数 属 于 内 部 函 数 或 模 块 函 数, 或 者 该 函 数 的 值 为 数 组, 指 针 或 递 归 形 式, 那 么 该 函 数 名 不 能 使 用 带 星 号 * 的 长 度 声 明 字 符 值 语 句 函 数 或 字 符 型 语 句 函 数 哑 元 的 长 度 必 须 是 整 型 常 量 表 达 式 例 7-11 下 面 是 各 种 形 式 的 主 要 说 明 字 符 型 数 据 对 象 的 声 明 语 句 : CHARACTER (LEN=25,KIND=GREEK),DIMENSION(11)::Z1 CHARACTER (LEN=20,KIND=KANJI),SAVE::GREETING(2) CHARACTER (10)::QUESTION= WHERE? CHARACTER (LEN=*,KIND=CHINESE),PARAMETER::MESSAGE = & 简 朴 是 语 言 的 一 种 美 德 CHARACTER (*),INTENT(IN)::SCHOOL, HOME CHARACTER *3, SAVE :: COMPONENT_1, LONGER(9) *20, COMPONENT_2 CHARACTER :: RESULT = PASS 例 7-12: 下 面 是 各 种 形 式 的 主 要 说 明 字 符 型 数 据 的 属 性 的 声 明 语 句 : CHARACTER (70)PROJECT

94 CHARACTER (LEN=30, KIND=GERMAN)TRANSFORMATION CHARACTER (LEN=25,KIND=GREEK)Z1 CHARACTER (LEN=20,KIND=KANJI)GREETING(2) CHARACTER (10)QUESTION CHARACTER (*)SCHOOL, HOME CHARACTER *3 COMPONENT_1, LONGER(9) *20, COMPONENT_2 CHARACTER RESULT SAVE GREETING(2) INTENT(IN)SCHOOL, HOME DAT A QUESTION / WHERE? / CHARACTER (*)MESSAGE PARAMETER( MESSAGE = & 简 朴 是 语 言 的 一 种 美 德 ) 派 生 类 型 TYPE 语 句 声 明 了 用 户 派 生 数 据 类 型 对 象 的 名 称, 派 生 类 型 的 名 称 写 在 紧 跟 TYPE 后 面 的 一 对 括 号 当 中, 声 明 派 生 类 型 的 数 据 对 象 的 一 般 句 法 为 : TYPE(type-name)[, attribute-list :: ] entry-list 派 生 类 型 声 明 语 句 的 一 般 规 则 如 下 : 如 果 一 个 派 生 类 型 对 象 是 私 有 的 话, 就 不 能 附 加 PUBLIC 属 性 结 构 构 造 器 必 须 用 来 初 始 化 派 生 类 型 数 据 对 象, 结 构 构 造 器 里 的 表 达 式 必 须 是 初 始 化 表 达 式 如 果 需 要 声 明 的 派 生 数 据 对 象 是 一 个 函 数 的 结 果, 那 么 它 就 可 以 在 FUNCTION 语 句 当 中 予 以 说 明 例 7-13 下 面 是 各 种 形 式 的 主 要 说 明 派 生 数 据 对 象 的 声 明 语 句 : TYPE(SAMPLE),DIMENSION( :),ALLOCATABLE::STOVE TYPE(STUDENT),SAVE::GRAD(5) TYPE(HOMEWORK),SAVE::QUESTION,TAPE,WORD_SHEET 例 7-14 下 面 是 各 种 形 式 的 主 要 说 明 派 生 数 据 对 象 的 属 性 的 声 明 语 句 : TYPE(SAMPLE)STOVE TYPE(STUDENT)GRAD(5) TYPE(HOMEWORK)QUESTION,TAPE,WORD_SHEET DIMENSION STOVE( :) ALLOCATABLE STOVE SAVE GRAD(5), QUESTION,TAPE,WORD_SHEET 注 意 上 面 这 两 种 说 明 方 法 里 面 标 点 的 不 同 用 法 7.3 隐 式 类 型 描 述 法 当 初 FORTRAN 使 用 隐 式 类 型 声 明 方 法, 是 与 语 言 的 简 朴 形 态 相 适 应 的, 在 硬 件 资 源 相 对 紧

95 缺 的 时 代, 简 朴 也 能 成 为 语 言 的 一 种 美 德, 不 过 如 果 到 了 硬 件 资 源 相 对 富 余 的 今 天, 还 吝 啬 于 增 加 几 个 关 键 词 和 几 条 声 明 语 句, 就 会 显 得 很 落 伍 了, 所 以 后 来 就 增 加 了 更 为 接 近 自 然 语 言 的 声 明 语 句, 不 过, 为 了 缅 怀 FORTRAN 语 言 作 为 祖 母 级 高 级 语 言 的 荣 耀, 隐 式 类 型 声 明 方 式 还 是 保 留 下 来 了, 甚 至 默 认 为 总 是 起 作 用, 除 非 首 先 声 明 了 IMPLICIT NONE 语 句 当 然, 只 要 你 乐 意 使 用, 这 种 类 型 声 明 方 式 在 某 些 情 况 下, 还 是 非 常 方 便 简 明 的 隐 式 类 型 声 明 方 法 的 出 发 点, 是 考 虑 到 任 何 需 要 加 以 类 型 声 明 的 对 象, 如 变 量, 命 名 常 量, 函 数 等, 都 需 要 一 个 名 称 来 指 称, 那 么 就 可 以 把 它 的 类 型 这 个 信 息 负 载 在 它 的 名 称 上, 最 简 单 的 约 定, 就 是 让 名 称 的 第 一 个 字 母 来 标 记 它 的 类 型, 例 如 在 默 认 的 情 形 下 : REAL: A B C D E F G H INTEGER: I J K L M N REAL: O P Q R S T U V W X Y Z 可 以 发 现, 上 面 对 字 母 的 默 认 分 配 并 不 是 很 难 记 忆,FORTRAN 沿 用 了 数 学 里 的 很 多 习 惯, 这 里 使 用 I,J,K,L,M,N 来 表 述 整 数, 就 是 一 个 明 显 的 数 学 习 惯 除 了 上 面 默 认 的 首 字 母 隐 式 类 型 法 则, 隐 式 类 型 声 明 方 法 还 有 很 灵 活 的 一 面, 即 利 用 IMPLICIT 语 句 来 自 定 义 字 母 分 配 模 式, 一 般 的 IMPLICIT 语 句 的 句 法 形 式 (R541) 有 2 种, 分 别 行 使 不 同 的 功 能 : IMPLICIT type-specification(letter-specification-list) IMPLICIT NONE 其 中 的 字 母 分 配 说 明 列 表 的 句 法 形 式 (R543) 为 : letter[-letter] 这 里 IMPLICIT 后 面 的 字 母 分 配 表 定 义 可 以 完 全 是 自 由 定 义, 并 且 只 是 在 该 语 句 的 作 用 域 内 有 效, 而 任 何 名 称 在 它 的 作 用 域 内 只 要 是 没 有 专 门 的 类 型 声 明 语 句, 也 没 有 IMPLICIT 语 句, 那 么 它 就 遵 循 上 面 的 默 认 首 字 母 隐 式 类 型 法 则 隐 式 类 型 的 一 般 规 则 如 下 : 如 果 要 使 用 IMPLICIT NONE 语 句, 那 么 它 必 须 放 置 在 任 何 PARAMETER 语 句 之 前, 并 且 在 其 作 用 域 内, 再 也 不 能 出 现 其 他 IMPLICIT 语 句 IMPLICIT 语 句 当 中 出 现 的 表 述 字 母 范 围 的 letter-letter, 左 边 的 字 母 绝 对 不 能 是 右 边 字 母 的 按 照 字 母 表 顺 序 的 后 面 的 字 母 letter-letter 的 字 母 之 间 为 减 号, 而 非 下 划 线, 表 示 按 照 字 母 表 顺 序 从 左 边 字 母 到 右 边 字 母 的 所 有 字 母 在 一 个 作 用 域 里 面 的 IMPLICIT 语 句 里 面, 同 一 个 字 母 不 能 出 现 在 字 母 分 配 说 明 列 表 里 面 的 不 同 项 里, 例 如 作 为 单 个 字 母 出 现 了, 又 同 时 处 于 另 一 个 字 母 范 围 之 中, 或 同 时 处 于 2 个 不 同 的 字 母 范 围 里 面 IMPLICIT 语 句 同 样 可 以 用 来 为 派 生 数 据 类 型 分 配 首 字 母 作 为 类 型 标 记 默 认 的 首 字 母 隐 式 类 型 法 则 与 IMPLICIT 语 句 之 间 的 关 系 值 得 特 别 加 以 注 意 例 如 给 出 约 定 : IMPLICIT COMPLEX(E-G,W-Z) 然 后 在 该 语 句 的 作 用 域 里 再 也 没 有 其 他 IMPLICIT 语 句, 也 没 有 类 型 声 明 语 句, 那 么 在 该 作 用 域 内 具 有 不 属 于 (E-G,W-Z) 这 个 范 围 的 首 字 母 的 变 量, 将 遵 循 默 认 首 字 母 分 配 表, 即 首 字 母 在

96 范 围 (A-D,H,O-V) 内 的 变 量 属 于 实 型, 而 首 字 母 在 范 围 (I-N) 内 的 变 量 属 于 整 型 IMPLICIT NONE 可 以 用 来 检 查 名 称 的 错 误 拼 写, 因 为 如 果 不 加 以 这 个 语 句 的 话, 即 使 错 误 拼 写 的 名 称, 也 会 被 看 成 遵 循 首 字 母 隐 式 类 型 声 明 方 法 的 具 有 确 定 数 据 类 型 的 变 量, 从 而 能 够 通 过 语 法 检 查, 反 之 使 用 该 语 句, 就 可 以 避 免 这 种 误 解 例 7-15 下 面 的 IMPLICIT 语 句 都 是 合 法 语 句 : IMPLICIT CHARACTER*30(B,T),COMPLEX(W-Z) IMPLICIT LOGICAL(KIND=BIT)(Q) IMPLICIT REAL(QUAD)(X-Z) IMPLICIT TYPE(NUMBER)(A-E) IMPLICIT TYPE(ARTICAL)(A,V),CHARACTER*100(B) 例 7-16 下 面 的 IMPLICIT 语 句 都 是 非 法 语 句 : IMPLICIT CHARACTER*30(B,T),COMPLEX(Z -W)!W 应 该 放 置 在 Z 之! 前 IMPLICIT LOGICAL(KIND=BIT)(Q),REAL(QUAD)(P-T)!Q 同 时 表! 示 2 种 类 型 IMPLICIT TYPE(ARTICAL)(A-H),CHARACTER*100(B,Q)!B 同 时 表! 示 2 种 类 型 使 用 隐 式 类 型 声 明 在 一 个 嵌 套 作 用 域 里 面 所 导 致 的 变 量 作 用 域 混 乱 问 题 在 有 关 作 用 域 之 间 通 讯 时 再 讨 论 7.4 数 组 属 性 数 组 的 概 念 来 源 于 数 学 的 向 量 概 念, 最 大 的 特 点 就 是 数 组 的 各 个 分 量 必 须 是 同 一 种 数 据 类 型, 同 样 的 种 别 参 数, 具 有 同 样 的 属 性, 因 此 数 组 本 身 作 为 一 个 数 据 对 象, 最 主 要 的 属 性 就 只 剩 下 它 的 维 度, 也 就 是 它 的 秩 作 为 一 个 变 量 的 数 组 可 以 有 多 种 形 式, 除 了 它 的 分 量 可 以 发 生 变 化 之 外, 它 的 维 度 也 可 以 发 生 变 化, 有 3 种 情 形 需 要 数 组 的 维 度 不 予 固 定 : 在 程 序 运 行 当 中, 数 组 所 占 据 的 存 储 空 间 不 是 固 定 的, 而 是 可 重 新 分 配 的, 这 意 味 着 该 数 组 必 定 具 有 ALLOCATABLE 属 性 ; 该 数 组 被 赋 予 指 针 的 属 性, 使 得 它 的 维 度 无 法 预 先 固 定 下 来 ; 该 数 组 本 身 就 是 一 个 哑 元, 它 的 维 度 依 赖 于 别 的 变 量 对 它 的 赋 值 情 况 因 此 数 组 本 身 形 状 的 说 明 出 现 了 4 种 形 式, 而 数 组 所 特 有 的 属 性, 主 要 就 是 DIMENSION 和 ALLOCATABLE, 下 面 分 小 节 予 以 说 明 数 组 描 述 的 4 种 形 式 数 组 描 述 的 4 种 形 式 的 句 法 形 式 (R513) 为 : explicit-shape-specification-list deferred-shape-specification-list assumed- shape-specification-list assumed-size-specification 这 四 种 形 式 分 别 用 来 描 述 数 组 在 程 序 当 中 出 现 的 四 种 可 能 情 形 :

97 首 先 是 最 基 本 的 显 形 数 组 (explicit-shape arrays), 即 在 定 义 数 组 的 时 候 就 已 经 给 出 它 的 形 状 ; 当 一 个 数 组 具 有 指 针 属 性, 或 具 有 可 分 配 属 性 时, 它 的 形 状 就 没 法 预 先 给 定, 需 要 在 程 序 运 行 过 程 当 中 通 过 指 针 或 分 配 过 程 予 以 确 定, 这 时 就 需 要 使 用 待 定 形 数 组 (deferred-shape arrays) 的 形 式 来 加 以 描 述 ; 当 数 组 本 身 属 于 哑 元 时, 它 的 形 状 就 需 要 实 元 来 赋 予, 这 样 就 需 要 使 用 哑 形 数 组 (assumed- shape arrays) 的 形 式 来 加 以 描 述 ; 如 果 实 元 赋 予 一 个 作 为 哑 元 的 数 组 时, 只 是 决 定 它 的 尺 度, 而 没 有 给 定 其 他 形 状 要 素, 那 么 就 需 要 使 用 哑 尺 度 数 组 (assumed-size arrays) 的 形 式 来 加 以 描 述 下 面 我 们 将 分 节 说 明 这 四 种 数 组 的 描 述 方 式 数 组 的 描 述 的 一 般 规 则 如 下 : 按 照 FORTRAN 标 准, 数 组 的 秩 至 少 可 以 达 到 7, 尽 管 一 般 应 用 环 境 里, 秩 为 2 或 3 是 最 常 见 的, 但 是 对 于 一 些 特 定 的 计 算 问 题, 可 能 需 要 用 到 非 常 高 的 维 度 的 数 组, 所 以 一 般 的 FORTRA N 编 译 器 都 能 支 持 远 大 于 7 的 秩 一 个 标 量 的 秩 为 0 待 定 形 数 组 必 定 或 者 具 有 POINTER 的 属 性, 或 者 具 有 ALLOCATABLE 的 属 性 哑 形 数 组 和 哑 尺 度 数 组 必 定 属 于 哑 元 必 须 注 意 待 定 形 数 组 和 哑 形 数 组 的 表 示 形 式 可 能 出 现 雷 同 的 时 候, 即 都 是 使 用 一 个 冒 号 表 示 显 形 数 组 顾 名 思 义, 所 谓 显 形 数 组 就 是 对 于 数 组 的 每 一 个 维 度 都 给 出 了 具 体 的 上 下 界, 每 个 维 度 的 显 形 说 明 的 句 法 形 式 (R514) 如 下 : [ low-bound :] upper-bound 其 中 的 上 界 (upper-bound) 和 下 界 (low-bound) 为 说 明 表 达 式 参 见 表 达 式 显 形 数 组 的 一 般 规 则 如 下 : 显 形 数 组 的 说 明 列 表 里 所 给 出 的 上 下 界 对 的 数 目 必 须 与 该 数 组 的 维 度 数 目 一 致 如 果 下 界 被 省 略 了, 则 表 明 取 默 认 值 1 上 下 界 可 以 是 正 整 数, 也 可 以 是 负 整 数, 还 可 以 是 0 数 组 的 下 标 范 围 就 是 在 上 下 界 之 间, 包 括 上 下 界 本 身 的 所 有 整 数 集 合, 并 且 上 界 不 能 小 于 下 界, 如 果 出 现 这 种 情 况, 表 明 下 标 范 围 为 空 集, 或 者 说 其 相 应 维 度 的 宽 度 为 0, 而 且 数 组 的 尺 度 也 为 0 如 果 上 下 界 是 以 表 达 式 的 形 式 出 现, 那 么 可 能 包 含 变 量, 使 得 上 下 界 的 具 体 取 值 在 数 组 所 处 的 过 程 运 行 当 中 发 生 变 化, 这 时, 该 数 组 必 定 是 一 个 哑 元, 或 者 是 一 个 函 数 结 果, 或 者 是 一 个 动 态 数 组 例 7-17 下 面 是 主 要 说 明 数 据 项 的 声 明 语 句 : INTEGER X(20:30,5,-10:40). SUBROUTINE AAA(I,J,K) REAL,DIMENSION(10:I+2,J)::K

98 . 例 7-18 下 面 是 主 要 说 明 属 性 的 声 明 语 句 : INTEGER X(20:30,5,-10:40). SUBROUTINE AAA(I,J,K) REAL K DIMENSION K(10:I+2,J) 待 定 形 数 组 待 定 形 数 组 用 来 表 示 具 有 指 针 属 性 和 可 分 配 属 性 的 数 组 对 于 指 针 数 组 来 说, 数 组 的 每 个 维 度 的 宽 度 是 在 指 针 被 分 配 或 指 针 赋 值 语 句 被 执 行 之 后 才 给 定 的 ; 对 于 可 分 配 数 组 来 说, 它 的 上 下 界 只 是 在 被 分 配 之 后 才 给 出 因 此 对 于 这 种 数 组 的 形 状 说 明, 只 能 使 用 一 个 冒 号, 即 如 下 的 句 法 形 式 (R518): : 待 定 形 数 组 的 一 般 规 则 如 下 : 待 定 形 数 组 的 秩 等 于 它 的 说 明 列 表 当 中 出 现 的 冒 号 的 数 目 当 待 定 形 数 组 完 成 存 储 分 配 之 后, 它 的 上 下 界 在 ALLOCATE 语 句 当 中 被 确 定 对 一 个 指 针 数 组 的 目 标 数 组 的 每 个 维 度 执 行 固 有 函 数 LBOUND, 就 能 得 到 指 针 数 组 的 相 应 维 度 的 下 界 ; 同 样 的, 对 一 个 指 针 数 组 的 目 标 数 组 的 每 个 维 度 执 行 固 有 函 数 UBOUND, 就 能 得 到 指 针 数 组 的 相 应 维 度 的 上 界 因 此, 如 果 上 下 界 是 由 指 针 的 分 配 决 定, 那 么 该 数 组 的 形 状 就 可 以 由 用 户 来 指 定 ; 如 果 上 下 界 是 由 指 针 的 赋 值 决 定, 那 么 该 数 组 的 形 状 就 可 以 有 二 种 情 形 : 如 果 指 针 目 标 是 一 个 命 名 全 数 组, 那 么 上 下 界 就 由 该 数 组 的 声 明 决 定, 或 者 在 该 数 组 被 分 配 之 后 给 出 ; 如 果 指 针 目 标 是 一 个 数 组 片 断, 那 么 它 的 下 界 为 1, 而 上 界 为 所 处 维 度 的 宽 度 如 果 指 针 数 组 或 可 分 配 的 上 下 界 里 面 包 含 变 量, 那 么 当 变 量 在 随 后 有 了 重 定 义 与 去 定 义 的 情 形 的 话, 上 下 界 不 受 这 种 变 化 的 影 响 例 7-19 下 面 是 主 要 说 明 数 据 项 的 声 明 语 句 : REAL,POINTER::A( :, : ),B( :, : ) REAL,ALLOCATABLE::A( :, : ) 例 7-20 下 面 是 主 要 说 明 属 性 的 声 明 语 句 : REAL A( :, : ),B( :, : POINTER A,B ALLOCATABLE A )

99 7.4.4 哑 形 数 组 所 谓 哑 形 数 组, 就 是 一 个 哑 元, 它 的 形 状 只 有 在 与 一 个 实 元 相 结 合 时 才 能 定 下 来, 哑 形 数 组 的 说 明 句 法 (R517) 为 : [ low-bound] : 即 只 是 可 选 地 给 出 一 个 下 界, 然 后 就 是 一 个 冒 号, 下 界 阙 如, 表 示 未 定 哑 形 数 组 的 一 般 规 则 如 下 : 哑 形 数 组 的 说 明 列 表 当 中 出 现 的 冒 号 的 个 数, 就 等 于 该 数 组 的 秩 下 界 或 者 明 确 给 出, 或 者 省 略, 表 示 下 界 取 默 认 值 1 上 界 等 于 数 组 在 相 应 维 度 上 的 宽 度 加 下 界 值 减 1 哑 形 数 组 不 能 具 有 POINTER 或 ALLOCATABLE 这 二 种 属 性 未 结 合 指 针 数 组 的 尺 度, 界 和 形 状 都 是 未 定 义 的, 这 样 一 个 数 组 的 任 何 部 分 都 不 能 被 引 用 或 定 义, 不 过 这 样 的 数 组 可 以 作 为 固 有 查 询 函 数 的 变 量 出 现, 从 而 可 以 查 询 变 量 状 态, 数 据 类 型 性 质, 类 型 参 数, 或 者 结 合 状 态 例 7-21 下 面 是 主 要 说 明 数 据 项 的 声 明 语 句 : SUBROUTING AAA(X,Y,Z) REAL,DIMENSION(5:,:)::A REAL,INTENT(IN)::X( :),Y(5:) 例 7-22 下 面 是 主 要 说 明 属 性 的 声 明 语 句 : SUBROUTING AAA(X,Y,Z) REAL X( :),Y(5:),Z DIMENSION A(5:,:) INTENT(IN)X,Y 哑 尺 度 数 组 一 个 哑 尺 度 数 组 就 是 一 个 哑 元, 而 它 的 尺 度 由 与 它 相 关 联 的 实 元 设 定, 因 此 在 声 明 哑 尺 度 数 组 时, 就 给 定 了 它 的 尺 度, 即 秩, 宽 度 和 界 ( 最 后 一 个 维 度 的 上 界 和 宽 度 除 外 ) 对 于 哑 尺 度 数 组 和 实 元 之 间 的 关 联 有 如 下 规 则 : 二 者 具 有 相 同 的 初 始 数 组 元 素 后 继 数 组 元 素 是 按 照 存 储 顺 序 排 列 的 哑 元 的 声 明 就 需 要 给 出 数 组 的 秩, 所 有 维 度 的 下 界, 以 及 除 了 最 后 一 个 维 度 之 外 的 所 有 的 上 界 与 宽 度 实 元 的 尺 度 哑 元 的 尺 度 哑 尺 度 数 组 的 最 后 一 个 维 度 的 上 界 不 能 给 出, 因 此 使 用 星 号 (*) 表 示 哑 尺 度 数 组 的 句 法 形 式 (R519) 为 : [ explicit-shape-list,] [ low-bound:] * 可 见, 哑 尺 度 数 组 与 显 形 数 组 在 形 式 上 的 主 要 差 别 就 是 最 后 一 个 维 度 的 上 界 有 待 给 出

100 哑 尺 度 数 组 的 一 般 规 则 如 下 : 哑 尺 度 数 组 的 秩 就 是 它 的 显 形 数 组 的 说 明 列 表 当 中 的 说 明 数 目 加 1 哑 尺 度 数 组 的 尺 度 根 据 以 下 途 径 来 决 定 : 如 果 与 哑 元 相 关 联 的 实 元 是 非 默 认 字 符 类 型 的 任 意 其 他 类 型 数 组, 那 么 哑 元 的 尺 度 就 是 实 元 的 尺 度 如 果 与 哑 元 相 关 联 的 实 元 是 非 默 认 字 符 类 型 的 任 意 其 他 类 型 数 组 元 素, 并 且 它 的 下 标 顺 序 值 是 一 个 尺 度 为 x 的 数 组 当 中 的 v, 那 么 该 哑 元 的 尺 度 为 x-v+1 如 果 与 哑 元 相 关 联 的 实 元 属 于 默 认 字 符 类 型 数 组, 或 者 属 于 默 认 字 符 型 数 组 元, 或 者 属 于 默 认 字 符 型 数 组 元 素 子 串, 假 设 它 开 始 于 一 个 以 c 作 为 字 符 存 储 单 位 的 数 组 的 第 t 个 字 符 存 储 单 位, 那 么 哑 元 的 尺 度 为 : MAX(INT((c-t+1)/e),0) 其 中 e 是 哑 字 符 数 组 里 的 元 素 的 长 度 设 数 组 的 秩 为 r, 那 么 前 r-1 维 的 界 都 由 相 应 的 显 形 数 组 说 明 给 定, 最 后 一 个 维 度 的 下 界 则 由 声 明 中 给 出 的 下 界 给 定, 如 果 没 有 给 出, 则 取 默 认 值 1 如 果 界 的 表 达 式 里 面 包 含 变 量, 那 么 当 相 应 过 程 执 行 时, 就 会 导 致 表 达 式 取 值 发 变 化, 但 是 当 变 量 在 随 后 如 果 是 有 了 重 定 义 与 去 定 义 的 情 形 的 话, 上 下 界 则 不 受 这 种 变 化 的 影 响 函 数 结 果 不 能 成 为 哑 尺 度 数 组 除 了 以 下 两 种 情 形, 哑 尺 度 数 组 不 能 作 为 全 数 组 引 用 : 在 过 程 引 用 当 中 没 有 要 求 实 元 的 形 状 ; 引 用 到 固 有 函 数 LBOUND 例 7-23 下 面 是 主 要 说 明 数 据 项 的 声 明 语 句 : SUBROUTING PRO(A,B, C) RE AL,DIMENSION(A, *)::B REAL C(100,20,*). 例 7-24 下 面 是 主 要 说 明 属 性 的 声 明 语 句 : SUBROUTING PRO(A,B,C) RE AL B, C(100,20,* ) DIMENSION B(A, *): 数 组 的 四 种 声 明 形 式 的 兼 容 性 数 组 的 四 种 声 明 形 式 可 以 在 程 序 里 扮 演 的 脚 色 有 各 种 限 制, 也 就 是 说 具 有 不 同 的 语 法 作 用 下 面 的 表 7-2 给 出 这 四 种 形 式 与 不 同 语 法 单 位 的 兼 容 性 限 制 : 表 7-2 数 组 的 四 种 声 明 形 式 的 兼 容 性 数 组 声 明 的 形 式 数 组 的 语 法 单 位 显 形 数 组 待 定 形 数 组 哑 形 数 组 哑 尺 度 数 组

101 表 达 式 的 主 项 可 可 可 否 下 标 向 量 可 可 可 否 哑 元 可 可 可 可 实 元 可 可 可 可 等 价 对 象 可 否 否 否 公 用 对 象 可 可 否 否 名 称 列 表 对 象 可 否 否 否 保 留 对 象 可 可 否 否 初 始 化 数 据 对 象 可 否 否 否 I/O 列 表 项 可 可 可 否 格 式 可 可 可 否 内 部 文 件 可 可 可 否 分 配 对 象 否 可 否 否 指 针 赋 值 语 句 里 的 指 针 对 象 否 可 否 否 指 针 赋 值 语 句 里 的 目 标 对 象 可 可 可 否 DIMENSION 属 性 和 DIMENSION 语 句 数 组 的 维 度 除 了 可 以 在 数 组 声 明 语 句 当 中, 通 过 数 组 名 称 的 说 明 来 给 出 之 外, 还 可 以 使 用 DIM ENSION 属 性 语 句 来 给 出, 实 际 上,DIMENSION 语 句 属 于 FORTRAN 早 期 标 准 的 遗 留 物, 现 在 既 可 作 为 单 独 的 属 性 语 句 出 现, 也 可 以 附 加 在 数 据 声 明 语 句 里 面 附 加 DIMENSION 属 性 的 数 据 类 型 声 明 语 句 的 句 法 形 式 为 : type-specification,dimension(array-specification)[,attribute-list]::& entity-list 可 以 跟 在 DIMENSION 属 性 语 句 后 面 的 其 他 属 性 有 : initialization ALLOCATABLE INTENT OPTIONAL PARAMETER POINTER PRIVATE PUBLIC SAVE TARGET 另 外, 数 组 说 明 可 以 使 用 一 个 数 组 名 称, 然 后 后 面 附 加 其 他 语 句 来 声 明 一 个 数 组, 这 些 语 句 可 以 是 DIMENSION 语 句, 类 型 声 明,ALLOCA TABLE,POINTER,TARGET,COMMON 等 语 句 如 果 以 说 明 DIMENSION 属 性 为 主 给 出 数 组 定 义, 那 么 可 以 采 用 如 下 的 句 法 形 式 (R526): DIMENSION[ ::] array-name(array-specification) & [,array-name(array-specification)]

102 例 7-25 下 面 是 主 要 说 明 数 据 项 的 声 明 语 句 : REAL,ALLOCATABLE,TARGET: :X( :,:) REAL,DIMENSION(30),TARGET,SAVE::METER 例 7-26 下 面 是 主 要 说 明 属 性 的 声 明 语 句 : REAL X( :,:),METER DIMENSION METER(30) TARGET X,METER ALLOCATABLE X SAVE METER 例 7-27 下 面 是 在 其 他 声 明 语 句 当 中 使 用 数 组 说 明 的 例 子 : REAL X,METER TARGET X,METER(30) ALLOCATABLE X( :,:) SAVE METER 例 7-28 下 面 是 在 COMMON 语 句 当 中 使 用 数 组 说 明 的 例 子 : COMMON / MOTION / TIME(30),SPACE(1000, 1000,1000) ALLOCATABLE 属 性 和 ALLOCATABLE 语 句 一 个 数 组 可 分 配 是 指 它 的 界 只 有 在 执 行 ALLOCATE 语 句 之 后 才 能 确 定 这 样 一 个 数 组 必 定 是 一 个 待 定 形 数 组 ALLOCATABLE 属 性 只 是 针 对 数 组 而 言 才 成 立 一 个 具 有 ALLOCATABLE 属 性 的 数 组 的 类 型 声 明 的 句 法 形 式 为 : type-s pecification,allocatable [,attribute-list]::entity-list 能 与 ALLOCATABLE 兼 容 的 属 性 有 : DIMENSION(deferred-shape- specification-list) PRIVATE PUBLIC SAVE TARGET 单 独 的 ALLOCATABLE 属 性 语 句 的 句 法 形 式 (R527) 为 : ALLOCATABLE[::] array-name [(deferred-shape- specification-list)]& [,array-name [(deferred-shape- specification-list)]] ALLOCATABLE 属 性 声 明 的 一 般 规 则 如 下 : 具 有 ALLOCATABLE 属 性 的 数 组 就 不 能 是 哑 元 或 函 数 结 果 如 果 给 定 具 有 ALLOCATABLE 属 性 的 数 组, 再 在 任 何 位 置 给 出 具 有 DIMENSION 属 性, 都 必 须 使 用 单 独 的 冒 号 来 表 示 为 待 定 形 数 组 例 7-29 下 面 是 主 要 说 明 数 据 项 的 例 子 :

103 REAL,ALLOCATABLE,SAVE::X(:,:) INTEGER,ALLOCATABLE,DIMENSION(:)::Y 例 7-30 下 面 是 主 要 说 明 属 性 的 例 子 : REAL X(:,:) INTEGER Y DIMENSION Y(:) ALLOCATABLE X,Y SAVE X 7.5 指 针 属 性 一 般 说 来, 我 们 给 一 个 数 据 对 象 附 加 一 种 属 性, 总 是 意 味 着 给 该 数 据 对 象 增 加 某 种 它 本 来 没 有 的 性 质, 但 是 指 针 (POINTER) 属 性 则 不 然, 当 我 们 把 POINTER 属 性 附 加 给 某 个 数 据 对 象, 实 际 上 是 把 该 数 据 对 象 本 来 具 有 的 存 储 空 间 给 拿 掉 了 由 于 我 们 要 引 用 一 个 数 据 对 象, 前 提 必 然 是 已 经 确 定 了 该 数 据 对 象 的 存 储 空 间, 才 能 准 确 地 加 以 访 问, 那 么 显 然, 对 于 一 个 具 有 POINTER 属 性 的 数 据 对 象, 既 然 它 不 具 有 了 初 始 的 存 储 空 间, 也 就 无 法 加 以 引 用, 除 非 再 给 该 数 据 对 象 关 联 上 一 个 存 储 空 间 给 POINTER 对 象 关 联 到 一 个 存 储 空 间, 可 以 通 过 如 下 方 法 : 使 用 ALLOCATE 语 句 为 POINTER 对 象 创 造 一 个 新 的 存 储 空 间 ; 使 用 指 针 赋 值 语 句 使 得 POINTER 对 象 从 另 外 一 个 具 有 存 储 空 间 的 数 据 对 象 那 里 借 用 其 存 储 空 间, 那 个 被 借 用 存 储 空 间 的 数 据 对 象 称 为 指 针 的 目 标 目 标 数 据 对 象 在 程 序 运 行 时 是 可 以 发 生 变 化 的, 它 有 两 种 来 源 : 赋 予 了 TARGET 属 性 的 数 据 对 象, 或 者 它 的 某 个 部 分 ; 指 针 通 过 分 配 而 创 造 出 来 的 新 的 数 据 对 象, 或 者 它 的 某 个 部 分 指 针 可 以 被 关 联 到 另 外 一 个 指 针 的 目 标, 或 者 目 标 的 某 个 部 分 对 于 一 个 数 组 来 说, 要 使 得 它 成 为 某 个 指 针 的 目 标, 除 了 具 有 ALLOCATABLE 属 性 之 外, 还 必 须 具 有 TARGET 属 性 在 一 个 程 序 里, 最 初 建 立 一 个 指 针 对 象 之 后, 还 必 须 对 它 进 行 初 始 化, 也 就 是 定 义 它 的 初 始 状 态 ( 参 见 7.5), 然 后 才 可 以 使 用 固 有 函 数 ASSOCIATED 来 查 询 指 针 的 状 态, 否 则, 该 指 针 既 不 能 被 引 用, 也 不 能 出 现 在 DEALLOCATE 语 句 当 中 所 谓 指 针 的 经 过 定 义 了 的 状 态 有 两 种 : 关 联 与 去 关 联 通 过 ALLOCATE 与 指 针 赋 值 语 句, 可 以 使 得 指 针 具 有 关 联 状 态 ; 通 过 DEALLOCATE 或 者 NULLIFY 语 句, 或 者 让 指 针 赋 值 给 另 外 一 个 本 来 处 于 去 关 联 状 态 的 指 针, 可 以 使 得 指 针 具 有 去 关 联 状 态 一 个 指 针 无 论 是 处 于 关 联 状 态 还 是 去 关 联 状 态, 总 之 是 已 经 被 定 义 的 状 态, 因 此 可 以 使 用 固 有 函 数 ASSOCIATED 来 查 询 它 是 否 处 于 关 联 状 态 实 际 上, 对 于 指 针 我 们 还 可 以 看 成 是 一 个 描 述 符, 这 个 描 述 符 所 占 据 的 空 间 里 存 储 了 有 关 它 所 指 称 的 对 象 的 数 据 类 型, 种 别 参 数, 秩, 宽 度, 以 及 目 标 的 位 置 等 这 类 信 息 因 此 一 个 实 型 标 量 对 象 指 针 必 然 和 一 个 派 生 类 型 的 数 组 指 针 具 有 完 全 不 同 的 存 储 空 间 单 位, 那 么 给 出 一 个 指 针 必 然 无 法 预 先 给 定 它 的 存 储 单 位, 当 我 们 要 在 一 个 公 用 块 里 声 明 指 针 属 性 的 时

104 候, 就 相 当 于 给 出 存 储 的 描 述 符, 因 此 每 当 我 们 声 明 一 个 包 含 指 针 的 公 用 块 时, 都 必 定 指 定 相 同 的 存 储 单 位 序 列 POINTER 属 性 和 POINTER 语 句 附 加 了 POINTER 属 性 说 明 的 类 型 声 明 的 句 法 形 式 为 : type-specification,pointer [,attribute-list]::entity-list 可 以 与 POINTER 兼 容 的 其 他 属 性 包 括 : initialization DIMENSION(deferred-shape- specification-list) OPTIONAL PRIVATE PUBLIC SAVE 单 独 的 POINTER 语 句 也 可 以 用 来 声 明 一 个 指 针 对 象, 它 的 句 法 形 式 (R528) 为 : POINTER [::] object-name [(deferred-shape- specification-list)]& [,object-name [(deferred-shape- specification-list)]] 指 针 声 明 的 一 般 规 则 如 下 : 指 针 的 目 标 可 以 是 标 量, 也 可 以 是 数 组 指 针 数 组 必 须 被 声 明 为 待 定 形 数 组 一 个 指 针 不 能 被 引 用 或 定 义, 除 非 它 已 经 被 关 联 到 一 个 可 以 引 用 或 已 定 义 的 目 标 ( 在 指 针 赋 值 语 句 的 右 边 的 指 针 不 能 被 视 为 一 个 引 用 ) 例 7-31 下 面 是 主 要 说 明 数 据 项 的 例 子 ; TYPE(SAMPLE),POINTER::CAPACITANCE REAL,POINTER::A(:,:),B(:,:) 例 7-32 下 面 是 主 要 说 明 属 性 的 例 子 : TYPE(SAMPLE) CAPACITANCE REAL A(:,:),B(:,:) POINTER CAPACITANCE,A,B TARGET 属 性 和 TARGET 语 句 被 赋 予 TARGET 属 性 的 数 据 对 象 在 程 序 运 行 当 中, 就 可 能 成 为 某 个 指 针 的 目 标 ; 如 果 一 个 数 据 对 象 不 具 有 TARGET 属 性 或 者 没 有 经 过 分 配, 那 么 它 的 任 何 部 分 都 不 能 被 指 针 访 问 在 一 个 类 型 声 明 语 句 当 中 附 加 TARGET 属 性 说 明 的 句 法 形 式 为 : type-specification,target [,attribute-list]::entity-list 可 以 与 POINTER 兼 容 的 其 他 属 性 包 括 :

105 initialization ALLOCATABLE DIMENSION INTENT OPTIONAL PRIVATE PUBLIC SAVE 单 独 的 TARGET 语 句 也 可 以 用 来 指 定 指 针 目 标, 句 法 形 式 (R529) 为 : TARGET [::] object-name [(array-specification)]& [,object-name [(array-specification)]] 例 7-33 下 面 是 主 要 说 明 数 据 项 的 例 子 : TYPE(SAMPLE),TARGET::CAPACITANCE REAL,TARGET, DIMENSION(100,100)::A,B(100) 例 7-34 下 面 是 主 要 说 明 属 性 的 例 子 : TYPE(SAMPLE) CAPACITANCE REAL A,B(100) DIMENSION A(100,100) TARGET CAPACITANCE,A,B 7.6 值 特 征 所 谓 值 特 性 就 是 描 述 一 个 变 量, 或 者 一 个 指 针, 或 者 一 个 命 名 常 量 的 取 值 状 态 的 属 性 针 对 不 同 的 数 据 对 象, 值 特 性 的 说 明 分 为 如 下 两 种 情 形 : 对 于 变 量 与 指 针, 可 以 通 过 2 种 途 径 赋 予 初 始 化 值 特 性 : 给 一 个 变 量 赋 予 初 始 值, 或 者 使 一 个 指 针 无 效 化 ( 或 者 说 置 空 ), 都 可 以 通 过 采 用 一 个 主 要 说 明 数 据 项 的 类 型 声 明 语 句 而 获 得 这 个 类 型 声 明 语 句 包 含 如 下 的 数 据 项 声 明 形 式 : obiect-name = initialization-expression pointer-name =>NULL() 使 用 DATA 语 句 然 后 这 些 变 量 与 指 针 的 取 值, 就 可 以 在 程 序 随 后 的 运 行 当 中 发 生 变 化 这 样 一 种 在 类 型 声 明 语 句 当 中 附 加 数 据 项 初 始 化 声 明 形 式 的 值 的 初 始 化 的 方 式 称 为 显 式 初 始 化 对 于 命 名 常 量 的 取 值, 也 可 以 通 过 如 下 两 个 途 径 : 通 过 采 用 一 个 附 加 了 PARAMETER 属 性 说 明 的 主 要 说 明 数 据 项 的 声 明 语 句 来 取 值, 而 且 该 语 句 包 含 如 下 数 据 项 声 明 形 式 : obiect-name = initialization-expression 使 用 PARAMETER 语 句

106 命 名 常 量 通 过 如 此 方 式 给 定 的 取 值, 不 能 在 随 后 的 程 序 运 行 过 程 当 中 发 生 变 化, 例 如 我 们 经 常 对 一 些 数 学 常 数 使 用 固 定 的 容 易 辨 认 的 命 名, 然 后 在 程 序 运 行 的 开 始 给 定 一 个 固 定 的 取 值, 比 如 说, 取 PI=3.14, 那 么 这 个 命 名 常 量 的 取 值 在 随 后 的 程 序 运 行 过 程 当 中 保 持 不 变 命 名 常 量 也 可 以 用 来 给 一 些 固 定 的 数 值 加 以 命 名, 这 样 的 数 值 在 一 定 情 况 下 保 持 不 变, 但 也 可 能 在 某 些 情 况 下 需 要 加 以 改 变, 例 如 利 率, 这 时 就 需 要 在 不 同 的 地 方 加 以 不 同 的 取 值 定 义 下 面 我 们 分 两 节 来 分 别 讨 论 值 特 性 的 两 种 情 形 数 据 初 始 化 和 DATA 语 句 对 于 变 量 与 指 针, 可 以 通 过 数 据 初 始 化 和 DATA 语 句 这 2 种 途 径 来 进 行 值 的 初 始 化, 其 中 DAT A 语 句 作 为 一 种 属 性, 是 唯 一 不 能 附 加 到 类 型 声 明 语 句 当 中 去 的 一 种 属 性 除 了 单 独 使 用 DATA 语 句 来 给 出 变 量 与 指 针 的 值 的 初 始 化 之 外, 还 可 以 在 类 型 声 明 语 句 当 中, 使 用 特 定 的 数 据 初 始 化 形 式 来 给 出 变 量 与 指 针 的 值 的 初 始 化 上 面 这 两 种 说 明 变 量 与 指 针 的 值 的 初 始 化 的 方 法, 都 称 为 显 式 初 始 化, 相 对 而 言, 如 果 在 一 个 程 序 当 中 没 有 出 现 显 式 初 始 化, 那 么 通 过 类 型 声 明 语 句, 实 际 上 就 按 照 默 认 的 约 定 而 进 行 了 隐 式 初 始 化 ( 参 见 第 5 章 ), 那 种 隐 式 初 始 化 对 于 同 一 类 型 的 所 有 对 象 是 一 致 的 显 式 初 始 化 总 是 优 先 于 隐 式 初 始 化 对 于 变 量 来 说, 初 始 化 的 结 果 并 不 改 变 变 量 本 身 的 类 型 属 性 例 如 给 一 个 实 型 变 量 赋 予 一 个 整 型 值, 那 么 变 量 仍 然 保 持 为 实 型, 而 那 个 整 型 值 被 潜 在 地 转 换 为 相 应 的 实 型 值, 一 般 而 言, 只 要 出 现 取 值 与 变 量 的 类 型 以 及 种 别 不 一 致 的 情 形, 取 值 总 是 潜 在 地 被 转 换 为 与 变 量 一 致 的 类 型 以 及 种 别 对 于 指 针 来 说, 只 有 经 过 初 始 化, 才 能 获 得 关 联 状 态, 即 或 者 是 关 联, 或 者 是 去 关 联, 否 则, 没 有 经 过 初 始 化 的 指 针, 即 无 定 义 的 指 针 不 能 出 现 在 很 多 的 上 下 文 当 中 例 如 它 不 能 被 引 用, 不 能 出 现 在 DEALLOCATE 语 句 当 中, 也 不 能 通 过 使 用 固 有 函 数 ASSOCIATED 来 查 询 其 关 联 状 态 给 出 显 式 初 始 化 的 类 型 声 明 语 句 的 句 法 形 式 为 : type-specification [,attribute-list]::object-name [(array-specification)]& [*character-length] initialization 而 其 中 的 初 始 化 (initialization) 为 以 下 形 式 之 一 : obiect-name = initialization-expression pointer-name =>NULL() 其 中 第 一 种 形 式 用 于 指 定 非 指 针 对 象 的 初 始 值, 第 二 种 形 式 用 于 使 得 指 针 置 空 能 够 与 变 量 初 始 化 兼 容 的 其 他 属 性 有 : DIMENSION POINTER PRIVATE PUBLIC SAVE TARGET 变 量 通 过 类 型 声 明 语 句 而 获 得 的 初 始 化, 或 者 变 量 的 任 意 部 分 通 过 DATA 语 句 而 获 得 的 初 始 化, 都 意 味 着 变 量 自 动 具 有 了 SAVE 属 性, 除 非 这 个 变 量 是 处 于 一 个 命 名 公 用 块 当 中

107 这 种 自 动 获 得 的 SAVE 属 性 还 可 以 通 过 单 独 的 SAVE 语 句, 或 者 在 类 型 声 明 语 句 当 中 附 加 SAVE 属 性 说 明, 来 得 到 更 加 明 确 的 表 示 DATA 语 句 的 句 法 形 式 (R532) 为 : DATA data-object-list / data-value-list / & [[,] data-object-list / data-value-list / ] 其 中 数 据 对 象 (data-object) 有 以 下 形 式 (R534): varible data-implied-do 数 据 值 (data-value) 的 形 式 (R538) 为 : [repeat-factor * ] data-constant 其 中 重 复 因 子 (repeat-factor) 为 一 个 标 量 整 型 常 量, 数 据 常 量 (data-constant) 的 形 式 (R540) 有 以 下 几 种 : scalar-constant scalar-constant-subobject signed-integer-literal-constant signed-real -literal-constant NULL() structure-constructor boz-literal-constant 隐 式 do 数 据 (data-implied-do) 的 形 式 (R535) 为 : (data-implied-do-object-list,scalar-integer-variable = & scalar-integer-expression,scalar-integer-expression & [,scalar-integer-expression]) 隐 式 do 数 据 对 象 (data-implied-do-object) 的 形 式 (R536) 有 如 下 几 种 : array-element scalar-structure-component data-implied-do 数 据 初 始 化 的 一 般 规 则 如 下 : 如 果 需 要 进 行 初 始 化 的 数 据 对 象 为 字 符 型 或 逻 辑 型, 那 么 用 于 初 始 化 的 常 量 必 须 是 同 一 个 类 型 如 果 需 要 进 行 初 始 化 的 数 据 对 象 为 实 型 或 复 型, 那 么 用 于 初 始 化 的 常 量 必 须 是 整 型, 实 型 或 复 型 如 果 需 要 进 行 初 始 化 的 数 据 对 象 为 整 型, 那 么 用 于 初 始 化 的 常 量 必 须 是 整 型, 实 型 或 复 型 如 果 初 始 化 是 在 DATA 语 句 当 中 指 定, 那 么 相 应 的 常 量 可 以 是 二 进 制, 八 进 制, 或 十 六 进 制 的 字 面 常 量 如 果 需 要 进 行 初 始 化 的 数 据 对 象 为 派 生 类 型, 那 么 用 于 相 应 的 常 量 必 须 是 同 一 个 派 生 类 型 如 果 NULL() 出 现 在 初 始 化 说 明 里 面, 或 者 表 现 为 DATA 语 句 的 常 量, 那 么 相 应 的 被 初 始 化 的 对 象 必 须 具 有 POINTER 属 性 相 应 于 非 指 针 对 象 的 初 始 表 达 式 的 值, 或 者 是 DATA 语 句 里 的 常 量, 必 须 可 以 通 过 使 用 固 有 赋 值 语 句 而 赋 值 给 相 应 对 象, 从 而 使 得 相 应 对 象 获 得 初 始 值

108 类 型 声 明 语 句 当 中 进 行 的 初 始 化 优 先 于 类 型 定 义 当 中 默 认 的 初 始 化, 只 要 进 行 了 显 式 初 始 化, 就 可 以 认 为 不 存 在 默 认 初 始 化 具 有 默 认 初 始 化 的 派 生 类 型 的 对 象 不 能 在 DATA 语 句 当 中 进 行 初 始 化 在 一 个 可 执 行 程 序 里, 同 一 个 对 象, 或 者 是 一 个 对 象 的 同 一 个 部 分, 只 能 进 行 一 次 显 式 初 始 化 以 下 数 据 对 象 不 能 进 行 数 据 初 始 化 : 哑 元 可 被 用 户 或 主 程 序 访 问 的 对 象 函 数 结 果 动 态 对 象 可 分 配 数 组 命 名 公 用 块 当 中 的 对 象, 除 非 该 对 象 的 数 据 初 始 化 是 在 一 个 数 据 块 程 序 单 元 中 进 行 的 空 公 用 块 里 的 对 象 外 部 过 程 或 固 有 过 程 如 果 一 个 对 象 被 初 始 化, 那 么 它 的 所 有 下 标, 片 断 下 标, 子 串 始 点 和 子 串 终 点 都 必 须 是 满 足 以 下 条 件 的 表 达 式 : 表 达 式 的 所 有 算 元 都 必 须 是 常 量, 常 量 的 子 对 象, 或 隐 式 do 变 量 ; 表 达 式 的 所 有 运 算 都 必 须 是 固 有 运 算 结 构 构 造 器 的 每 一 个 用 于 初 始 化 的 成 员 都 必 须 是 初 始 化 表 达 式 出 现 在 DATA 语 句 当 中 的 经 过 显 式 的 类 型 声 明 的 变 量, 可 以 出 现 在 随 后 的 其 他 类 型 声 明 语 句 当 中 的 唯 一 前 提 就 是 : 随 后 的 声 明 不 与 它 的 显 式 声 明 冲 突 出 现 在 DATA 语 句 当 中 的 数 组 名, 数 组 片 断, 数 组 元 素 都 同 样 地 具 有 此 前 该 数 组 被 定 义 时 所 具 有 的 性 质 如 果 一 个 数 组 元 素 或 结 构 成 员 为 隐 式 do 数 据 对 象, 那 么 就 不 能 拥 有 父 常 量 DATA 语 句 的 重 复 因 子 必 须 是 正 数 或 0; 如 果 是 一 个 命 名 常 量, 那 么 当 DATA 语 句 进 行 计 数 时, 它 的 值 必 须 在 同 一 个 作 用 域 单 位 里 的 处 于 DATA 语 句 之 前 的 其 他 语 句 里 被 指 定 隐 式 do 结 构 里 的 标 量 整 型 表 达 式 的 运 算 元 只 能 是 常 量, 常 量 的 子 对 象, 或 隐 式 do 变 量 ; 表 达 式 的 所 有 运 算 都 必 须 是 固 有 运 算 数 据 对 象 列 表 可 以 扩 张 为 一 个 标 量 变 量 序 列 而 一 个 数 组 或 数 组 片 断 等 价 于 它 的 元 素 按 照 数 组 元 素 序 排 列 得 到 的 序 列 一 个 隐 式 do 数 据 在 隐 式 do 变 量 的 控 制 下, 可 以 扩 张 为 一 个 由 数 组 元 素 组 成 的 序 列 一 个 尺 度 为 0 的 数 组, 或 一 个 重 复 计 数 为 0 的 隐 式 do 变 量 对 于 扩 张 出 来 的 序 列 没 有 任 何 影 响, 但 是 一 个 具 有 0 长 度 的 字 符 变 量 却 能 够 对 序 列 产 生 影 响 数 据 值 列 表 可 以 扩 张 为 一 个 属 于 固 有 类 型 的 标 量 常 量 值 序 列 当 DATA 语 句 被 计 数 时, 每 一 个 得 到 的 数 据 值 都 必 须 是 编 译 器 认 可 的 数 据 常 量 DATA 语 句 的 重 复 因 子 实 际 上 表 示 了 进 入 序 列 的 后 续 的 数 据 常 量 的 数 目 如 果 重 复 因 子 为 0, 则 后 续 的 数 据 常 量 就 不 进 入 序 列 了 标 量 变 量 和 扩 张 序 列 当 中 的 数 据 常 量 必 须 是 一 一 对 应 的, 扩 张 序 列 当 中 的 每 一 个 数 据 常 量 都 表 示 相 应 变 量 的 初 始 值 或 初 始 状 态 两 个 扩 张 序 列 的 长 度 一 定 是 相 同 的 例 7-35 下 面 是 主 要 说 明 数 据 项 的 例 子 : CHARACTER(LEN= 20)::SYMBOL = AIPHA INTEGER,DIMENSION(1:10)::COUNT = (/(1,I=2,11)/) TYPE(LINK),POINTER::START=>NULL() TYPE(SAMPLE)::SAMPLE1 = SAMPLE(33, BETA )& SAMPLE2= SAMPLE(45, BETA ) REAL::OVERFLOW(100,100)=RESHAPE((/((1.0,J=1,K-1),&

109 (0.0,J=K,100),K=1,100)/),(/100,100/)) 例 7-36 下 面 是 主 要 说 明 属 性 的 例 子 : CHARACTER(LEN= 20)SYMBOL INTEGER COUNT DIMENSION OUNT(1:10) TYPE(LINK)START POINTER START DATA START /NULL()/ DATA SYMBOL /AIPHA /,COUNT /10*0/ TYPE(SAMPLE)SAMPLE1,SAMPLE2 DATA SAMPLE1 / SAMPLE(33, BETA )/ DATA SAMPLE2 / SAMPLE(45, BETA )/ REAL OVERFLOW(100,100) DATA ((OVERFLOW(J,K),J=1,K-1),K=1,100)/4950*1.0/ DATA ((OVERFLOW(J,K),J=K,100),K=1,100)/5050*0.0/ 在 上 面 的 例 子 里, 字 符 变 量 SYMBOL 的 初 始 化 值 为 AIPHA 整 数 数 组 COUNT 的 10 个 元 素 都 始 化 为 0, 在 主 要 说 明 数 据 项 的 例 子 里 使 用 了 数 组 构 造 器, 而 在 主 要 说 明 属 性 的 例 子 里 使 用 了 重 复 因 子 指 针 START 开 始 被 置 空 SAMPLE1 和 SAMPLE2 是 属 于 派 生 类 型 SAMPLE 的 数 据 对 象, 其 中 SAMPLE1 的 初 始 化 使 用 了 结 构 构 造 器, 而 SAMPLE2 的 初 始 化 是 通 过 给 定 它 的 每 个 成 员 的 值 而 得 到 的 在 主 要 说 明 数 据 项 的 例 子 里 还 使 用 了 固 有 函 数 RESHAPE, 因 为 数 组 OVERFLOW 的 秩 为 2, 而 在 主 要 说 明 属 性 的 例 子 里 则 是 使 用 了 重 复 因 子 PARAMETER 属 性 和 PARAMETER 语 句 在 类 型 声 明 语 句 附 加 PARAMETER 属 性 说 明 或 者 单 独 使 用 PARAMETER 语 句, 可 以 给 常 量 赋 予 一 个 名 称 在 类 型 声 明 语 句 当 中 附 加 PARAMETER 属 性 说 明 的 句 法 形 式 为 ; ty pe-specification,parameter [,attribute-list]::name= initialization-expression 在 一 个 类 型 声 明 语 句 当 中 可 以 对 多 个 常 量 命 名 与 PARAMETER 属 性 兼 容 的 其 他 属 性 有 : initialization( 一 定 要 有 ) DIMENSION PRIVATE PUBLIC SAVE 根 据 固 有 赋 值 规 则, 由 初 始 化 表 达 式 给 出 常 量 的 名 称 而 出 现 在 初 始 化 表 达 式 当 中 的 命 名 常 量 只 能 属 于 以 下 情 形 : 在 本 类 型 声 明 语 句 的 前 面 已 经 被 定 义, 或 者 在 前 面 的 类 型 声 明 语 句 当 中 已 经 被 定 义

110 编 译 器 已 知 的 命 名 常 量 单 独 的 PARAMET ER 语 句 也 可 以 用 来 给 出 命 名 常 量, 其 句 法 形 式 (R530) 为 : PARAMETER (name-constant= initialization-expression & [,name-constant= initialization-expression ] ) PARAMETER 语 句 的 一 般 规 则 如 下 : 哑 元, 函 数, 或 公 用 块 里 的 对 象 不 能 具 有 PARAMETER 属 性 出 现 在 PARAMETER 语 句 当 中 的 经 过 显 式 的 类 型 声 明 的 命 名 常 量, 可 以 出 现 在 随 后 的 其 他 类 型 声 明 语 句 当 中 的 唯 一 前 提 就 是 : 随 后 的 声 明 不 与 它 的 显 式 声 明 冲 突 出 现 在 PARAMETER 语 句 当 中 的 数 组 常 量 具 有 该 数 组 此 前 被 定 义 时 所 具 有 的 一 切 性 质 为 避 免 出 现 歧 义, 命 名 常 量 不 能 出 现 在 格 式 说 明 当 中 例 7-37 下 面 是 主 要 说 明 数 据 项 的 例 子 : INTEGER,PARAMETER::LOCAL=100 INTEGER,PARAMETER::A=COUNT(20,10),& TEST=100+LOCAL 例 7-38 下 面 是 主 要 说 明 属 性 的 例 子 : INTEGER LOCAL,A, TEST PARAMETER (LOCAL=100) PARAMETER(A= COUNT(20,10),& TEST=100+LOCAL) 7.7 对 象 可 访 问 性 以 及 使 用 属 性 有 一 类 属 性 是 专 门 用 来 描 述 数 据 对 象 是 否 具 有 访 问 限 制, 以 及 如 何 使 用 相 应 的 数 据 对 象 的, 当 然 也 不 是 所 有 的 数 据 对 象 都 可 以 具 有 这 样 的 属 性, 只 有 三 类 数 据 对 象 可 以 进 行 访 问 控 制 : 模 块 中 的 对 象 ; 哑 元 ; 子 程 序 里 声 明 的 变 量 相 关 的 属 性 包 括 : PUBLIC 和 PRIVATE 属 性 用 来 控 制 模 块 当 中 的 数 据 对 象 的 可 访 问 性 ; INTENT 用 于 控 制 子 程 序 当 中 的 哑 元 的 使 用 ; OPTIONAL 用 于 控 制 子 程 序 当 中 变 量 在 进 行 子 程 序 引 用 时 的 使 用 ; SAVE 用 于 控 制 子 程 序 里 变 量 的 值 在 进 行 子 程 序 引 用 时 的 使 用 PUBLIC 属 性 和 PRIVATE 属 性 在 类 型 声 明 语 句 里 附 加 的 PUBLIC 属 性 和 PRIVATE 属 性 控 制 了 对 模 块 里 的 类 型 定 义, 变 量, 函 数, 以 及 命 名 常 量 的 访 问 PUBLIC 属 性 表 明 了 模 块 里 的 数 据 对 象 可 以 通 过 关 联 被 模 块 外 部 访 问 PRIVATE 属 性 则 刚 好 相 反, 防 止 了 模 块 外 部 通 过 关 联 来 访 问 模 块 里 的 数 据 对 象

111 在 类 型 声 明 里 附 加 PUBLIC 属 性 和 PRIVATE 属 性 说 明 的 句 法 形 式 为 ; type-specification,public [,attribute-list]::entity-list type-specification,private [, attribute-list]::entity-list PUBLIC 属 性 和 PRIVATE 属 性 说 明 也 可 以 用 于 派 生 数 据 类 型 的 声 明 当 中 : TYPE,PUBLIC::type-name TYPE,PRIVATE:: type-name 如 果 在 类 型 声 明 当 中 使 用 了 PRIVATE 属 性, 但 是 却 没 有 包 含 访 问 id 列 表, 那 么 就 说 明 尽 管 从 模 块 外 部 可 以 访 问 该 类 型 的 数 据, 但 是 却 不 能 访 问 数 据 的 成 员 可 以 与 POINTER 兼 容 的 其 他 属 性 包 括 : initialization ALLOCATABLE DIMENSION EXTERNAL INTRINSIC PARAMETER POINTER TARGET SAVE 单 独 的 PUBLIC 语 句 和 PRIVATE 语 句 也 可 以 用 来 控 制 对 数 据 对 象 的 访 问 除 了 可 以 作 用 于 类 型 定 义, 变 量, 函 数, 和 命 名 常 量 之 外, 它 们 还 可 以 用 来 控 制 一 些 不 能 通 过 类 型 说 明 来 定 义 的 对 象, 例 如 子 例 行 程 序, 通 用 描 述 符, 以 及 名 称 列 表 集 合 PUBLIC 语 句 和 PRIVATE 语 句 的 句 法 形 式 (R522) 为 : PUBLIC [ [ ::] access-id-list ] PRIVATE [ [ ::] access-id -list ] 其 中 访 问 id(access-id) 的 形 式 (R523) 为 以 下 几 种 : use-name generic-specification 其 中 类 说 明 (generic-specification) 的 形 式 (R1207) 为 以 下 几 种 : generic-name OPERATOR( 已 定 义 算 符 ) ASSIGNMENT(=) 类 说 明 的 具 体 讨 论 参 见 第 13 章 的 过 程 界 面 例 7-39 下 面 是 使 用 类 说 明 的 PUBLIC 和 PRIVATE 语 句 的 例 子 : PUBLIC HYPERBOLIC_COS, HYPERBOLIC_SIN! 类 名 称 PRIVATE HY_COS_RAT, HY_SIN_RAT! 种 名 称 PRIVATE HY_COS_INF_PREC! 种 名 称 PUBLIC :: OPERATOR(.THAT.), OPERATOR(+), ASSIGNMENT(=)

112 PUB LIC 和 PRIVATE 语 句 的 一 般 规 则 如 下 : PUBLIC 和 PRIVATE 只 能 用 于 模 块 有 效 名 称 (use-name) 可 以 是 变 量, 过 程, 派 生 数 据 类 型, 命 名 常 量, 以 及 名 称 列 表 集 合 这 些 对 象 的 名 称 在 一 个 模 块 的 作 用 域 单 位 里 只 能 存 在 一 个 省 略 了 访 问 id 的 PUBLIC 语 句 或 PRIVATE 语 句, 该 语 句 决 定 了 对 于 模 块 的 默 认 可 访 问 性 在 派 生 数 据 类 型 的 声 明 里 面 可 以 使 用 PRIVATE 语 句, 来 表 明 该 种 类 型 的 结 构 成 员 不 能 被 模 块 外 部 访 问 这 种 情 况 不 能 使 用 相 反 的 PUBLIC 语 句 具 有 公 共 的 通 用 标 识 符 的 过 程, 可 以 通 过 通 用 标 识 符 而 被 访 问, 尽 管 它 的 特 指 名 称 是 不 可 访 问 的 一 个 模 块 过 程 如 果 包 含 私 有 类 型 的 变 量, 或 私 有 类 型 的 函 数 结 果, 则 过 程 本 身 也 就 是 私 有 的, 就 不 能 具 有 公 共 的 通 用 标 识 符 模 块 中 定 义 的 对 象 在 默 认 情 形 下, 都 是 具 有 PUBLIC 属 性 的 可 以 在 模 块 里 给 出 一 个 缺 乏 访 问 id 列 表 的 PUBLIC 属 性 说 明 来 明 确 表 明 模 块 内 部 对 象 的 默 认 可 访 问 性 质 在 模 块 里 使 用 不 含 访 问 id 列 表 的 PRIVATE 属 性 说 明 可 以 改 变 这 种 默 认 PUBLIC 属 性 例 7-40 下 面 是 主 要 说 明 数 据 项 的 例 子 : REAL,PUBLIC::GLOBAL_1 TYPE, PRIVATE :: LOCAL_DATA LOGICAL :: ANSWER REAL,DIMENSION(20) :: DENSITY END TYPE LOCAL_DATA 例 7-41 下 面 是 主 要 说 明 属 性 的 例 子 : REAL GLOBAL_1 PUBLIC GLOBAL_1 TYPE, LOCAL_DATA LOGICAL ANSWER REAL DENSITY (20) END TYPE LOCAL_DATA PRIVATE LOCAL_DATA 例 7-42 下 面 是 一 个 具 有 私 有 成 员 的 公 有 类 型 的 例 子 : TYPR LIST_ELEMENT PRIVATE REAL VALUE TYPE (LIST_ELEMENT), POINTER:: NEXT, FORMER END TYPR LIST_ELEMENT 例 7-43 下 面 是 一 个 改 变 默 认 访 问 性 质 的 例 子 : MODULE M PRIVATE REAL A, B, TEMP(20) REAL, PUBLIC :: X(20), Y(20)

113 END MODULE M INTENT 属 性 和 INTENT 语 句 针 对 哑 元 的 INTENT 属 性 更 多 的 是 为 了 方 便 程 序 作 者 或 用 户, 通 过 给 哑 元 附 加 INTENT 属 性, 就 可 以 有 意 地 使 用 哑 元, 从 而 便 于 检 查 错 误, 可 以 为 程 序 读 者 提 供 有 用 的 信 息, 为 调 试 修 改 源 码 提 供 方 便, 从 而 可 以 改 善 源 码 的 效 率 哑 元 的 运 用 分 三 种 情 形 : 被 引 用 但 在 子 程 序 里 还 没 有 被 重 定 义 ; 在 子 程 序 里 被 引 用 之 前 已 经 定 义 ; 在 重 定 义 之 前 被 引 用 相 应 的,INTENT 也 有 三 种 形 式, 分 别 用 于 上 面 的 哑 元 运 用 的 三 种 情 形 : IN; OUT; INOUT 如 果 变 量 的 意 向 属 性 是 IN, 那 么 子 程 序 不 能 改 变 变 量 的 值, 也 不 能 成 为 无 定 义 变 量 如 果 变 量 的 意 向 属 性 是 OUT, 那 么 子 程 序 在 变 量 被 定 义 之 前 都 不 能 使 用 该 变 量, 并 且 该 变 量 必 须 是 可 定 义 的 如 果 变 量 的 意 向 属 性 是 INOUT, 那 么 变 量 就 可 以 用 于 和 子 程 序 通 讯, 并 且 返 回 信 息 在 进 入 子 程 序 时, 它 必 须 是 已 经 定 义 好 了 的, 而 且 必 须 的 可 定 义 的 如 果 不 使 用 INTENT 属 性, 那 么 哑 元 的 使 用 由 相 关 联 的 实 元 决 定, 实 元 所 受 到 的 限 制 同 样 是 哑 元 的 限 制 例 如 如 果 实 元 是 一 个 常 量, 那 么 相 应 的 哑 元 就 只 能 被 引 用, 而 不 能 被 定 义 附 加 INTENT 的 类 型 声 明 语 句 的 形 式 为 : type-specification,intent(intent- specification) [,attribute-list]::& dummy-argument-name-list 其 中 的 INTENT 的 属 性 是 IN,OUOT,INOUT 之 一 与 INTENT 兼 容 的 其 他 属 性 有 : DIMENSION OPTIONAL TARGET 单 独 的 INTENT 语 句 也 可 以 给 出 INTENT 属 性, 其 句 法 形 式 (R520) 为 : INTENT(intent- specification) [ ::] dummy-argument-name-list 其 中 的 INTENT 的 属 性 是 IN,OUOT,INOUT 之 一 INT ENT 语 句 的 一 般 规 则 如 下 : INTENT 属 性 只 能 用 于 哑 元 INTENT 语 句 只 能 在 子 程 序 的 说 明 部 分 或 界 面 体 出 现 INTENT 属 性 不 能 应 用 于 作 为 哑 过 程 的 哑 元, 因 为 哑 过 程 的 定 义 是 无 法 改 变 的, 而 且

114 INTENT 属 性 也 不 能 应 用 于 哑 指 针, 因 为 无 法 明 确 INTENT 属 性 是 应 用 于 指 针 还 是 应 用 于 指 针 的 目 标 如 果 哑 元 属 于 给 出 了 默 认 初 始 化 是 数 据 类 型, 则 只 有 当 该 哑 元 具 有 INTENT(OUT) 属 性 的 时 候, 才 获 得 初 始 化 定 义 例 7-44 下 面 是 主 要 说 明 数 据 项 的 例 子 : SUBROUTING MOVE(FROM,TO) USE PERSON_MODULE TYPE(PERSON), INTENT(IN) :: FROM TYPR(PERSON), INTENT(OUT) :: TO SUBROUTING SUB (X, Y) INTEGER, INTENT(INOUT) :: X, Y 例 7-45 下 面 是 主 要 说 明 属 性 的 例 子 : SUBROUTING MOVE(FROM,TO) USE PERSON_MODULE TYPE(PERSON) FROM, TO INTENT(IN) FROM INTENT(OUT) TO SUBROUTING SUB (X, Y) INTEGER X, Y INTENT(INOUT) X, Y OPTIONAL 属 性 和 OPTIONAL 语 句 使 用 OPTIONAL 属 性, 可 以 使 得 具 有 该 属 性 的 哑 元 在 包 含 该 哑 元 的 过 程 被 引 用 的 时 候 被 省 略 掉, 而 直 接 采 用 默 认 值 来 代 替 那 些 被 省 略 的 哑 元, 这 样 就 可 以 节 省 那 些 在 被 引 用 后 并 不 需 要 使 用 变 量 形 式 的 哑 元 这 就 意 味 在 该 过 程 在 某 个 特 定 的 引 用 里, 减 少 了 变 量 的 数 目, 这 样 就 能 够 有 效 地 改 善 程 序 的 执 行 效 率 之 所 以 引 入 这 样 一 种 属 性, 是 根 据 科 学 计 算 的 实 际 需 要 因 为 经 常 会 出 现 这 样 一 种 情 况 : 对 于 一 个 专 用 的 过 程, 为 了 能 够 对 付 尽 可 能 多 的 调 用 需 求, 往 往 要 设 置 足 够 多 的 哑 元, 但 是 在 该 过 程 得 到 某 个 具 体 调 用 时, 往 往 发 现 在 一 个 具 体 的 问 题 当 中, 其 中 很 多 哑 元 并 没 有 起 到 变 量 的 作 用, 而 是 一 直 取 常 量, 因 此 可 以 在 引 用 该 过 程 时, 一 开 始 就 省 略 不 起 作 用 的 哑 元, 直 接 采 用 默 认 常 量 替 代 它, 这 样 能 够 很 大 的 节 省 程 序 运 行 的 资 源 消 耗 因 此 在 调 用 某 个 过 程 之 前, 我 们 可 以 根 据 实 际 情 况, 给 其 中 的 某 些 哑 元 附 加 OPTIONAL 属 性, 使 得 该 过 程 进 入 调 用 后, 自 动 省 略 这 些 哑 元, 而 直 接 采 用 默 认 值 附 加 OPTIONAL 属 性 说 明 的 类 型 声 明 语 句 的 形 式 为 : type-specification,optional [,attribute-list]::dummy-argument-list 与 O PTIONAL 属 性 兼 容 的 其 他 属 性 有 :

115 DIMENSION EXTERNAL INTENT POINTER TARGET 单 独 的 OPTIONAL 语 句 也 可 以 给 出 OPTIONAL 属 性, 其 句 法 形 式 (R521) 为 : OPTIONAL [ ::] dummy-argument-name-list OPTIONAL 语 句 的 一 般 规 则 如 下 : OPTIONAL 属 性 只 能 用 于 哑 元 OPTIONAL 语 句 只 能 在 子 程 序 的 作 用 域 单 位 或 界 面 体 出 现 例 7-46 下 面 是 主 要 说 明 数 据 项 的 一 个 程 序 片 断 例 子 : CALL SORT_X (X= VECTOR_A) SUBROUTING SORT_X (X,SIZEX, FAST) REAL, INTENT(INOUT) :: X(:) INTEGER, INTENT(IN),OPTIONAL :: SIZEX LOGICAL, INTENT(IN), OPTIONAL :: FAST INTEGER TSIZE IF (PRESENT (SIZEX)) THEN TSIZE= SIZEX ELSE TSIZE= SIZE(X) END IF IF (.NOT. PRESENT (FAST).AND. TSIZE > 100) THEN CALL QUICK_SORT(X) ELSE CALL BUBBLE_SORT(X) END IF 例 7-47 下 面 是 主 要 说 明 属 性 的 例 子 : SUBROUTING SORT_X (X,SIZEX, FAST) REAL X ( : ) INTENT (INOUT) X INTEGER SIZEX LOGICAL FAST INTENT (IN) SIZEX, FAST OPTIONAL SIZEX, FAST INTEGER TSIZE

116 7.7.3 SAVE 属 性 和 SAVE 语 句 当 子 程 序 完 成 运 行 之 后, 其 中 定 义 的 具 有 SAVE 属 性 的 变 量 能 够 保 持 它 的 值, 它 的 定 义, 它 的 关 联 与 分 配 状 态 而 不 具 有 SAVE 属 性 的 变 量 则 不 能 保 证 能 够 保 持 它 们 的 值, 定 义 和 关 联 分 配 状 态, 尽 管 在 一 些 FORTRAN 的 实 现 里, 所 有 的 局 部 变 量 和 公 用 块 被 认 为 是 具 有 SAVE 属 性 保 险 而 言, 如 果 一 定 要 求 对 象 或 对 象 的 公 用 块 能 够 保 持 它 的 值, 定 义 以 及 状 态, 那 么 就 一 定 要 事 先 赋 予 其 SAVE 属 性 在 模 块 里 声 明 的 对 象 也 可 以 赋 予 SAVE 属 性, 这 样 它 将 在 使 用 该 模 块 的 过 程 完 成 运 行 之 后, 还 能 保 持 其 值, 定 义 以 及 状 态 递 归 子 程 序 里 的 对 象 也 可 以 赋 予 SAVE 属 性, 该 对 象 能 够 被 子 程 序 的 所 有 分 支 共 享 任 何 获 得 数 据 初 始 化 的 对 象 都 默 认 为 具 有 SAVE 属 性, 但 是 一 个 派 生 数 据 类 型 的 结 构, 即 使 它 的 所 有 成 员 都 具 有 默 认 的 初 始 化, 它 本 身 并 不 认 为 具 有 SAVE 属 性 附 加 SAVE 属 性 说 明 的 类 型 声 明 语 句 的 形 式 为 : type-specification,save [,attribute-list]::entity-list 与 SAVE 属 性 兼 容 的 其 他 属 性 有 : initialization ALLOCATABLE DIMENSION POINTER TARGET PUBLIC PRIVATE 由 于 具 有 PARAMETER 属 性 的 对 象 为 命 名 常 量, 因 此 对 于 它 也 就 无 所 谓 保 持 值 定 义 以 及 状 态 的 不 变, 没 必 要 再 去 赋 予 它 SAVE 属 性, 实 际 上 也 不 允 许 对 具 有 PARAMETER 属 性 的 对 象 赋 予 SAVE 属 性 单 独 的 SAVE 语 句 也 可 以 给 出 SAVE 属 性, 其 句 法 形 式 (R524) 为 : SAVE [[ ::] saved- entity-list] 其 中 保 留 项 (saved- entity) 的 形 式 (R525) 为 下 面 二 种 : data-object-name / common-block-name / SAV E 属 性 的 一 般 规 则 如 下 : 一 个 不 包 含 保 留 项 列 表 的 SAVE 语 句 意 味 着 在 作 用 域 内 的 所 有 项 都 具 有 保 留 性 质, 而 在 这 个 作 用 域 内 再 也 不 能 出 现 SAVE 语 句 如 果 SAVE 作 为 属 性 或 语 句 出 现 在 主 程 序, 那 它 是 无 效 的 以 下 数 据 对 象 不 能 被 保 留 : 函 数 结 果 哑 元 动 态 数 据 对 象 公 用 块 里 的 对 象

117 公 用 块 里 的 变 量 不 能 单 独 地 赋 予 SAVE 属 性, 如 果 整 个 公 用 块 被 赋 予 SAVE 属 性, 那 么 它 的 所 有 变 量 都 具 有 了 SAVE 属 性 如 果 一 个 公 用 块 在 一 个 程 序 的 某 个 作 用 域 里 被 赋 予 了 SAVE 属 性, 那 么 它 在 自 己 被 定 义 的 程 序 的 所 有 作 用 域 里, 都 具 有 SAVE 属 性 ( 除 了 主 程 序 ) 如 果 一 个 命 名 公 用 块 是 在 主 程 序 里 给 出 的, 那 么 程 序 的 任 何 作 用 域 都 可 以 访 问 它, 这 样 它 就 不 需 要 被 赋 予 SAVE 属 性 了 例 7-48 下 面 的 声 明 语 句 主 要 说 明 数 据 项 : REAL,DIMENSION(10),SAVE::A 例 7-49 下 面 的 声 明 语 句 主 要 说 明 属 性 : REAL A DIMENSION A(10) SAVE A 例 7-50 下 面 的 声 明 语 句 说 明 保 留 对 象 及 公 用 块 : SAVE X,Y,/BLOCKA/,Z,/BLOCKB/ 7.8 过 程 属 性 我 们 上 面 讨 论 的 一 些 属 性 已 经 不 限 于 描 述 数 据 对 象, 也 可 以 用 来 描 述 模 块, 过 程 等 程 序 单 位, 例 如 PUBLIC,PRIVATE, SAVE 等 本 节 我 们 讨 论 两 个 只 针 对 函 数 与 程 序 单 位 的 属 性 : EXTERNAL 和 INTRINSIC 如 果 一 个 哑 过 程 或 一 个 外 部 过 程 是 一 个 子 程 序 的 实 元, 那 么 该 过 程 名 称 就 必 须 声 明 为 具 有 EXTERNAL 属 性 ; 如 果 一 个 外 部 过 程 与 某 个 固 有 过 程 拥 有 相 同 的 名 称, 那 么 就 需 要 对 该 名 称 赋 予 EXTERNAL 属 性, 同 时 具 有 这 个 名 称 的 固 有 过 程 就 不 能 被 该 程 序 单 位 访 问 了 如 果 一 个 固 有 过 程 是 一 个 实 元, 那 么 它 的 名 称 就 必 须 声 明 为 INTRINSIC 由 于 只 有 函 数 具 有 类 型 的 定 义, 而 子 例 行 程 序 不 具 有 类 型 的 定 义, 因 此 作 为 类 型 声 明 的 附 加 属 性 的 EXTERNAL 和 INTRINSIC 只 能 用 于 函 数, 而 对 于 子 例 行 程 序, 则 需 要 使 用 语 句 形 式 的 EXTERNAL 和 INTRINSIC 下 面 我 们 分 别 讨 论 这 两 个 属 性 与 相 应 语 句 EXTERNAL 属 性 和 EXTERNAL 语 句 EXTERNAL 属 性 用 于 描 述 一 个 名 称 是 一 个 外 部 函 数, 或 一 个 哑 函 数 的 名 称, 并 且 该 名 称 可 以 用 于 作 为 实 元 附 加 EXTERNAL 属 性 说 明 的 类 型 声 明 语 句 的 形 式 为 : type-specification,external [,attribute-list]::function-name-list 与 EXTERNAL 属 性 兼 容 的 其 他 属 性 有 : OPTIONAL

118 PUBLIC PRIVATE 如 果 一 个 函 数 返 回 一 个 数 组 或 指 针, 那 么 该 函 数 的 界 面 必 定 是 显 形 的, 所 谓 界 面 块 就 是 用 来 描 述 外 部 函 数 的 界 面 的, 如 果 一 个 函 数 被 描 述 为 界 面 块, 那 么 它 已 经 具 有 默 认 的 外 部 属 性, 因 此 也 就 没 必 要 再 去 显 形 地 赋 予 它 EXTERNAL 属 性 单 独 的 EXTERNAL 语 句 可 以 声 明 子 例 行 程 序 与 数 据 块 程 序 单 位 具 有 外 部 属 性, 其 句 法 形 式 (R1208) 为 : EXTERNAL[ ::] external-name-list EXTERNAL 属 性 的 一 般 规 则 如 下 : 每 个 外 部 名 称 必 须 是 一 个 外 部 过 程, 或 一 个 哑 元, 或 一 个 数 据 块 程 序 单 位 的 名 称 如 果 一 个 哑 变 量 被 描 述 为 EXTERNAL 的, 那 么 该 哑 变 量 是 一 个 哑 过 程 除 了 在 块 内 具 有 MODULE PROCEDURE 语 句 的 模 块 过 程 之 外, 一 个 界 面 块 对 于 其 中 的 所 有 过 程 具 有 外 部 属 性 例 7-51 下 面 是 主 要 说 明 数 据 项 的 例 子 : SUBROUTING SUB(DESIGN) INTEGER,EXTERNAL::DESIGN LOGICAL,EXTERNAL::SIN 例 7-52 下 面 是 相 应 的 主 要 说 明 属 性 的 例 子 : SUBROUTING SUB(DESIGN) INTEGER DESIGN LOGICAL SIN EXTERNAL DESIGN,SIN INTRINSIC 属 性 和 INTRINSIC 语 句 INTRINSIC 属 性 用 于 描 述 一 个 名 称 是 一 个 固 有 函 数 的 名 称, 并 且 该 名 称 可 以 用 于 作 为 实 元 附 加 INTRINSIC 属 性 说 明 的 类 型 声 明 语 句 的 形 式 为 : type-specification,intrinsic [,attribute-list]::intrinsic-function-name-list 与 I NTRINSIC 属 性 兼 容 的 其 他 属 性 有 : PUBLIC PRIVATE 单 独 的 INTRINSIC 语 句 可 以 用 来 声 明 固 有 子 例 行 程 序, 其 句 法 形 式 (R1209) 为 : INTRINSIC [ ::] intrinsic-procedure-name-list INTRINSIC 属 性 的 一 般 规 则 如 下 : 每 个 固 有 过 程 名 称 必 定 是 一 个 固 有 过 程 的 名 称 在 一 个 作 用 域 内, 一 个 名 称 只 能 声 明 INTRINSIC 一 次 在 一 个 作 用 域 内, 一 个 名 称 不 能 既 声 明 为 INTRIN SIC, 又 声 明 为 EXTERNAL

119 一 种 具 体 的 编 译 器 可 能 支 持 FORTRA N 标 准 之 外 的 更 多 的 固 有 过 程, 当 然 在 相 应 编 译 器 看 来, 这 些 固 有 过 程 与 标 准 固 有 过 程 具 有 相 同 的 地 位, 但 是 使 用 了 这 样 的 过 程 的 程 序 可 能 导 致 程 序 的 可 移 植 性 变 差 例 7-53 下 面 是 主 要 说 明 数 据 项 的 例 子 : REAL,INTRINSIC::SIN, COS 例 7-54 下 面 是 相 应 的 主 要 说 明 属 性 的 例 子 : REAL SIN, COS INTRIN SIC SIN,COS 7.9 属 性 兼 容 性 属 性 兼 容 性 表 7-3 如 下 : 如 果 两 个 属 性 可 以 同 时 在 一 个 声 明 语 句 当 中 赋 予, 则 用 可 表 示, 否 则, 用 否 表 示 表 7-3 各 种 属 性 的 相 互 兼 容 性 ALLOCA DIMEN POINT TARG PARAM PUB PRIVA INTEN OPTIO SAV EXTER INTRI TABLE SION ER ET ETER LIC TE INITIALIZA TION 否 是 是 是 是 是 是 否 否 是 否 ALLO CATABLE 是 否 是 否 是 是 否 否 是 否 DIM ENSION 是 是 是 是 是 是 是 是 否 P OINTER 否 否 是 是 否 是 是 否 否 TARGET PARAMETER PUBLIC T NAL E NAL 否 是 是 是 是 是 否 是 是 否 否 否 否 否 否 否 是 是 PRIVATE 否 否 是 是 是 INTENT 是 否 否 否 OPTION AL 否 是 SAVE 否 否 EX TERNAL 否 NSIC 否 否 否 否 否 是 否 7.10 动 态 数 据 对 象 有 两 类 数 据 对 象 在 确 定 其 存 储 空 间 时, 会 产 生 非 常 复 杂 的 现 象, 这 就 是 数 组 和 字 符 型 对 象 因 为 这 两 种 数 据 对 象 在 某 些 情 况 下, 不 能 预 先 确 定 它 的 存 储 空 间, 为 了 解 决 这 个 问 题,FORTRAN 干 脆 提 供 一 种 动 态 数 据 对 象 的 概 念, 可 以 专 门 用 来 描 述 在 特 定 情 形 下, 存 储 空 间 总 是 发 生 变 化 的 数 据 对 象 动 态 数 据 对 象 可 以 只 是 在 过 程 或 过 程 界 面 声 明, 这 样 只 有 在 过 程 被 进 入 的 时 候, 动 态 数 据 对 象 的 存 储 空 间 才 开 辟 出 来, 而 当 过 程 完 成 运 行 后, 它 们 所 占 据 的 存 储 空 间 就 消 失 了, 它 们 可 以 被

120 开 辟 成 和 过 程 里 的 变 量 一 样 大 的 空 间, 就 能 在 每 次 调 用 时 量 体 裁 衣, 获 取 适 当 大 小 的 存 储 空 间 这 样 既 能 满 足 这 些 对 象 对 于 存 储 空 间 的 需 要, 又 能 在 不 使 用 它 们 的 时 候, 有 效 地 释 放 空 间 两 种 动 态 数 据 对 象 为 : 任 意 类 型 的 动 态 数 组 对 于 数 组 来 说, 发 生 动 态 变 化 的 是 每 个 维 度 上 的 宽 度, 所 采 取 的 表 达 形 式 是 把 数 组 每 个 维 度 上 的 界 表 示 为 一 个 包 含 变 量 的 表 达 式, 这 样 当 数 组 取 可 分 配 数 组 或 指 针 数 组 的 形 式 时, 这 样 当 程 序 运 行 进 入 到 其 所 在 过 程 时, 它 的 界 才 被 确 定 下 来 字 符 型 对 象 对 于 字 符 型 对 象 来 说, 发 生 动 态 变 化 的 是 它 的 字 符 长 度, 所 采 取 的 表 达 形 式 是 把 字 符 型 对 象 的 长 度 表 示 为 一 个 包 含 变 量 的 表 达 式, 这 样 当 程 序 运 行 进 入 到 其 所 在 过 程 时, 它 的 长 度 才 被 确 定 下 来 注 意 作 为 动 态 数 据 对 象 的 字 符 型 对 象 不 是 哑 变 量 除 了 在 类 型 声 明 当 中 包 含 的 默 认 初 始 化 之 外, 动 态 数 据 对 象 不 能 被 初 始 化 或 被 保 留 例 7-55 SUBROUTING SWAP_ARRAYS (X, Y, X_NAME, Y NAME) REAL, DIMENSION(:), INTENT(INOUT) :: X, Y CHARACTER (LEN= *), INTENT(IN) :: X_NAME, Y_NAME REAL C (SIZE(X)) CHARACTER (LEN= LEN(X_NAME) + LEN(Y_NAME) +20) MESSAGE C=X X=Y Y=C MESSAGE = X_NAME // and //Y_NAME// are swapped. PRINT *, MESSAGE END SUBROUTING SWAP_ARRAYS 其 中 C 是 一 个 动 态 数 组, 而 MESSAGE 是 一 个 动 态 字 符 型 对 象 NAMELIST 语 句 NAMELIST 语 句 能 够 用 来 给 一 系 列 对 象 的 集 合 命 名, 然 后 就 可 以 在 一 些 输 入 输 出 语 句 当 中 通 过 引 用 该 名 称 而 达 到 引 用 相 应 的 对 象 集 合 的 目 的 NAMELIST 语 句 的 句 法 形 式 (R544) 为 : NAMELIST / namelist-group-name / variable-name-list & [[,]/ namelist-group-name / variable-name-list ] NAMELIST 语 句 的 一 般 规 则 如 下 : 变 量 名 称 列 表 (variable-name-list) 当 中 的 变 量 不 能 是 如 下 几 种 情 形 : 带 非 常 量 界 的 数 组 哑 变 量 具 有 待 定 字 符 长 度 的 变 量 动 态 对 象 指 针

121 在 任 意 层 次 上 包 含 指 针 成 员 的 派 生 类 型 对 象 可 分 配 数 组 以 上 对 象 的 任 意 子 对 象 如 果 整 个 名 称 列 表 集 合 的 名 称 具 有 PUBLIC 属 性, 那 么 它 的 每 一 个 元 素 都 不 能 具 有 PRIVATE 属 性, 每 个 元 素 也 不 能 包 含 具 有 PRIVATE 属 性 的 成 员 在 NAMELIST 里 的 对 象 的 排 列 顺 序, 决 定 了 在 输 出 时 值 的 排 列 顺 序 一 个 名 称 列 表 集 合 名 称 可 以 出 现 在 一 个 作 用 域 单 位 里 的 多 条 NAMELIST 语 句 里 面 一 个 变 量 可 以 是 多 个 名 称 列 表 集 合 的 元 素 一 个 变 量 在 进 入 变 量 名 称 列 表 之 前, 必 须 在 同 一 个 作 用 域 里 被 说 明 了 类 型, 种 别 参 数 以 及 形 状, 或 者 是 通 过 隐 式 规 则 被 默 认 具 有 相 应 的 类 型 属 性, 而 当 它 在 随 后 的 可 能 的 类 型 说 明 语 句 当 中 出 现 时, 必 须 与 其 默 认 隐 式 规 则 所 规 定 的 类 型 属 性 保 持 一 致 例 7-56 NAMELIST / X_LIST / I, J, K, L, M, N NAMELIST / Y_LIST / A, B, C 7.12 存 储 关 联 对 于 FORTRAN 这 样 的 高 级 语 言 而 言, 一 般 说 来 很 少 提 供 对 程 序 的 物 理 底 层 的 控 制, 但 是 由 于 数 据 对 象 的 物 理 存 储 空 间 的 问 题, 对 于 程 序 的 空 间 利 用 效 率 有 很 大 的 影 响, 所 以 FORTRAN 还 是 提 供 了 一 些 语 句 可 以 用 来 控 制 数 据 对 象 的 物 理 存 储 FORTRAN 里 面 用 来 控 制 物 理 存 储 单 位, 存 储 的 顺 序, 以 及 对 存 储 单 位 的 共 享 的 语 句 有 : COMMON EQUIVALENCE SEQUENCE 在 FORTRAN 的 早 期 版 本 里,COMMON 和 EQUIVALENCE 这 两 个 语 句 提 供 了 足 够 强 大 的 控 制 存 储 空 间 的 功 能 COMMON 专 门 用 来 处 理 不 同 程 序 单 位 之 间 的 数 据 共 享 问 题, 而 EQUIVALENCE 则 用 来 处 理 多 个 对 象 共 享 一 个 存 储 空 间 的 问 题 但 是 正 是 因 为 这 两 个 语 句 的 功 能 过 于 强 大, 使 得 它 们 的 滥 用 会 导 致 对 程 序 的 理 解 和 维 护 变 得 非 常 困 难 在 FORTRAN 的 现 代 版 本 里, 为 了 解 决 这 个 问 题, 使 用 了 更 加 明 确 而 专 门 的 方 法 来 获 得 对 存 储 空 间 的 控 制, 诸 如 模 块, 指 针, 可 分 配 数 组, 动 态 数 据 对 象 都 可 以 非 常 有 效 而 清 晰 地 进 行 存 储 空 间 管 理, 因 此 上 面 的 两 条 语 句 的 作 用 逐 渐 减 小 同 时 在 FORTRAN90 里 面, 还 引 入 了 SEQUENCE 语 句, 用 来 定 义 结 构 的 成 员 存 储 顺 序 关 于 存 储 单 位 与 存 储 顺 序 的 一 个 中 心 概 念 就 是 存 储 关 联, 这 个 概 念 能 让 我 们 理 解 COMMON 和 EQUIVALENCE 这 两 个 语 句 的 运 行 机 制 但 是 FORTRAN 的 存 储 关 联 并 不 对 实 际 的 物 理 内 存 分 配 作 出 要 求, 只 是 在 功 能 层 面 的 描 述 存 储 单 位 在 早 期 的 FORTRAN 版 本 里, 只 存 在 两 种 非 常 明 确 的 存 储 单 位, 即 用 于 存 储 数 值 的 存 储 单 位, 和 用 于 存 储 字 符 的 存 储 单 位, 那 时 侯 任 何 的 数 据 对 象 都 被 归 结 为 这 两 种 存 储 形 式 在 FORTRAN 的 现 代 版 本 里, 引 入 了 很 多 非 默 认 类 型, 派 生 类 型 以 及 指 针, 显 然 这 些 数 据 对

122 象 已 经 无 法 只 使 用 两 种 存 储 单 位 了, 它 们 的 结 构 的 复 杂 性 甚 至 使 得 靠 增 加 存 储 单 位 的 种 类 也 无 法 很 好 地 满 足 这 些 经 常 表 现 出 动 态 性 质 的 数 据 对 象 对 存 储 的 要 求 因 此 FORTRAN 的 解 决 方 法 就 是 提 出 一 种 统 一 的 不 定 存 储 空 间, 每 一 个 非 传 统 对 象 都 可 以 认 为 是 占 据 了 一 个 不 定 存 储 空 间, 但 是 实 际 上 对 于 不 同 的 种 类, 它 们 的 物 理 存 储 空 间 是 非 常 不 同 的 对 于 那 些 非 传 统 数 据 对 象, 根 据 它 们 的 类 型 定 义 是 否 包 含 SEQUENCE 语 句, 而 分 为 两 种 : 非 序 列 结 构 具 有 这 种 结 构 的 对 象 占 据 一 个 单 独 的 不 定 存 储 空 间 单 位, 这 种 单 位 的 实 际 物 理 存 储 空 间 常 常 对 于 不 同 的 对 象 都 是 非 常 不 同 的 例 如 一 个 十 六 位 精 度 的 实 型 数 值 与 一 个 具 有 最 小 长 度 的 逻 辑 型 数 据, 尽 管 它 们 都 声 称 占 据 了 一 个 单 独 的 不 定 存 储 空 间 单 位, 但 它 们 的 实 际 物 理 空 间 的 大 小 是 非 常 不 同 的 序 列 结 构 所 谓 序 列 结 构 是 由 一 系 列 具 有 明 确 的 类 型 与 属 性 的 数 据 结 构 组 成 的 序 列, 其 中 的 每 个 成 员 都 占 据 了 一 个 存 储 单 位 序 列 结 构 分 为 三 种 : 数 值 序 列 结 构 只 包 含 默 认 类 型 的 数 值 和 逻 辑 型 对 象 字 符 序 列 结 构 只 包 含 默 认 类 型 的 字 符 型 对 象 序 列 结 构 包 含 各 种 成 员 的 混 合 结 构, 例 如 占 据 数 值 存 储 单 位, 字 符 存 储 单 位, 不 定 存 储 空 间 单 位 的 各 种 成 员 下 面 的 表 7-4 列 出 了 各 种 不 同 的 类 型 与 属 性 的 数 据 对 象 所 占 据 的 存 储 单 位 表 7-4 不 同 的 类 型 与 属 性 的 数 据 对 象 所 占 据 的 存 储 单 位 对 象 的 类 型 与 属 性 默 认 整 型 存 储 单 位 1 个 数 值 存 储 单 位 默 认 实 型 1 个 数 值 存 储 单 位 默 认 逻 辑 型 1 个 数 值 存 储 单 位 双 精 度 2 个 数 值 存 储 单 位 默 认 复 型 2 个 数 值 存 储 单 位 长 度 1 的 默 认 字 符 型 1 个 字 符 存 储 单 位 长 度 s 的 默 认 字 符 型 S 个 字 符 存 储 单 位 非 默 认 整 型 1 个 不 定 存 储 单 位 默 认 实 型 与 双 精 度 实 型 之 外 的 实 型 1 个 不 定 存 储 单 位 非 默 认 逻 辑 型 1 个 不 定 存 储 单 位 非 默 认 复 型 1 个 不 定 存 储 单 位 长 度 1 的 非 默 认 字 符 型 1 个 不 定 存 储 单 位 长 度 s 的 非 默 认 字 符 型 S 个 不 定 存 储 单 位 非 序 列 结 构 1 个 不 定 存 储 单 位 数 值 序 列 结 构 n 个 数 值 存 储 单 位 ( 包 含 n 个 成 员 ) 字 符 序 列 结 构 n 个 字 符 存 储 单 位 ( 包 含 n 个 成 员 ) 序 列 结 构 1 个 不 定 存 储 单 位

123 具 有 指 针 属 性 的 任 意 类 型 1 个 不 定 存 储 单 位 具 有 维 度 属 性 的 任 意 固 有 或 序 列 类 型 数 组 的 尺 度 乘 该 类 型 存 储 单 位 的 数 目 ( 按 照 数 组 元 素 顺 序 ) 具 有 维 度 属 性 的 任 意 非 固 有 或 非 序 列 类 型 非 指 定 个 不 定 存 储 单 位 具 有 指 针 属 性 与 维 度 属 性 的 任 意 类 型 1 个 不 定 存 储 单 位 存 储 序 列 所 谓 存 储 序 列 就 是 一 个 存 储 单 位 的 排 序 一 个 存 储 单 位 可 以 是 数 组 的 一 个 元 素, 字 符 变 量 里 的 字 符, 序 列 结 构 里 的 成 员, 或 者 是 公 用 块 里 的 变 量 一 个 存 储 序 列 的 序 列 构 成 一 个 复 合 的 存 储 序 列 这 个 复 合 存 储 序 列 里 面 存 储 单 位 的 排 序 保 持 每 个 层 次 的 序 列 顺 序 不 变, 同 时 忽 略 0 长 度 的 序 列 当 两 个 不 同 对 象 共 享 了 部 分 存 储 时, 被 称 为 存 储 关 联 通 过 关 联 就 可 以 使 得 多 个 变 量 共 享 存 储 空 间 如 果 两 个 对 象 具 有 相 同 的 存 储 序 列, 那 么 它 们 称 为 完 全 关 联 如 果 两 个 对 象 共 享 部 分 存 储 空 间 而 不 是 完 全 关 联, 那 么 它 们 称 为 部 分 关 联 第 8 章 构 造 表 达 式 完 成 了 数 据 描 述 的 任 务 之 后, 一 个 程 序 就 进 入 了 数 据 处 理 的 阶 段 也 就 是 一 系 列 的 以 数 据 为 对 象 的 操 作 语 句, 访 问 经 过 声 明 的 数 据 对 象, 施 加 计 算 处 理 之 后, 获 得 新 的 数 据 结 果 FORTRAN 语 言 里 面 访 问 数 据 对 象 然 后 返 回 值 的 一 个 基 本 指 令 形 式 是 表 达 式, 而 通 过 表 达 式 所 得 到 的 计 算 结 果 被 用 来 赋 值 给 某 个 变 量, 完 成 这 个 操 作 的 是 赋 值 语 句 本 章 与 下 一 章 我 们 将 讨 论 表 达 式 与 赋 值 语 句 这 两 个 相 续 的 改 变 机 器 的 数 据 状 态 的 基 本 操 作 一 个 科 学 计 算 程 序 的 基 本 任 务 就 是 进 行 计 算, 而 计 算 的 最 基 本 的 单 位 就 是 表 达 式 FORTRAN 作 为 一 门 最 早 的 高 级 语 言, 其 初 衷 就 是 公 式 翻 译 (FORMULA TRANSLATION), 即 希 望 运 用 这 个 语 言, 能 够 把 数 学 公 式 最 好 是 原 封 不 动 地 搬 到 FORTRAN 语 言 的 环 境 里, 而 计 算 机 能 够 忠 实 地 理 解 公 式 的 含 义, 并 进 行 公 式 所 要 求 的 运 算 当 然, 要 求 把 能 够 把 数 学 公 式 原 封 不 动 地 搬 到 FORTRAN 语 言 的 环 境 里, 就 能 够 被 FORTRAN 理 解 是 不 可 能 的, 因 为 首 先 是 公 式 的 输 入 受 到 键 盘 的 限 制, 然 后 作 为 一 种 程 序 语 言, 我 们 在 第 4 章 已 经 讨 论 过, 它 所 使 用 的 字 符 集 必 定 是 有 限 的, 而 数 学 符 号 的 集 合 则 基 本 上 是 开 放 性 的 而 从 计 算 的 实 质 上 来 考 虑, 我 们 知 道 计 算 机 在 物 理 层 面 所 能 够 做 到 的 计 算 其 实 是 非 常 简 单 的 加 减 法 而 已, 因 此 我 们 希 望 运 用 计 算 机 来 完 成 任 意 的 计 算 任 务, 所 面 临 的 挑 战, 正 是 如 何 把 我 们 的 实 际 计 算 任 务 分 解 为 等 价 的 简 单 计 算 过 程 的 组 合,FORTRAN 作 为 一 种 语 言, 显 然 只 能 在 很 初 步 的 层 次 上 完 成 这 个 任 务, 即 直 接 在 语 言 里 使 用 数 学 基 本 运 算, 例 如 : 加 法, 减 法, 乘 法, 幂 运 算 等, 然 后 在 此 基 础 上, 再 定 义 一 些 基 本 的 数 学 函 数 作 为 语 言 的 固 有 函 数, 可 以 供 人 直 接 引 用, 对 它 的 解 释 则 完 全 交 给 FORTRAN 编 译 器 FORTRAN 所 能 够 做 到 的 基 本 上 也 就 到 此 为 止 了 更 进 一 步 的 计 算 的 分 解 任 务, 则 必 须 由 程 序 来 完 成 因 此 FORTRAN 能 够 做 到 的 就 是 尽 量 以 符 合 数 学 的 书 写 习 惯 的 方 式 来 规 范 表 达 式 的 格 式

124 一 般 说 来, 我 们 把 表 达 式 理 解 为 语 句 ( 甚 至 是 程 序 ) 的 语 法 结 构 的 单 位 在 其 他 的 语 言 里, 表 达 式 同 样 具 有 非 常 关 键 的 语 法 地 位, 例 如 在 C 语 言 中, 表 达 式 组 成 了 允 许 每 一 语 句 改 变 机 器 状 态 的 基 本 操 作 在 LISP 语 言 这 样 的 高 级 应 用 语 言 中, 表 达 式 构 成 了 驱 动 程 序 执 行 的 基 本 顺 序 控 制 而 在 FORTRAN 这 样 的 以 科 学 计 算 为 主 要 目 的 的 语 言 当 中, 表 达 式 更 是 构 成 了 完 成 计 算 任 务 的 基 本 成 分 本 章 的 讨 论 就 是 围 绕 着 表 达 式 的 构 造 如 何 贴 切 地 合 乎 我 们 对 于 计 算 任 务 的 要 求 分 为 三 个 部 分 : 有 效 合 法 的 表 达 式 的 格 式 也 就 是 构 造 表 达 式 的 语 法 按 照 我 们 在 前 面 经 常 根 据 语 法 规 则 来 构 造 语 言 所 获 得 的 经 验, 合 乎 格 式 的 语 句 不 一 定 是 有 实 际 意 义 的 语 句, 因 此 我 们 接 着 就 需 要 讨 论 对 表 达 式 的 理 解 问 题, 即 : 对 表 达 式 的 解 释 可 以 理 解 为 表 达 式 的 语 义, 也 就 是 一 种 规 范, 按 照 这 种 规 范, 计 算 机 读 入 合 法 的 表 达 式 之 后, 能 够 无 歧 义 地 转 化 为 一 系 列 指 令, 从 而 采 取 相 应 的 动 作 计 算 机 对 表 达 式 的 含 义 的 理 解 建 立 在 表 达 式 的 构 造 语 法 的 规 范 性 上, 一 旦 完 成 这 个 步 骤, 接 着 就 是 完 成 表 达 式 的 最 终 任 务 : 表 达 式 的 计 算 过 程 计 算 机 对 于 表 达 式 的 实 际 计 算 过 程 未 必 与 人 的 计 算 过 程 一 致, 对 于 计 算 机 来 说, 最 为 重 要 的 是 根 据 机 器 计 算 的 特 点, 对 计 算 过 程 进 行 优 化, 相 应 的 作 为 程 序 作 者, 我 们 需 要 了 解 机 器 的 优 化 原 则, 以 便 在 程 序 写 作 与 算 法 设 计 上 配 合 机 器 的 计 算 优 化 能 力 FORTRAN 表 达 式 的 构 造, 需 要 解 决 两 大 问 题 : 构 造 算 元 与 算 符 的 规 则 ; 运 算 优 先 级 的 规 则 在 构 造 合 法 的 FORTRAN 表 达 式 的 过 程 中, 最 主 要 的 问 题 就 是 如 何 在 FORTRAN 有 限 的 构 造 表 达 式 的 规 则 下, 能 够 构 造 具 有 开 放 性 的 数 学 公 式 由 于 一 个 表 达 式 的 基 本 成 分 就 是 算 元, 算 符 和 括 号, 因 此 上 面 的 问 题 可 以 分 为 两 个 部 分 : 在 固 有 算 元 类 型 的 基 础 上, 能 够 构 造 派 生 类 型 的 算 元 ; 在 固 有 算 符 的 基 础 上, 能 够 扩 展 固 有 算 符 的 适 用 范 围, 能 够 构 造 派 生 类 型 的 算 符 因 此 所 谓 构 造 表 达 式 的 规 则, 除 了 规 定 固 有 算 元 与 固 有 算 符 之 外, 还 必 须 给 出 对 固 有 算 元 与 固 有 算 符 的 扩 展 与 派 生 定 义 的 规 则 接 下 来 需 要 考 虑 的 问 题, 就 是 如 何 表 达 运 算 优 先 级, 也 就 是 括 号 所 具 有 的 功 能 在 数 学 运 算 的 过 程 当 中, 运 算 优 先 级 是 一 个 很 自 然 的 问 题, 在 数 学 公 式 的 写 作 中, 我 们 使 用 了 很 多 隐 含 的 规 则, 基 本 能 够 保 证 数 学 公 式 的 读 者 不 会 产 生 歧 义, 把 数 学 公 式 转 换 到 FORTRAN 语 言 当 中, 就 不 能 够 再 依 靠 那 些 隐 含 的 规 则, 而 是 需 要 把 那 些 规 则 明 确 的 形 式 化 出 来, 有 时 候 还 得 制 定 适 应 于 机 器 语 言 的 独 特 规 则 尽 管 我 们 可 以 使 用 尽 可 能 多 的 括 号 来 做 到 明 确 的 优 先 级 描 述, 但 是 从 方 便 写 作 的 角 度 来 看, 在 不 导 致 歧 义 的 前 提 下, 可 以 通 过 形 式 规 则 来 省 略 很 多 括 号 8. 1 表 达 式 的 构 造 本 节 可 以 说 是 书 写 表 达 式 的 语 法 从 语 言 的 角 度 来 看, 我 们 前 面 章 节 所 讨 论 的 数 据 对 象, 可 以 说 是 语 言 的 词 汇, 而 且 是 语 法 意 义 上 比 较 简 单 词 汇, 即 使 很 多 数 据 对 象 可 以 具 有 非 常 复 杂 的 数

125 据 结 构, 但 在 语 法 意 义 上, 则 仍 然 可 以 看 成 是 单 词 但 表 达 式 就 不 同 了, 它 所 隐 含 的 指 令 性 质 使 得 它 可 以 看 成 是 复 合 性 质 的 词 汇 实 际 上 表 达 式 是 访 问 程 序 中 的 数 据 对 象 并 返 回 值 的 函 数 这 就 要 求 它 具 有 比 数 据 对 象 更 为 复 杂 的 语 法 结 构 表 达 式 包 含 三 个 基 本 成 分 : 算 元 ; 算 符 ; 括 号 其 中 算 元 具 有 最 基 本 的 实 质 含 义, 因 此 最 简 单 的 表 达 式 就 是 一 个 常 量, 或 一 个 变 量 例 8-1 下 面 的 例 子 都 可 以 看 成 是 最 简 单 的 表 达 式 : ! 一 个 实 型 常 数 A! 一 个 标 量 变 量 X! 一 个 数 组 变 量.TURE.! 一 个 逻 辑 型 常 量 X(I)! 作 为 数 组 X 的 元 素 的 变 量 X(10:100:5)! 作 为 一 个 数 组 片 断 的 变 量 A%B! 作 为 结 构 A 的 成 员 的 变 量 X(I)(K:K+100)! 作 为 数 组 元 素 X(I) 的 子 串 的 变 量 算 元 遵 循 变 量 的 数 学 精 神, 我 们 可 以 把 表 达 式 看 成 是 一 个 递 归 结 构, 即 表 达 式 里 的 变 量 总 是 可 以 代 表 任 意 的 由 变 量 构 成 的 结 构, 或 者 说 表 达 式, 因 此 可 以 如 下 规 定 算 元 的 构 成 一 个 算 元 可 以 是 如 下 形 式 的 表 达 式 : 一 个 常 量 或 常 量 的 子 对 象 ; 一 个 变 量 ; 一 个 数 组 构 造 器 ; 一 个 结 构 构 造 器 ; 一 个 函 数 引 用 ; 另 一 个 括 号 里 的 表 达 式 注 意 另 一 个 表 达 式!, 如 果 使 用 同 一 个 表 达 式, 必 然 导 致 死 循 环 例 8-2 下 面 是 算 元 的 例 子 : X Y(3) Z(10:100) (X+SIN(Y)) (/5.52,4031/) EULER(5,9) RT!

126 8.1.2 一 元 算 符 与 二 元 算 符 根 据 算 符 所 作 用 的 算 元 数 目, 算 符 分 为 一 元 算 符 与 二 元 算 符 下 面 的 表 8-1 给 出 了 FORTRAN 的 固 有 算 符, 除 此 之 外, 用 户 可 以 运 用 函 数 子 程 序 来 给 出 自 定 义 算 符, 然 后 使 用 一 个 名 称 来 标 志 该 自 定 义 算 符, 在 FORTRAN 语 言 里, 则 还 需 要 在 名 称 的 两 边 分 别 加 上 一 个 句 点, 以 便 FORTRAN 辨 识 为 自 定 义 算 符 无 论 是 固 有 算 符 还 是 自 定 义 算 符, 总 是 分 为 一 元 算 符 与 二 元 算 符 一 元 算 符 作 用 于 一 个 算 元, 形 式 为 : operator x 即 算 符 写 在 算 元 之 前 例 A - G.NOT. B 上 面 的 一 元 算 符 里 面,+ 和 - 都 可 以 成 为 二 元 算 符, 而.NOT. 则 是 唯 一 的 只 能 作 一 元 算 符 的 固 有 算 符 加 号 + 运 算 实 际 上 并 不 影 响 算 元 的 值 二 元 算 符 作 用 于 2 个 算 元, 形 式 为 : x operator y 即 算 符 写 在 2 个 算 元 之 间 例 8-4 A+B D**3 X.AND. Y A.GT. B C.NE. D PROGRAMER // CALCULATE A == B C-D 固 有 算 符 与 自 定 义 算 符 算 符 分 为 两 类 : 固 有 算 符 所 谓 固 有 算 符 就 是 直 接 使 用 相 应 符 号, 能 够 被 FORTRAN 编 译 器 所 辨 识 的 算 符 下 面 的 表 8-1 给 出 了 FORTRAN 的 固 有 算 符 以 及 相 应 的 算 元 类 型 表 8-1 FORTRAN 的 固 有 算 符 以 及 相 应 的 算 元 类 型 算 符 类 别 固 有 算 符 算 元 类 型

127 算 术 运 算 +,-( 一 元 算 符 ) 任 意 数 值 类 型 与 任 意 种 别 参 数 的 数 值 的 组 **,*,/,+,-( 二 元 算 符 ) 合 字 符 运 算 // 具 有 相 同 种 别 参 数 的 任 意 长 度 的 字 符 串 关 系 运 算. EQ.,.NE., ==,/= 两 个 算 元 或 者 同 时 是 任 意 数 值 类 型 与 任 意 种 别 参 数 的 数 值, 或 者 同 时 是 具 有 相 同 种 别 参 数 的 任 意 长 度 的 字 符 串 关 系 运 算.GT.,.GE.,.LT.,.LE., 两 个 算 元 或 者 同 时 是 除 了 复 型 之 外 的 任 意 >,>=,<,<= 数 值 类 型 与 任 意 种 别 参 数 的 数 值, 或 者 同 时 是 具 有 相 同 种 别 参 数 的 任 意 长 度 的 字 符 串 逻 辑 运 算.NOT.( 一 元 算 符 ) 同 时 是 任 意 种 别 参 数 的 逻 辑 型 数 据 的 组 合.AND.,.OR.,.EQV.,NEQV. ( 二 元 算 符 ) 关 系 算 符 ==,/=,>,>=,<,<= 是 为 了 向 数 学 公 式 的 写 法 靠 近, 而 在 FORTRAN 里 面 最 新 引 入 的 算 符 写 法, 分 别 等 价 于.EQ.,.NE.,.GT.,.GE.,.LT.,.LE. 自 定 义 算 符 显 然 上 面 那 些 固 有 算 符 不 够 用, 所 以 为 了 获 得 算 符 表 示 的 开 放 性,FORTRAN 约 定 了 通 过 函 数 子 程 序 定 义 自 定 义 算 符 的 规 则 首 先 自 定 义 算 符 必 须 拥 有 一 个 名 称, 而 这 个 名 称 的 写 法 必 须 满 足 一 定 的 形 式 规 则, 以 便 FORTRAN 编 译 器 的 辨 识 自 定 义 算 符 的 形 式 为 :.XXX. 即 在 两 个 句 点 之 间 有 n 个 字 母,n 不 大 于 31 中 间 的 字 母 串 最 好 是 一 个 表 达 该 运 算 含 义 的 英 文 单 词 这 个 单 词 不 能 与 固 有 运 算 符 或 者 逻 辑 常 量 里 面 已 经 使 用 了 的 单 词 重 复 自 定 义 算 符 可 以 是 基 于 已 经 定 义 的 算 符 和 固 有 算 符, 完 全 重 新 定 义 的 算 符, 因 此 需 要 给 出 一 个 新 的 名 称, 也 可 以 是 对 固 有 算 符 的 作 用 算 元 的 类 型 的 扩 展, 这 时 仍 然 可 以 使 用 固 有 算 符 的 符 号, 但 是 扩 展 定 义 需 要 预 先 给 出 一 元 自 定 义 算 符 具 有 最 高 的 运 算 优 先 级, 而 二 元 自 定 义 算 符 具 有 最 低 的 运 算 优 先 级 构 造 表 达 式 的 规 则 所 谓 构 造 表 达 式 的 规 则, 就 是 一 系 列 的 语 句 规 则, 按 照 这 个 规 则 把 算 元 和 算 符 组 合 起 来 得 到 的 就 是 合 法 的 表 达 式 当 然 这 里 包 含 了 一 定 的 任 意 性, 即 只 要 按 照 这 个 规 则 构 造 出 来 的 表 达 式 都 是 被 FORTRAN 认 可 的 语 法 规 则 除 了 给 出 算 元 与 算 符 的 顺 序 之 外, 还 能 够 表 达 运 算 顺 序, 而 这 个 运 算 顺 序 是 以 运 算 优 先 级 形 式 给 出 的, 当 然 FORTRAN 表 达 式 的 运 算 优 先 级 必 须 和 我 们 的 数 学 公 式 里 的 运 算 优 先 级 一 致 直 观 来 看, 表 达 式 就 是 变 量 的 运 算 结 构, 而 变 量 本 身 具 有 递 归 的 含 义, 因 此 表 达 式 的 定 义 必 然 是 具 有 递 归 的 结 构 也 就 是 首 先 我 们 定 义 最 底 层 的 基 元, 即 最 简 单 的 表 达 式, 然 后 对 基 元 的 运 算 构 成 更 加 复 杂 的

128 表 达 式, 而 递 归 的 体 现 就 是 在 基 元 里 面 包 括 括 号 里 面 的 表 达 式 1. 基 元 基 元 的 形 式 定 义 (R701) 为 : constant constant-subobject variable array-constructor structure-constructor function-reference (expression) 以 上 任 何 一 种 对 象 都 可 以 成 为 基 元 所 谓 常 量 子 对 象 (constant-subobject), 就 是 一 个 父 结 构 为 常 量 的 子 对 象 作 为 基 元 的 变 量, 不 能 是 哑 尺 度 数 组, 或 者 一 个 哑 尺 度 数 组 的 片 断, 除 非 数 组 的 最 后 一 个 下 标 已 经 明 确 给 出 为 一 个 标 量 下 标, 或 上 界 确 定 的 下 标 三 元 组, 或 下 标 向 量 例 8-5 基 元 的 例 子 如 下 : PI LENGTH 实 型 常 量 命 名 常 量 命 名 常 量 WHOLE (I:I) 常 量 子 对 象 X 变 量 X(K) 数 组 元 素 X(:,1:K) 在 最 后 一 维 具 有 上 界 的 哑 尺 度 数 组 STRING(I:J) 子 串 (/I,5,100/) 数 组 构 造 器 BESSEL1(A,B) 结 构 构 造 器 F(X) 函 数 引 用 ( WHOLE (I:I)//BUT) 括 号 里 的 表 达 式 作 为 一 个 命 名 常 量,PI 明 显 地 表 示 圆 周 率, 使 用 这 类 含 义 明 确 的 英 文 单 词 来 表 示 常 量 是 一 个 很 好 的 习 惯 当 LENGTH 具 有 PARAMETER 属 性, 或 出 现 在 PARAMETER 语 句 当 中 时, 同 样 是 一 个 命 名 常 量 WHOLE (I:I) 实 际 上 是 一 个 常 量 子 对 象, 尽 管 其 中 I 可 能 是 一 个 变 量, 但 它 的 父 结 构 是 一 个 常 量 BESSEL1 (A,B), F(X) 都 属 于 自 定 义 类 型 对 象, 它 们 在 程 序 里 出 现 时, 都 需 要 预 先 加 以 定 义 2. 自 定 义 一 元 表 达 式 一 个 已 经 自 定 义 的 一 元 算 符 后 接 一 个 算 元 构 成 一 个 自 定 义 一 元 表 达 式, 句 法 形 式 (R703) 为 : [defined-operetor]primary 其 中 自 定 义 算 符 (defined-operetor) 的 句 法 形 式 (R704) 为 :.letter[ letter]. 注 意 自 定 义 算 符 是 可 选 的, 即 单 独 的 基 元 也 可 以 构 成 一 元 表 达 式 构 成 自 定 义 算 符 的 字 符 数 目 不 能 够 超 过 31 自 定 义 算 符 不 能 与 固 有 算 符 以 及 逻 辑 字 面 常 量 雷 同

129 例 8-6.AB EL.G G 自 定 义 一 元 表 达 式,.ABEL. 为 自 定 义 算 符 单 独 的 基 元 也 可 以 构 成 一 元 表 达 式 3. 幂 运 算 表 达 式 幂 运 算 表 达 式 的 句 法 形 式 (R705) 为 : defined-unary-expression[**exponentiation-expression] 以 上 形 式 表 明 了 幂 运 算 表 达 式 (exponentiation-expression) 是 右 边 递 归 的, 即 幂 运 算 算 符 右 边 的 幂 运 算 表 达 式 正 是 上 面 所 定 义 的 表 达 式 本 身, 这 意 味 着 会 出 现 多 个 幂 运 算 连 在 一 起 的 情 形, 这 时 的 优 先 级 是 从 右 到 左, 即 X**Y**Z 被 解 释 为 X* *(Y**Z) 注 意 其 中 的 幂 运 算 表 达 式 与 幂 运 算 算 符 都 是 可 选 的, 即 单 独 的 自 定 义 一 元 表 达 式 从 语 法 角 度 而 言, 也 是 幂 运 算 表 达 式 例 8-7 X**Y X**Y **Z.ABEL.G G 幂 运 算 表 达 式 表 示 从 右 到 左 优 先 级 的 幂 运 算 表 达 式 自 定 义 一 元 表 达 式 也 是 幂 运 算 表 达 式 单 独 的 基 元 也 可 以 构 成 幂 运 算 表 达 式 4. 乘 法 表 达 式 乘 法 表 达 式 的 算 元 为 * 和 /, 句 法 形 式 (R706) 为 : [multiplication-expression*]exponentiation-expression multiplication-expression / exponentiation-expression 以 上 形 式 表 明 了 乘 法 表 达 式 (multiplication-expression) 是 左 边 递 归 的, 即 乘 法 算 符 左 边 的 乘 法 表 达 式 正 是 上 面 所 定 义 的 表 达 式 本 身, 这 意 味 着 会 出 现 多 个 乘 法 运 算 连 在 一 起 的 情 形, 这 时 的 优 先 级 顺 序 是 从 左 到 右, 即 X*Y*Z 被 解 释 为 (X*Y)*Z 在 以 后 的 二 元 运 算 里, 除 了 关 系 运 算, 同 级 优 先 级 顺 序 都 是 从 左 到 右 注 意 使 用 算 符 * 的 乘 法 运 算 表 达 式 与 乘 法 运 算 算 符 都 是 可 选 的, 即 单 独 的 幂 运 算 表 达 式 从 语 法 角 度 而 言, 也 是 幂 运 算 表 达 式 例 8-8 X*Y 乘 法 运 算 表 达 式 X*Y*Z 表 示 从 左 到 右 优 先 级 顺 序 的 乘 法 运 算 表 达 式 X / Y 乘 法 运 算 表 达 式 X / Y / Z 表 示 从 左 到 右 优 先 级 顺 序 的 乘 法 运 算 表 达 式 X**Y 幂 运 算 表 达 式 也 是 乘 法 运 算 表 达 式.ABEL.G 自 定 义 一 元 表 达 式 也 是 乘 法 运 算 表 达 式 G 单 独 的 基 元 也 可 以 构 成 乘 法 运 算 表 达 式 5. 加 法 表 达 式 加 法 表 达 式 的 算 元 为 + 和 -, 句 法 形 式 (R707) 为 : [summation-expression + ] multiplication -expression summation-expression - multiplication expression

130 + multiplication -expression - multiplication expression 多 个 加 法 运 算 的 优 先 级 顺 序 是 从 左 到 右, 例 如 X+Y+Z 被 解 释 为 (X+Y)+Z 注 意 使 用 算 符 + 的 加 法 运 算 表 达 式 与 加 法 运 算 算 符 都 是 可 选 的, 即 单 独 的 乘 法 运 算 表 达 式 从 语 法 角 度 而 言, 也 是 加 法 运 算 表 达 式 例 8-9 X+Y 加 法 表 达 式 X-Y+Z 表 示 从 左 到 右 优 先 级 顺 序 的 加 法 表 达 式 -X-Y- Z 表 示 从 左 到 右 优 先 级 顺 序 的 加 法 表 达 式 -X 使 用 一 元 算 符 - 的 加 法 表 达 式 +X 使 用 一 元 算 符 + 的 加 法 表 达 式 X*Y 加 法 表 达 式 X / Y / Z 加 法 表 达 式 X**Y 幂 运 算 表 达 式 也 是 加 法 表 达 式.ABEL.G 自 定 义 一 元 表 达 式 也 是 加 法 表 达 式 G 单 独 的 基 元 也 可 以 构 成 加 法 表 达 式 6. 串 联 表 达 式 串 联 表 达 式 的 算 元 为 //, 句 法 形 式 (R711) 为 : [concatenation-expression // ] summation-expression 例 8-10 X//Y 串 联 表 达 式 X//Y//Z 表 示 从 左 到 右 优 先 级 顺 序 的 串 联 表 达 式 X+Y 加 法 表 达 式 也 是 串 联 表 达 式 -X-Y-Z 串 联 表 达 式 -X 串 联 表 达 式 X*Y 串 联 表 达 式 X / Y / Z 串 联 表 达 式 X**Y 幂 运 算 表 达 式 也 是 串 联 表 达 式.AB EL.G 自 定 义 一 元 表 达 式 也 是 串 联 表 达 式 G 单 独 的 基 元 也 可 以 构 成 串 联 表 达 式 7. 比 较 表 达 式 比 较 表 达 式 的 算 元 为 关 系 算 符, 句 法 形 式 (R713) 为 : [concatenation-expression relation-operator ] concatenation-expression 关 系 算 符 ==,/=,>,>=,<,<= 在 任 何 情 况 下 总 是 分 别 等 价 于.EQ.,.NE.,.GT.,.GE.,.LT.,.LE. 注 意 关 系 表 达 式 的 定 义 不 具 有 递 归 性, 即 关 系 表 达 式 本 身 不 出 现 在 上 面 的 形 式 定 义 当 中, 所 以 不 会 出 现 多 个 关 系 算 符 连 在 一 起 的 情 形 例 8-11 X.NE. Y 关 系 表 达 式

131 X <=Y 关 系 表 达 式 X//Y 关 系 表 达 式 X+Y 加 法 表 达 式 也 是 关 系 表 达 式 -X 关 系 表 达 式 X / Y / Z 关 系 表 达 式 X**Y 幂 运 算 表 达 式 也 是 关 系 表 达 式.ABEL.G 自 定 义 一 元 表 达 式 也 是 关 系 表 达 式 G 单 独 的 基 元 也 可 以 构 成 关 系 表 达 式 8. 非 运 算 表 达 式 非 运 算 表 达 式 的 算 元 为.NOT., 是 一 元 算 符, 句 法 形 式 (R715) 为 : [.NOT. ] comparision-expression 注 意 非 运 算 表 达 式 的 定 义 不 具 有 递 归 性, 即 非 运 算 表 达 式 本 身 不 出 现 在 上 面 的 形 式 定 义 当 中, 所 以 不 会 出 现 多 个 算 符.NOT. 连 在 一 起 的 情 形 例 8-12.NOT. X X.NE. Y X <=Y X//Y X+Y X / Y / Z X**Y.ABEL.G G 非 运 算 表 达 式 关 系 表 达 式 也 是 非 运 算 表 达 式 非 运 算 表 达 式 非 运 算 表 达 式 加 法 表 达 式 也 是 非 运 算 表 达 式 非 运 算 表 达 式 幂 运 算 表 达 式 也 是 非 运 算 表 达 式 自 定 义 一 元 表 达 式 也 是 非 运 算 表 达 式 单 独 的 基 元 也 可 以 构 成 非 运 算 表 达 式 9. 与 运 算 表 达 式 与 运 算 表 达 式 的 算 元 为.AND., 是 二 元 算 符, 句 法 形 式 (R716) 为 : [conjunct-expression.not. ] not-expression 注 意 与 运 算 表 达 式 的 定 义 具 有 左 边 递 归 性, 即 与 运 算 表 达 式 本 身 出 现 在 上 面 的 形 式 定 义 当 中, 所 以 会 出 现 多 个 算 符.AND. 连 在 一 起 的 情 形, 这 时 的 优 先 顺 序 是 从 左 到 右 即 X.AND. Y.AND. Z 的 优 先 顺 序 是 (X.AND. Y).AND. Z 例 8-13 X.AND. Y 与 运 算 表 达 式 X. AND. Y.AND. Z 优 先 顺 序 是 从 左 到 右 的 与 运 算 表 达 式.NOT. X 非 运 算 表 达 式 也 是 与 运 算 表 达 式 X.NE. Y 关 系 表 达 式 也 是 与 运 算 表 达 式 X <=Y 与 运 算 表 达 式 X//Y 与 运 算 表 达 式 X+Y 加 法 表 达 式 也 是 与 运 算 表 达 式 X / Y / Z 与 运 算 表 达 式 X**Y 幂 运 算 表 达 式 也 是 与 运 算 表 达 式.ABEL.G 自 定 义 一 元 表 达 式 也 是 与 运 算 表 达 式

132 G 单 独 的 基 元 也 可 以 构 成 与 运 算 表 达 式 10. 或 运 算 表 达 式 或 运 算 表 达 式 的 算 元 为.OR., 是 二 元 算 符, 句 法 形 式 (R717) 为 : [disjunct-expression.or. ] conjunct -expression 注 意 或 运 算 表 达 式 的 定 义 具 有 左 边 递 归 性, 即 或 运 算 表 达 式 本 身 出 现 在 上 面 的 式 定 义 当 中, 所 以 会 出 现 多 个 算 符.OR. 连 在 一 起 的 情 形, 这 时 的 优 先 顺 序 是 从 左 到 右 即 X.OR. Y.OR. Z 的 优 先 顺 序 是 (X.OR. Y).OR. Z 例 8-14 X.OR. Y 或 运 算 表 达 式 X.OR. Y.OR. Z 优 先 顺 序 是 从 左 到 右 的 或 运 算 表 达 式 X.AND. Y 与 运 算 表 达 式 也 是 或 运 算 表 达 式.NOT. X 非 运 算 表 达 式 也 是 或 运 算 表 达 式 X.NE. Y 关 系 表 达 式 也 是 或 运 算 表 达 式 X <=Y 或 运 算 表 达 式 X//Y 或 运 算 表 达 式 X+Y 加 法 表 达 式 也 是 或 运 算 表 达 式 X / Y / Z 或 运 算 表 达 式 X**Y 幂 运 算 表 达 式 也 是 或 运 算 表 达 式.ABEL.G 自 定 义 一 元 表 达 式 也 是 或 运 算 表 达 式 G 单 独 的 基 元 也 可 以 构 成 或 运 算 表 达 式 11. 等 价 运 算 表 达 式 等 价 运 算 表 达 式 的 算 元 为.EQV. 或 者 是.NEQV., 是 二 元 算 符, 句 法 形 式 (R718) 为 : [equivalence-expression.eqv. ] disjunct -expression equivalence-expression.neqv. disjunct expression 注 意 等 价 运 算 表 达 式 的 定 义 具 有 左 边 递 归 性, 即 等 价 运 算 表 达 式 本 身 出 现 在 上 面 的 形 式 定 义 当 中, 所 以 会 出 现 多 个 算 符.EQV. 或 与.NEQV. 连 在 一 起 的 情 形, 这 时 的 优 先 顺 序 是 从 左 到 右 即 X.NEQV. Y.EQV. Z 的 优 先 顺 序 是 (X.NEQV. Y).EQV. Z 例 8-15 Y.EQV. Z 等 价 运 算 表 达 式 X.NEQV. Y 等 价 运 算 表 达 式 X.NEQV. Y.EQV. Z 优 先 顺 序 是 从 左 到 右 的 等 价 运 算 表 达 式 X.OR. Y 或 运 算 表 达 式 也 是 等 价 运 算 表 达 式 X.AND. Y 与 运 算 表 达 式 也 是 等 价 运 算 表 达 式.NOT. X 非 运 算 表 达 式 也 是 等 价 运 算 表 达 式 X.NE. Y 关 系 表 达 式 也 是 等 价 运 算 表 达 式 X <=Y 等 价 运 算 表 达 式 X//Y 等 价 运 算 表 达 式 X+Y 加 法 表 达 式 也 是 等 价 运 算 表 达 式 X / Y / Z 等 价 运 算 表 达 式 X**Y 幂 运 算 表 达 式 也 是 等 价 运 算 表 达 式.ABEL.G 自 定 义 一 元 表 达 式 也 是 等 价 运 算 表 达 式

133 G 单 独 的 基 元 也 可 以 构 成 等 价 运 算 表 达 式 12. 表 达 式 最 一 般 的 表 达 式 的 句 法 形 式 (R723) 为 : [ expression defined-operator ] equivalence-expression 注 意 表 达 式 (expression) 的 定 义 具 有 左 边 递 归 性, 即 表 达 式 本 身 出 现 在 上 面 的 形 式 定 义 当 中, 所 以 会 出 现 多 个 相 同 优 先 级 的 算 符 连 在 一 起 的 情 形, 这 时 的 优 先 顺 序 是 从 左 到 右 例 8-16 X.CROSS. Y 表 达 式 X.CROSS. Y.CROSS. Z 优 先 顺 序 是 从 左 到 右 的 表 达 式 Y.EQV. Z 等 价 运 算 表 达 式 也 是 表 达 式 X.NEQV. Y 等 价 运 算 表 达 式 也 是 表 达 式 X.NEQV. Y.EQV. Z 等 价 运 算 表 达 式 也 是 表 达 式 X.OR. Y 或 运 算 表 达 式 也 是 表 达 式 X.AND. Y 与 运 算 表 达 式 也 是 表 达 式.NOT. X 非 运 算 表 达 式 也 是 表 达 式 X.NE. Y 关 系 表 达 式 也 是 表 达 式 X <=Y 表 达 式 X//Y 表 达 式 X+Y 加 法 表 达 式 也 是 表 达 式 X / Y / Z 表 达 式 X**Y 幂 运 算 表 达 式 也 是 表 达 式.ABEL.G 自 定 义 一 元 表 达 式 也 是 表 达 式 G 单 独 的 基 元 也 可 以 构 成 表 达 式 13. 表 达 式 形 式 的 层 次 上 面 我 们 已 经 完 备 地 给 出 了 表 达 式 的 语 法 形 式, 可 以 明 显 地 看 到 从 最 简 单 的 表 达 式 到 更 为 复 杂 的 表 达 式, 具 有 一 种 层 次 结 构, 这 种 依 据 优 先 级 顺 序 给 出 的 层 次 结 构 是 我 们 构 造 复 杂 表 达 式 所 必 须 遵 循 的 规 则, 也 是 计 算 机 理 解 表 达 式 时 所 依 据 的 规 则 下 面 我 们 给 出 总 结 例 8-17 下 面 是 一 个 表 达 式 里 的 运 算 优 先 级 降 低 的 例 子 : X! 基 元.INVERSE. X! 自 定 义 一 元 运 算 X**Y! 幂 运 算 表 达 式 X*Y! 乘 法 运 算 表 达 式 -X! 加 法 运 算 表 达 式 X//Y! 连 接 运 算 表 达 式 X.EQ. Y! 比 较 运 算 表 达 式.NOT. X! 非 运 算 表 达 式 X.AND. Y! 并 运 算 表 达 式 X.OR. Y! 或 运 算 表 达 式 X.EQV. Y! 等 价 运 算 表 达 式 X.CROSS. Y! 一 般 表 达 式 下 表 8-2 给 出 各 种 一 般 形 式 的 表 达 式 的 运 算 优 先 级 :

134 表 8-2 一 般 形 式 的 表 达 式 的 运 算 优 先 级 优 先 级 向 下 递 降 的 运 算 项 运 算 的 定 义 优 先 级 基 元 自 定 义 一 元 运 算 表 达 式 常 量 常 量 子 对 象 变 量 数 组 构 造 器 函 数 引 用 ( 表 达 式 ) [ 自 定 义 算 符 ] 运 算 元 高 幂 运 算 表 达 式 自 定 义 一 元 运 算 表 达 式 [** 幂 运 算 表 达 式 ] 乘 法 运 算 表 达 式 加 法 运 算 表 达 式 连 接 运 算 表 达 式 [ 乘 法 运 算 表 达 式 *] 幂 运 算 表 达 式 乘 法 运 算 表 达 式 / 幂 运 算 表 达 式 [ 加 法 运 算 表 达 式 +] 乘 法 运 算 表 达 式 加 法 运 算 表 达 式 - 乘 法 运 算 表 达 式 + 加 法 运 算 表 达 式 - 加 法 运 算 表 达 式 [ 连 接 运 算 表 达 式 //] 加 法 运 算 表 达 式 比 较 运 算 表 达 式 [ 比 较 运 算 表 达 式 关 系 算 符 ] 比 较 运 算 表 达 式 非 运 算 表 达 式 [.NOT.] 比 较 运 算 表 达 式 并 运 算 表 达 式 [ 并 运 算 表 达 式.AND.] 非 运 算 表 达 式 或 运 算 表 达 式 [ 或 运 算 表 达 式.OR.] 并 运 算 表 达 式 等 价 运 算 表 达 式 [ 等 价 运 算 表 达 式.EQV.] 或 运 算 表 达 式 等 价 运 算 表 达 式.NEQV. 或 运 算 表 达 式 一 般 表 达 式 [ 表 达 式 自 定 义 算 符 ] 等 价 运 算 表 达 式 低 算 符 的 优 先 级 顺 序 下 表 8-3 给 出 各 类 算 符 在 同 样 的 优 先 级 的 情 形 下 的 运 算 优 先 级 顺 序 : 表 8-3 各 类 算 符 在 同 样 的 优 先 级 的 情 形 下 的 运 算 优 先 级 顺 序 算 符 类 型 算 符 同 优 先 级 下 的 运 算 顺 序 优 先 级 自 定 义 一 元 自 定 义 算 符 无 最 高 数 值 运 算 ** 右 到 左 数 值 运 算 * 或 / 左 到 右 数 值 运 算 一 元 算 符 + 或 - 无 数 值 运 算 二 元 算 符 + 或 - 左 到 右 字 符 运 算 // 左 到 右 关 系 运 算.EQ.,.NE.,.LT.,.LE.,.GT.,.GE., ==,/=,<,<=,>,>= 无

135 逻 辑 运 算.NOT. 无 逻 辑 运 算.AND. 左 到 右 逻 辑 运 算.OR. 左 到 右 逻 辑 运 算.EQV. 或.NEQV. 左 到 右 自 定 义 二 元 自 定 义 算 符 左 到 右 最 低 自 定 义 一 元 算 符 在 所 有 算 符 与 所 有 同 优 先 级 算 符 当 中, 具 有 最 高 的 优 先 级 而 自 定 义 二 元 算 符 在 所 有 算 符 与 所 有 同 优 先 级 算 符 当 中, 具 有 最 低 的 优 先 级 表 中 的 无 表 示 该 算 符 不 会 连 续 出 现, 可 以 看 到 具 有 这 个 特 点 的 是 自 定 义 一 元 算 符, 关 系 算 符, 和 逻 辑 非 算 符, 它 们 的 优 先 级 顺 序 只 能 使 用 括 号 来 说 明 固 有 运 算 固 有 运 算 的 完 整 含 义 是, 除 了 算 符 是 属 于 固 有 算 符, 因 此 可 以 直 接 使 用 相 应 符 号 而 不 需 要 预 先 说 明 之 外, 算 符 所 作 用 的 算 元 也 必 须 属 于 固 有 数 据 类 型 不 同 的 算 符 所 能 够 作 用 的 算 元 类 型 是 不 同 的 下 表 8-4 给 出 了 不 同 的 算 符 所 能 够 作 用 的 算 元 类 型 : 表 8-4 不 同 的 算 符 所 能 够 作 用 的 算 元 类 型 固 有 算 符 算 元 1 的 类 型 算 元 2 的 类 型 计 算 结 果 的 类 型 一 元 算 符 +,- I,R,Z I,R,Z 二 元 算 符 +,-,*,/,** I I,R,Z I,R, Z R I,R,Z R,R,Z Z I,R,Z Z,Z,Z 串 联 算 符 // C C C.EQ.,.NE., I I,R,Z L,L,L ==,/= R I,R,Z L,L,L Z I,R,Z L,L,L C C L.L T.,.LE.,.GT.,.GE., I I,R L,L = =,/=,<,<=,>,>= R I,R L,L C C L.NOT. L L.AND.,.OR.,.EQV.,NEQV. L L L 表 中 I 表 示 整 型,R 表 示 实 型,Z 表 示 复 型,C 表 示 字 符 型,L 表 示 逻 辑 型 自 定 义 运 算 自 定 义 运 算 的 完 整 含 义 是 : 如 果 算 符 形 式 上 是 固 有 算 符, 那 么 它 的 算 元 必 定 不 属 于 表 8-3 里 面 所 规 定 的 类 型 ;

136 所 含 有 的 算 符 为 自 定 义 算 符 自 定 义 运 算 的 一 般 句 法 形 式 (R703,R723) 为 : intrinsic-unary-operator y defined-operator y x intrinsic-binary-operator y x defined-operator y 其 中 自 定 义 算 符 (defined-operator) 需 要 在 一 个 具 有 通 用 标 识 符 OPERATOR 的 界 面 块 里 用 一 个 函 数 子 程 序 来 加 以 单 独 的 解 释 与 计 算 如 果 自 定 义 运 算 使 用 了 固 有 算 符 的 符 号, 意 味 着 扩 展 了 其 中 固 有 算 符 所 作 用 的 算 元 的 类 型 范 围, 它 的 通 用 性 需 要 在 界 面 块 里 说 明 如 果 自 定 义 运 算 使 用 了 自 定 义 算 符, 那 么 该 自 定 义 运 算 被 称 为 扩 展 运 算, 所 使 用 的 自 定 义 算 符 称 为 扩 展 算 符 表 达 式 的 数 据 类 型, 种 别 参 数 和 形 状 作 为 表 达 式 的 计 算 结 果, 可 以 说 表 达 式 终 究 是 有 它 的 数 据 类 型, 种 别 参 数, 以 及 形 状 这 些 数 据 对 象 所 具 有 的 属 性, 那 么 表 达 式 的 这 些 属 性 终 究 是 由 它 的 基 元 的 数 据 属 性 决 定 的 由 基 元 的 数 据 属 性 最 终 得 到 表 达 式 的 数 据 属 性, 这 中 间 需 要 完 成 全 部 的 运 算, 每 经 过 一 次 运 算, 结 果 的 数 据 属 性 都 可 能 随 着 新 的 算 元 的 加 入 而 发 生 改 变, 唯 一 可 以 确 认 的 是 运 算 的 顺 序, 是 严 格 按 照 算 符 的 优 先 级 顺 序 进 行 的, 鉴 于 基 元 本 身 的 可 能 的 数 据 属 性 的 多 样 化, 下 面 分 小 节 讨 论 表 达 式 的 的 数 据 属 性 1. 基 元 的 数 据 类 型 以 及 种 别 参 数 基 元 的 数 据 属 性 如 果 已 经 直 截 了 当 地 在 声 明 语 句 当 中 给 予 了 说 明, 那 就 不 是 我 们 在 这 里 讨 论 的 中 心 例 8-18 INTEGER I(100,20) REAL (8.5,6,4.4) 它 们 的 数 据 属 性 已 经 显 式 地 给 出 下 面 我 们 要 讨 论 的 基 元 类 型 是 : 指 针 ; 数 组 构 造 器 ; 结 构 构 造 器 ; 函 数 指 针 变 量 的 类 型, 种 别 参 数 和 秩 都 会 在 指 针 变 量 的 声 明 语 句 当 中 予 以 说 明 但 是 当 指 针 为 待 定 形 数 组 时, 它 的 形 状 就 是 由 它 的 目 标 来 决 定 例 8-19 INTEGER,POINTER::X(:,:) INTEGER,TARGET::Y(100,200) 其 中 X 的 形 状 就 是 由 Y 决 定 的, 即 (100, 200)

137 如 果 对 指 针 使 用 固 有 函 数 NULL, 那 么 它 会 返 回 一 个 非 关 联 指 针, 而 非 关 联 指 针 没 有 形 状, 但 是 有 秩 当 NULL() 不 带 变 量 时, 固 有 函 数 NULL 返 回 的 结 果 的 类 型, 种 别 和 秩 由 与 结 果 关 联 的 指 针 决 定, 跟 NULL 出 现 的 场 合 有 关, 详 见 下 表 8-5: 表 8-5 固 有 函 数 NULL 返 回 的 结 果 N ULL() 出 现 的 场 合 指 针 赋 值 语 句 的 右 边 声 明 语 句 当 中 一 个 对 象 的 初 始 化 一 个 成 员 的 默 认 初 始 化 结 构 构 造 器 实 元 DATA 语 句 决 定 结 果 的 类 型, 种 别 参 数 和 秩 的 对 象 左 边 的 对 象 该 对 象 该 成 员 相 应 的 成 员 相 应 的 哑 元 相 应 的 对 象 例 8-20 下 面 是 NULL 后 接 变 量 的 例 子 : INTERFACE ADD SUBROUTING S1(J,PI) INTEGER J INTEGER,POINTER::PI END SUBROUTING S1 SUBROUTING S2(K,PR) INTEGER K REAL,POINTER::PR END SUBROUTING S2 END INTERFACE REAL,POINTER::REAL_KER CALL ADD(10, NULL(REAL_KER)) 数 组 构 造 器 的 类 型, 种 别 和 形 状 由 构 造 器 的 形 式 决 定 它 的 秩 为 1, 而 尺 度 等 于 其 中 元 素 的 个 数, 它 的 类 型 和 种 别 与 其 中 任 意 一 个 元 素 的 一 致, 因 为 它 的 所 有 元 素 的 类 型 和 种 别 都 必 定 是 相 同 的 例 8-21 给 出 一 个 构 造 器 : (/2.4_2, 5.9_1, 9.4_1, 6.4_1) 为 实 型, 种 别 参 数 为 2, 尺 度 为 4. 结 构 构 造 器 的 类 型 就 是 派 生 类 型 的 类 型 名 称, 一 个 结 构 构 造 器 总 是 标 量, 而 结 构 不 具 有 种 别 参 数 例 8-22 给 出 下 面 的 结 构 构 造 器 : SAMPLE(5.0, ALPHA )

138 它 的 类 型 就 是 SAMPLE. 函 数 的 类 型, 种 别 和 形 状 的 决 定 有 以 下 几 种 情 形 : 在 引 用 函 数 的 程 序 单 位 里 对 函 数 进 行 了 隐 式 声 明 ; 在 引 用 函 数 的 程 序 单 位 里 对 函 数 进 行 了 显 式 声 明 ; 函 数 具 有 显 式 界 面 ( 如 果 界 面 不 是 显 式 的, 那 么 函 数 或 者 是 外 部 函 数, 或 者 是 语 句 函 数 ) 如 果 界 面 是 显 式 的, 属 性 的 决 定 有 如 下 几 种 情 形 : 引 用 函 数 的 程 序 单 位 里 的 界 面 块 里, 有 对 函 数 的 类 型 声 明 以 及 其 他 说 明 语 句 ; 对 内 部 过 程 或 模 块 过 程 的 类 型 声 明 以 及 其 他 说 明 语 句 说 明 了 函 数 ; 被 引 用 的 特 定 的 固 有 函 数 的 描 述 注 意, 由 于 固 有 函 数 和 带 界 面 块 的 函 数 可 能 是 通 用 的, 因 此 它 们 的 属 性 由 特 定 函 数 引 用 的 实 元 决 定 例 8-23 REAL FUNCTION FUN(A) DIMENSION FUN(20,50) 上 面 的 语 句 是 给 出 了 内 部 函 数 FUN 的 程 序 单 位 的 一 部 分, 那 么 要 引 用 函 数 FUN(8.1), 它 的 类 型 就 是 默 认 实 型, 形 状 为 (20,50) 例 8-24 REAL(DOUBLE)A(30,50) COS(A) 函 数 COS 的 界 面 在 固 有 函 数 COS 的 定 义 里 给 出, 这 里 引 用 的 函 数 COS(A) 为 双 精 度 实 型, 形 状 为 (30,50) 当 函 数 是 外 部 函 数 或 为 语 句 函 数 时, 界 面 就 是 隐 式 的, 这 时 形 状 总 是 标 量, 而 其 他 属 性 则 由 默 认 隐 式 类 型 声 明 所 规 定, 或 者 是 由 语 句 函 数 的 显 式 声 明 决 定 例 8-25 IMPLICIT REAL ( SINGLE)(A) FUN(X) 其 中 的 FUN(X) 就 是 一 个 单 精 度 实 型 标 量 如 果 变 量 或 函 数 是 属 于 待 定 形 或 哑 形 数 组, 会 有 以 下 几 种 情 形 : 对 于 待 定 形 数 组, 它 的 秩 已 经 被 声 明, 但 是 它 的 每 个 维 度 的 尺 度 需 要 在 运 行 ALLOCATE 语 句 或 指 针 赋 值 语 句 之 后 才 能 确 定 对 于 哑 形 数 组, 它 的 秩 已 经 被 声 明, 但 是 它 的 形 状 需 要 子 程 序 运 行 之 后 给 出 对 于 指 针 来 说, 则 需 要 由 被 关 联 到 指 针 的 目 标 来 确 定 形 状 因 此 一 般 说 来 待 定 形 或 哑 形 数 组, 只 能 在 运 行 时 间 才 能 确 定 形 状 2. 运 算 结 果 的 类 型 与 种 别 参 数 对 固 有 类 型 算 元 进 行 固 有 算 符 的 运 算 的 结 果 的 类 型, 已 经 在 表 8-3 给 出, 因 此 现 在 只 需 要 讨 论 决 定 种 别 参 数 的 规 则 运 算 分 为 两 类 :

139 非 数 值 运 算 数 值 运 算 对 于 非 数 值 运 算 有 如 下 情 形 : 固 有 关 系 运 算 : 种 别 参 数 为 默 认 逻 辑 型 固 有 逻 辑 运 算 : 如 果 算 元 具 有 相 同 的 种 别 参 数, 则 结 果 与 之 保 持 一 致 ; 如 果 算 元 具 有 不 同 的 种 别 参 数, 则 由 编 译 器 决 定 固 有 字 符 运 算 : 算 元 与 结 果 的 种 别 参 数 必 定 保 持 一 致, 长 度 参 数 则 是 两 个 算 元 的 长 度 的 和 对 于 数 值 运 算, 有 如 下 情 形 : 一 元 运 算 : 保 持 算 元 的 种 别 参 数 不 变 二 元 运 算 : 两 个 算 元 如 果 是 不 同 数 据 类 型, 则 按 照 表 8-3 决 定 ; 两 个 算 元 如 果 是 相 同 数 据 类 型 与 种 别 参 数, 则 结 果 保 持 不 变 ; 如 果 两 个 算 元 都 是 整 型, 种 别 参 数 不 同, 那 么 结 果 取 幂 次 范 围 大 的, 如 果 幂 次 范 围 一 样 大, 则 由 编 译 器 决 定 ; 如 果 两 个 算 元 都 是 实 型 或 复 型, 种 别 参 数 不 同, 那 么 结 果 取 精 度 大 的, 如 果 精 度 一 样 大, 则 由 编 译 器 决 定 对 于 二 元 数 值 运 算, 基 本 的 规 则 可 以 理 解 为 : 如 果 把 从 整 数 到 最 高 精 度 的 复 数 按 照 集 合 包 含 关 系 排 列 起 来, 那 么 只 要 两 个 算 元 的 种 别 参 数 不 同, 结 果 总 是 取 所 属 集 合 更 大 的 算 元 的 种 别 参 数 上 面 讨 论 的 是 针 对 固 有 类 型 数 据 的 固 有 运 算, 对 于 自 定 义 运 算, 结 果 的 类 型 以 及 种 别 参 数 由 被 引 用 的 运 算 的 界 面 块 给 出, 也 即 在 界 面 块 里 说 明 的 作 为 自 定 义 运 算 的 函 数 名 的 类 型 以 及 种 别 参 数 例 8-26 INTERFACE OPERATOR(.PLUS.) TYPE(SET)FCN_ SET_PLUS(X, Y) TYPE(SET), INTENT(IN)::X,Y END FUNCTION FCN_SET_PLUS TYPE(ADD) FCN_SET_PLUS(X, Y) TYPE(ADD), INTENT(IN)::X,Y END FUNCTION FCN_SET_PLUS END INTERFACE 在 得 到 上 面 的 算 符 定 义 之 后, 如 果 取 类 型 SET 的 对 象 A 和 B, 那 么 表 达 式 A.PLUS.B 的 类 型 也 为 SET, 无 种 别 参 数 ; 如 果 取 类 型 ADD 的 对 象 A 和 B, 那 么 表 达 式 A.PLUS.B 的 类 型 也 为 ADD, 无 种 别 参 数 3. 表 达 式 的 形 状 表 达 式 形 状 的 决 定 同 样 是 从 基 元 开 始, 按 照 算 符 的 优 先 级 顺 序, 逐 步 从 底 层 到 高 层 而 决 定 的 但 是 形 状 的 决 定 比 类 型 与 种 别 参 数 的 决 定 要 简 单, 因 为 二 元 运 算 的 2 个 算 元 的 形 状 要 求 具 有 一 定 的 关 系 : 二 元 固 有 运 算 的 2 个 算 元 必 须 保 证 形 状 的 一 致 性, 也 就 是 两 个 算 元 或 者 是 相 同 形 状 的 数 组, 或 者 至 少 有 一 个 算 元 是 标 量

140 对 于 二 元 自 定 义 运 算, 则 2 个 算 元 或 者 与 定 义 的 函 数 的 相 应 哑 元 保 持 一 致, 或 者 相 互 也 保 持 一 致 其 结 果 的 形 状 自 然 也 保 持 不 变 因 此 结 果 的 形 状 的 决 定 也 就 相 应 比 较 简 单 了 一 元 运 算 不 改 变 算 元 的 形 状 如 果 基 元 是 常 量, 变 量, 构 造 器, 或 函 数, 则 结 果 的 形 状 分 别 就 是 常 量, 变 量, 构 造 器, 或 函 数 名 称 如 果 基 元 是 对 固 有 函 数 NULL 的 引 用, 那 么 结 果 的 形 状 就 与 基 元 无 关 而 由 被 关 联 到 结 果 的 指 针 决 定 结 构 构 造 器 总 是 标 量 数 组 构 造 器 总 是 秩 为 1, 尺 度 等 于 元 素 数 目 的 数 组 二 元 固 有 运 算 的 算 元 只 要 有 一 个 是 数 组, 结 果 就 是 相 应 的 数 组, 否 则 就 是 标 量 对 于 自 定 义 运 算 来 说, 如 果 算 元 的 形 状 与 哑 元 保 持 一 致, 结 果 的 形 状 就 是 定 义 运 算 的 函 数 名 称, 或 者 如 果 定 义 的 函 数 是 基 元 性 的, 则 结 果 的 形 状 就 是 数 组 算 元 的 形 状 例 8-27 INTERFACE OPERATOR(//) FUNCTION FCN_CONCAT(A,B) CHARACTER (*,1) A CHARACTER (*,2) B CHARACTER (LEN(A)+LEN(B),2) FCN_CONCAT (SIZE(B)) END FUNCTION FCN_CONCAT END INTERFACE 设 X 是 种 别 参 数 为 1, 长 度 为 30 的 字 符 型 标 量,Y 是 种 别 参 数 为 2, 长 度 为 50 的 字 符 型 数 组, 其 形 状 为 (25) 那 么 考 虑 X//Y 的 属 性 : 由 于 算 符 // 的 界 面 里 的 FCN_CONCAT 的 类 型 声 明 就 决 定 了 表 达 式 X//Y 的 结 果 为 种 别 参 数 2 的 字 符 型, 结 果 的 长 度 为 2 个 算 元 的 长 度 之 和, 即 80, 结 果 的 形 状 是 秩 为 1, 而 尺 度 等 于 相 应 于 哑 元 B 的 实 元 Y 的 尺 度, 也 就 是 形 状 为 (25) 4. 表 达 式 的 宽 度 在 大 多 数 情 形 下, 数 组 表 达 式 的 宽 度 并 不 需 要 特 别 的 考 虑, 因 为 一 致 性 的 要 求 只 涉 及 到 每 个 维 度 的 尺 度 不 过 如 果 数 组 表 达 式 是 固 有 函 数 LBOUND 和 UBOUND 的 ARRAY 变 量 的, 数 组 表 达 式 的 宽 度 就 需 要 加 以 考 虑 了 固 有 函 数 LBOUND 和 UBOUND 含 有 两 个 关 键 词 变 量 : ARRAY, 为 数 组 表 达 式 可 选 的 DIM, 为 整 型 表 达 式 如 果 变 量 DIM 给 出 的 话, 那 么 函 数 LBOUND 和 UBOUND 就 分 别 返 回 由 变 量 DIM 决 定 的 维 度 的 下 界 与 上 界 如 果 变 量 DIM 不 给 出 的 话, 那 么 函 数 LBOUND 和 UBOUND 就 分 别 返 回 由 变 量 ARRAY 决 定 的 所 有 维 度 的 下 界 与 上 界 组 成 的 秩 为 1 的 数 组

141 8.2.9 特 殊 表 达 式 表 达 式 除 了 用 于 赋 值 语 句 之 外, 还 可 能 出 现 在 许 多 特 殊 的 场 合, 在 那 些 特 殊 场 合 里 的 表 达 式 是 受 到 了 各 种 限 制 的, 比 如 : 出 现 在 PARAMETER 语 句 当 中 的 表 达 式 就 被 限 制 为 常 量 表 达 式, 起 到 初 始 化 的 作 用 这 类 表 达 式 称 为 常 量 表 达 式 ; 在 许 多 说 明 语 句 当 中, 充 当 数 组 界 或 者 是 字 符 长 度 值 的 也 可 能 是 一 些 整 型 表 达 式, 它 们 在 程 序 单 位 运 行 的 时 候, 就 会 执 行 计 算 过 程, 给 出 数 组 界 的 值 或 字 符 长 度 值 这 类 表 达 式 称 为 说 明 表 达 式 本 节 我 们 就 是 分 小 节 讨 论 这 2 类 特 殊 的 表 达 式 的 特 殊 用 途 1. 常 量 表 达 式 常 量 表 达 式 就 是 扩 展 常 量 或 扩 展 常 量 通 过 固 有 算 符 构 成 的 表 达 式 所 谓 扩 展 常 量 的 含 义 有 如 下 几 种 情 形 : 字 面 常 量, 命 名 常 量, 常 量 子 对 象, 其 中 子 对 象 的 每 个 下 标, 或 片 断 下 标, 或 子 串 范 围 的 始 点 与 终 点 都 是 常 量 表 达 式 一 个 数 组 构 造 器, 它 的 每 个 子 表 达 式 的 基 元 都 是 常 量 表 达 式, 或 者 是 数 组 构 造 器 的 隐 式 do 变 量 每 个 成 员 都 是 常 量 表 达 式 的 结 构 构 造 器 在 汇 编 时 被 计 算 的 固 有 函 数 引 用 括 号 里 的 常 量 表 达 式 要 求 固 有 函 数 引 用 在 汇 编 时 被 计 算, 就 排 除 了 使 用 固 有 函 数 PRESENT,ASSOCIATED 和 ALLOCATED, 并 且 要 求 函 数 引 用 的 每 个 变 量 都 是 常 量, 或 者 至 少 在 编 译 时, 变 量 的 种 别 参 数 与 界 已 知 例 如 在 所 有 维 度 具 有 显 式 界 的 数 组 A, 对 于 A 的 查 询 函 数 SIZE(A) 在 编 译 时 是 可 以 计 算 的, 那 么 SIZ E(A)*3 就 是 一 个 常 量 表 达 式, 可 以 作 为 扩 展 常 量 这 样 一 个 限 制 就 排 除 了 属 于 待 定 形 数 组, 哑 尺 度 数 组, 指 针 数 组 和 可 分 配 数 组 这 类 对 象 的 变 量 有 了 以 上 限 制 之 后, 常 量 表 达 式 就 可 以 应 用 于 任 何 可 执 行 语 句, 而 普 通 表 达 式 是 不 能 出 现 在 任 何 可 执 行 语 句 当 中 的 例 8-28 下 面 是 常 量 表 达 式 的 合 法 例 子 : 实 型 字 面 常 量 45 整 型 字 面 常 量 -5.0_QUAD 实 型 字 面 常 量, 其 中 QUAD 为 命 名 整 型 常 量 5_SHORT 整 型 字 面 常 量, 其 中 SHORT 为 命 名 整 型 常 量 (/(K,K=0,100),50) 数 组 构 造 器 BESSEL1(3.1, J) 结 构 构 造 器, 其 中 BESSEL 为 派 生 类 型,J 为 命 名 整 型 常 量 UBOUND(X,1)-10 固 有 查 询 函 数 的 引 用,X 为 显 形 数 组 COS(X) 固 有 函 数, 其 中 X 为 命 名 常 量 KIND(X) 固 有 函 数, 其 中 X 为 具 有 已 知 种 别 参 数 的 实 型 变 量 REAL(K-2) 固 有 函 数, 其 中 K 为 命 名 整 型 常 量 COUNT(X) 固 有 函 数, 其 中 X 为 命 名 逻 辑 型 常 量 SIN(3.3) 固 有 函 数

142 SUM(X) 3*I+J**4/2.5 固 有 变 换 函 数, 其 中 X 为 命 名 整 型 数 组 常 量 数 值 表 达 式, 其 中 I,J 为 命 名 整 型 常 量 2. 初 始 化 表 达 式 所 谓 初 始 化 表 达 式 是 具 有 如 下 限 制 的 常 量 表 达 式 : 幂 函 数 的 幂 次 只 能 是 整 数 下 标, 片 断 下 标, 子 串 范 围 的 始 点 与 终 点, 结 构 构 造 器 的 成 员, 以 及 固 有 函 数 的 变 量 都 必 须 是 初 始 化 表 达 式 数 组 构 造 器 的 元 素 都 必 须 是 初 始 化 表 达 式, 或 者 是 隐 式 do 对 象, 其 中 数 组 构 造 器 值 和 隐 式 do 参 数 是 基 元 为 初 始 化 表 达 式 或 隐 式 do 变 量 的 表 达 式 初 始 化 表 达 式 里 的 基 本 固 有 函 数 必 须 包 含 整 型 或 字 符 型 变 量, 并 且 必 须 返 回 整 型 或 字 符 型 结 果 初 始 化 表 达 式 里 的 固 有 变 换 函 数 必 须 是 如 下 几 种 固 有 变 换 函 数 之 一 : NULL,REPEAT,RESHAPE, SELECTED_INT_KIND,SELECTED_REAL_KIND,TRANSFER, TRIM 其 中 除 了 NULL 之 外, 它 们 的 变 量 都 必 须 是 初 始 化 表 达 式 这 样 实 际 上 就 是 排 除 了 以 下 的 变 换 函 数 : ALL,ANY,COUNT,CSHIFT, DOT_PRODUCT,EOSHIFT,MATMUL,MAXLOC, MAXVAL,MINLOC,MINVAL,PACK,PRODUCT,SPREAD,SUM,TRANSPOSE, UNPACK 初 始 化 表 达 式 不 能 通 过 ALLOCATE 语 句 给 出, 也 不 能 通 过 指 针 赋 值 给 出 允 许 使 用 固 有 查 询 函 数, 除 非 它 的 变 量 或 者 是 初 始 化 表 达 式 或 者 变 量 的 种 别 与 界 不 能 够 通 过 查 询 获 得 括 号 里 的 任 意 子 表 达 式 都 必 须 是 初 始 化 表 达 式 在 节 里 的 常 量 表 达 式 例 子 里 面, 除 了 最 后 5 个 例 子 外, 其 他 都 是 初 始 化 表 达 式 最 后 5 个 例 子 之 所 以 不 是 初 始 化 表 达 式, 是 因 为 初 始 化 表 达 式 不 允 许 包 含 返 回 实 型 结 果 的 函 数, 不 允 许 引 用 某 些 特 定 的 变 换 函 数, 也 不 允 许 幂 运 算 的 幂 次 是 非 整 数 例 8-29 下 面 是 初 始 化 表 达 式 的 其 他 形 式 的 例 子 : SIZE(2,X)+10 整 型 表 达 式, 其 中 X 为 显 形 数 组 KIND(5.0E+01) 变 量 为 常 量 的 查 询 函 数 SELECTED_REAL_KIND(33,100) 变 量 为 常 量 的 查 询 函 数 SELECTED_INT_KIND(10**K) 变 量 为 初 始 化 表 达 式 的 查 询 函 数, 其 中 K 为 预 先 声 明 过 的 整 型 常 量 初 始 化 表 达 式 使 用 在 如 下 场 合 : 在 PARAMETER 语 句 或 者 附 加 了 PARAMETER 属 性 的 类 型 声 明 语 句 当 中, 作 为 初 始 值 跟 在 等 号 的 后 面 在 类 型 声 明 语 句 里, 作 为 某 项 的 初 始 值 跟 在 等 号 的 后 面 在 DATA 语 句 的 取 值 列 表 里 作 为 结 构 构 造 器 的 表 达 式 在 类 型 声 明 语 句 当 中, 作 为 种 别 参 数 值, 这 时 它 必 须 取 整 型 标 量 作 为 如 下 固 有 转 换 函 数 的 KIND 哑 元 的 实 元 : AINT,ANINT,CHAR,CMPLX,INT,LOGICAL,NINT,REAL

143 这 时 它 也 必 须 取 整 型 标 量 在 CASE 语 句 当 中 作 为 情 形 值, 这 时 它 必 须 为 整 型, 逻 辑 型 或 字 符 型 标 量 在 EQUIVALENCE 语 句 当 中, 作 为 等 价 对 象 的 下 标 或 子 串 范 围 表 达 式, 这 时 它 必 须 取 整 型 标 量 初 始 化 表 达 式 必 须 用 于 在 编 译 时 必 须 获 得 表 达 式 的 值 的 场 合 初 始 化 表 达 式 不 能 包 含 返 回 实 型, 复 型 以 及 逻 辑 型 的 结 果 的 固 有 函 数, 也 不 能 包 含 实 型, 复 型 以 及 逻 辑 型 的 变 量 3. 说 明 表 达 式 首 先 我 们 给 出 限 制 表 达 式 的 定 义 作 为 一 种 说 明, 一 个 限 制 表 达 式 就 是 它 的 每 个 算 符 都 是 固 有 的 或 者 是 由 纯 粹 函 数 定 义 的 自 定 义 算 符, 而 每 个 基 元 都 是 如 下 类 型 之 一 : 常 量 或 常 量 子 对 象 作 为 哑 元 的 变 量 在 公 用 块 里 的 变 量 可 从 模 块 访 问 的 变 量 来 自 主 程 序 的 变 量 一 个 数 组 构 造 器, 它 的 每 个 表 达 式 的 基 元 都 是 限 制 表 达 式 或 者 是 数 组 构 造 器 的 隐 式 do 变 量 每 个 成 员 都 是 限 制 表 达 式 的 结 构 构 造 器 一 个 基 本 固 有 函 数, 它 的 结 果 为 整 型 或 字 符 型, 它 的 变 量 是 任 意 整 型 或 字 符 型 的 限 制 表 达 式 初 始 化 表 达 式 里 的 固 有 变 换 函 数 必 须 是 如 下 几 种 固 有 变 换 函 数 之 一 : NULL,REPEAT,RESHAPE, SELECTED_INT_KIND,SELECTED_REAL_KIND,TRANSFER, TRIM 其 中 除 了 NULL 之 外, 它 们 的 变 量 都 必 须 是 初 始 化 表 达 式 这 样 实 际 上 就 是 排 除 了 以 下 的 变 换 函 数 : ALL,ANY,COUNT,CSHIFT,DOT_PRODUCT,EOSHIFT,MATMUL,MAXLOC, MAXVAL,MINLOC,MINVAL,PACK,PRODUCT,SPREAD,SUM,TRANSPOSE, UNPACK 自 定 义 的 纯 粹 函 数 除 了 PRESENT,ALLOCATED,ASSOCIATED 之 外 的 固 有 查 询 函 数, 并 且 它 的 变 量 必 须 是 : 限 制 表 达 式 ; 不 能 查 询 种 别 参 数 与 界 的 变 量, 不 能 由 ALLOCATE 语 句 定 义, 也 不 能 由 指 针 赋 值 语 句 定 义 这 样 任 何 下 标, 片 断 下 标, 以 及 子 串 范 围 的 始 点 和 终 点 都 是 限 制 表 达 式 所 谓 说 明 表 达 式 就 是 一 个 限 制 表 达 式, 同 时 它 必 须 取 整 型 标 量 值 之 所 以 称 为 说 明 表 达 式, 就 是 因 为 说 明 表 达 式 用 于 在 类 型 声 明, 属 性 说 明, 维 度 声 明 以 及 其 他 说 明 性 语 句 当 中, 表 示 数 组 的 界, 或 者 字 符 型 对 象 的 长 度 参 数 值

144 4. 声 明 语 句 中 的 初 始 化 表 达 式 和 说 明 表 达 式 在 说 明 性 语 句 当 中 使 用 初 始 化 表 达 式 和 说 明 表 达 式 的 规 则 如 下 : 在 这 些 表 达 式 里 的 变 量 或 命 名 常 量 的 类 型 和 种 别 参 数, 都 必 须 在 同 一 个 作 用 域 范 围 内, 或 者 是 主 作 用 域 单 位 里, 或 者 是 在 一 个 可 以 访 问 当 前 作 用 域 单 位 的 模 块 作 用 域 单 位 里, 预 先 加 以 说 明, 或 者 是 通 过 隐 式 默 认 规 则 得 到 说 明 如 果 这 些 变 量 和 常 量 在 随 后 的 显 式 类 型 声 明 里 得 到 属 性 说 明, 则 必 须 与 当 前 的 属 性 保 持 一 致 如 果 表 达 式 里 引 用 了 一 个 数 组 的 元 素, 那 么 该 数 组 的 界 必 须 预 先 得 到 说 明 如 果 说 明 表 达 式 同 时 包 含 了 一 个 变 量 与 它 的 值, 那 么 该 表 达 式 必 须 出 现 在 子 程 序 的 说 明 部 分, 而 不 能 出 现 在 主 程 序 里 例 8-30 考 虑 下 面 程 序 片 断 里 的 变 量 I: INTEGER I COMMON I REAL X(I) I 的 值 用 来 决 定 数 组 X 的 尺 度, 那 么 这 个 程 序 片 断 就 不 能 出 现 在 主 程 序, 而 只 能 出 现 在 一 个 子 程 序 的 说 明 部 分 所 谓 预 先 说 明, 也 可 以 是 指 在 同 一 个 说 明 语 句 当 中, 但 必 须 是 出 现 在 引 用 的 左 边 例 8-31 下 面 的 说 明 是 有 效 的 : INTEGER,DIMENSION(4),PARAMETER::X=(/5,7,2,9/) REAL,DIMENSION(X(2)) ::Y,Z(SIZE(Y)) 由 于 常 量 数 组 X 的 第 二 个 元 素 为 7, 因 此 Y,Z 的 尺 度 都 是 7 例 8-32 类 似 的 以 下 声 明 却 是 无 效 的 : REAL,DIMENSION(X(2))::Z(SIZE(Y)),Y! 无 效 声 明! 因 为 SIZE(Y) 在 Y 之 前 出 现 了 例 8-33 这 个 例 子 使 用 了 说 明 表 达 式 来 声 明 一 个 带 有 相 同 形 状 的 哑 元 数 组 的 工 作 数 组 : SUBROUTING X(A) REAL::A(:,:) REAL::WORK(SIZE(A,DIM=1),SIZE(A,DIM=2)) END SUBROUTING X 在 FORTRAN 95 标 准 里 面, 纯 粹 用 户 定 义 函 数 可 以 用 于 计 算 界, 然 后 这 些 函 数 还 可 以 用 于 其 他 声 明 语 句 当 中 例 8-34 SUBROUTING S(A) IMPLICIT NONE REAL::A(:,:) REAL::TAMP(RN(A),CN(A)) REAL::TTAMP(CN(A),RN(A)) CONTAINS

145 PURE FUNCTION RN(X) INTEGER::RN REAL,INTENT(IN)::X(:,:) RN=SIZE(X,DIM=1) END FUNCTION RN PURE FUNCTION CN(X) INTEGER::CN REAL,INTENT(IN)::X(:,:) CN=SIZE(X,DIM=2) END FUNCTION CN END SUBROUTING S 5. 各 种 表 达 式 的 应 用 本 小 节, 我 们 总 结 一 下 前 面 所 讨 论 的 各 种 表 达 式 上 面 所 讨 论 的 一 般 表 达 式, 限 制 表 达 式, 说 明 表 达 式, 常 量 表 达 式, 以 及 初 始 化 表 达 式 相 互 之 间 具 有 一 定 的 包 含 关 系, 下 面 的 图 8-1 给 出 了 它 们 的 集 合 包 含 关 系 的 示 意 图 : 图 8-1 各 种 表 达 式 集 合 之 间 的 关 系 图 对 于 初 始 化 表 达 式 与 说 明 表 达 式 的 异 同 由 下 表 8-6 给 出 : 表 8-6 初 始 化 表 达 式 与 说 明 表 达 式 的 异 同 性 质 初 始 化 表 达 说 明 表 达 式 式 字 符 型 结 果 有 无 * 整 型 结 果 有 有 标 量 结 果 有 有 数 组 结 果 有 无 作 为 基 元 的 变 量 ( 限 于 哑 元, 公 用 对 象, 主 对 象, 模 块 对 象 ) 有

146 作 为 基 元 的 整 型 与 字 符 型 基 本 固 有 函 数 有 有 * 作 为 基 元 的 整 型 与 字 符 型 的 基 本 的 与 纯 粹 自 定 义 的 函 数 无 有 * 作 为 基 元 的 实 型, 复 型, 逻 辑 型 与 派 生 类 型 的 基 本 固 有 函 数 无 无 作 为 基 元 的 实 型, 复 型, 逻 辑 型 与 派 生 类 型 的 基 本 的 与 纯 粹 自 定 义 的 函 数 无 无 基 元 只 是 常 量 有 无 下 标, 步 长, 字 符 长 度 都 是 常 量 有 无 以 下 固 有 变 换 函 数 可 以 作 基 元 : REPEAT,RESHAPE, SELECTED_INT_KIND,SELECTED_REAL_KIND,TRANSFER, TRIM 查 询 函 数 可 以 作 基 元 ( 不 包 括 ALLOCATE,ASSOCIAT ED, PRESENT) * 字 符 型 的 表 达 式 结 果 如 果 是 某 些 固 有 函 数 的 变 量, 则 是 许 可 的 下 表 8-7 总 结 了 表 达 式 的 种 类 和 它 们 各 自 的 用 途 : 有 有 有 有 表 8-7 表 达 式 的 种 类 以 及 用 途 表 达 式 可 能 的 出 现 的 场 合 3 声 明 语 句 里 的 界 限 制 表 达 式 初 始 化 表 达 式 说 明 表 达 式 类 型 1 2 秩 否 否 可 I 标 量 4 声 明 语 句 里 的 长 度 否 否 可 I 标 量 EQUIVALENCE 语 句 里 的 下 标 和 子 串 范 围 否 可 否 I 标 量 CASE 语 句 里 的 值 否 可 否 I.L.C 标 量 声 明 语 句 里 的 种 别 参 数 否 可 否 I 标 量 固 有 函 数 里 的 类 型 变 量 否 可 否 I 标 量 PARAMETER 语 句 和 类 型 声 明 语 句 里 的 初 始 值 5 附 加 PARAMETER 属 性 的 类 型 声 明 语 句 里 的 初 始 值 成 员 声 明 里 的 初 始 值 隐 式 do 数 据 对 象 的 参 数 否 可 否 任 意 任 意 否 可 否 任 意 任 意 否 可 否 任 意 任 意 5 否 限 制 否 I 标 量 赋 值 可 可 可 任 意 任 意 可 执 行 语 句 的 下 标 可 可 可 I =1 可 执 行 语 句 的 步 长 可 可 可 I 标 量

147 可 执 行 语 句 的 子 串 范 围 可 可 可 I 标 量 SELECT CASE 里 的 表 达 式 可 可 可 I,L,C 标 量 IF-THEN 语 句 可 可 可 L 标 量 ELSE-IF 语 句 可 可 可 L 标 量 IF 语 句 可 可 可 L 标 量 算 术 IF 语 句 可 可 可 I,R 标 量 DO 语 句 可 可 可 I 标 量 FORALL 的 指 标 参 数 可 可 可 I 标 量 FORALL 里 的 过 滤 可 可 可 L 标 量 WHERE 语 句 里 的 过 滤 可 可 可 L 标 量 WHER E 结 构 了 的 过 滤 可 可 可 L 标 量 输 出 项 列 表 可 可 可 任 意 任 意 除 了 FMT= 说 明 符 之 外 的 I/O 说 明 符 值 可 可 可 I,C 标 量 I/OFMT= 说 明 符 值 可 可 可 C 任 意 RETURN 语 句 可 可 可 I 标 量 完 成 计 算 的 GO TO 语 句 可 可 可 I 标 量 隐 式 do 数 组 构 造 器 参 数 可 可 可 I 标 量 隐 式 doi/o 参 数 可 可 可 I 标 量 实 元 可 可 可 任 意 任 意 语 句 函 数 定 义 里 的 表 达 式 可 可 可 任 意 标 量 表 达 式 注 释 1: 本 栏 里 的 任 意 指 任 意 固 有 或 派 生 类 型 注 释 2: 本 栏 里 的 任 意 指 结 果 可 以 是 标 量 或 任 意 秩 ( 小 于 8) 的 数 组 注 释 3: 相 关 声 明 语 句 包 括 类 型 声 明, 成 员 定 义,DIMENSION,TARGET,COMMON 语 句 注 释 4: 相 关 声 明 语 句 包 括 类 型 声 明, 成 员 定 义,IMPLICIT,FUNCTION 语 句 注 释 5: 隐 式 do 数 据 参 数 可 以 是 一 个 以 固 有 算 符 作 用 于 常 量 或 任 意 包 含 隐 式 do 的 do 变 量 的 8.2 表 达 式 的 解 释 可 以 说, 上 节 只 是 完 备 地 说 明 了 一 个 合 法 的 表 达 式 应 该 是 什 么 样 的, 从 形 式 的 角 度 来 看, 表 达 式 的 分 类, 以 及 每 种 表 达 式 能 够 担 当 什 么 样 的 语 法 作 用 按 照 所 有 那 些 语 法 规 则 写 完 表 达 式 之 后, 相 当 于 当 编 译 器 读 完 源 码 的 表 达 式 之 后, 判 断 相 关 源 码 是 否 出 现 语 法 错 误, 例 如 表 达 式 的 形

148 式 是 否 完 整 无 误, 表 达 式 是 出 现 的 场 合, 即 它 在 它 的 上 下 文 里 面 是 否 恰 当, 甚 至 还 可 以 根 据 表 达 式 里 所 涉 及 的 一 切 对 象 所 表 明 的 属 性, 来 给 它 们 安 排 存 储 空 间 ; 依 据 其 中 的 初 始 化 语 句 对 相 关 对 象 进 行 初 始 化 取 值 等 这 一 切 妥 当 之 后, 程 序 并 没 有 开 始 运 行 因 为 程 序 的 运 行, 必 定 是 从 初 始 化 取 值 开 始, 逐 步 地 对 每 个 变 量 对 象 求 值, 而 这 个 求 值 过 程 依 赖 于 计 算 机 对 于 表 达 式 的 理 解, 也 就 是 对 于 计 算 机 而 言, 表 达 式 的 任 意 成 员 究 竟 应 该 翻 译 成 什 么 指 令 因 此 我 们 说, 这 是 一 个 给 形 式 语 言 赋 予 语 义 的 过 程 接 下 来, 我 们 就 来 讨 论 FORTRAN 对 于 表 达 式 所 规 定 的 语 义, 当 然 所 有 的 语 义 的 实 现 都 是 由 编 译 系 统 完 成 的, 并 不 需 要 程 序 作 者 的 干 预, 我 们 只 是 需 要 知 道 如 何 使 用 FORTRAN 所 提 供 的 语 言 要 素, 来 表 达 我 们 的 计 算 任 务 由 于 表 达 式 所 具 有 的 层 次 性 结 构, 对 表 达 式 的 解 释 过 程 是 与 对 表 达 式 的 构 造 过 程 相 平 行 的 即 从 基 元 的 取 值 出 发, 按 照 运 算 优 先 级 规 则, 基 元 经 过 一 层 一 层 的 算 符 的 作 用, 而 逐 步 得 到 表 达 式 在 每 个 层 次, 每 个 部 分 的 取 值, 最 终, 得 到 整 个 表 达 式 的 取 值, 从 而 完 成 了 对 表 达 式 的 解 释 过 程 与 表 达 式 的 构 造 过 程 类 似, 对 表 达 式 的 解 释 分 为 两 类 : 对 于 固 有 运 算 的 解 释 ; 对 于 自 定 义 运 算 的 解 释 由 于 实 质 上 计 算 机 只 能 处 理 有 限 数 值, 因 此 除 了 对 于 整 数 的 除 法 之 外,FORTRAN 的 固 有 运 算 都 是 与 通 常 的 数 学 含 义 一 致 的, 只 是 任 何 具 体 的 数 值, 在 计 算 机 里 的 表 示 都 必 须 以 有 限 数 值 的 形 式 出 现 至 于 整 数 除 法 的 特 殊 性, 来 源 于 FORTRAN 运 算 对 于 算 元 与 结 果 的 数 据 属 性 的 一 致 性 的 要 求, 两 个 整 型 数 值 的 商 还 必 须 保 持 为 整 型 数 值, 因 此 必 须 给 出 特 别 的 约 定, 才 能 解 决 两 个 整 数 不 能 整 除 的 问 题 对 于 自 定 义 运 算 的 解 释, 则 是 在 定 义 该 算 符 的 函 数 所 在 的, 具 有 OPERATOR 形 式 的 通 用 说 明 符 的 界 面 块 里 完 成 的, 那 里 实 际 上 涉 及 的 是 对 于 一 个 程 序 的 解 释, 而 不 只 是 对 于 表 达 式 的 解 释 从 对 表 达 式 的 解 释 过 程 可 以 看 出, 对 表 达 式 的 解 释 是 独 立 于 表 达 式 的 上 下 文 的, 因 为 从 底 层 开 始 进 行 的 解 释 过 程, 根 本 不 需 要 考 虑 它 的 上 下 文 但 是 这 种 独 立 性 并 不 表 明 同 样 的 算 符 作 用 于 同 样 的 算 元, 最 后 的 值 处 处 都 是 一 样 的 这 种 现 象 的 根 源 在 于 计 算 机 对 于 数 值 的 表 示 是 有 限 形 式 的, 因 而 计 算 机 的 计 算 总 是 某 种 近 似 计 算, 也 就 是 说 总 是 会 产 生 误 差, 而 这 种 误 差 并 不 是 可 以 得 到 精 确 控 制 的 例 如 实 型 表 达 式 X-Y, 它 在 赋 值 过 程 Z=X-Y 里, 与 它 在 表 达 式 X-Y.EQ.Z 里, 不 一 定 会 得 到 相 同 的 取 值 固 有 运 算 的 解 释 基 于 表 达 式 的 构 造, 可 以 把 对 于 固 有 运 算 的 解 释 分 为 如 下 部 分 : 对 于 固 有 数 值 运 算 的 解 释 对 于 非 数 值 固 有 运 算 的 解 释 对 于 具 有 数 组 算 元 的 固 有 运 算 的 解 释 对 于 具 有 指 针 算 元 的 固 有 运 算 的 解 释 1. 对 于 固 有 数 值 运 算 的 解 释 除 了 整 数 幂 次 的 幂 次 运 算 之 外, 固 有 数 值 运 算 总 是 首 先 按 照 前 面 的 算 元 与 结 果 的 数 据 属 性 一 致 性 规 则, 把 算 元 的 数 据 类 型 与 种 别 都 转 换 为 与 结 果 一 致 的 形 式, 然 后 再 开 始 按 照

149 通 常 的 属 性 含 义 进 行 运 算 至 于 整 数 幂 次 的 幂 次 运 算, 则 完 全 不 必 转 换 整 数 幂 次 的 类 型, 因 为 乘 方 实 际 上 就 是 转 换 为 乘 法 运 算, 整 数 幂 次 的 的 乘 方, 就 是 非 常 直 接 的 乘 法 对 于 两 个 整 数 除 法, 由 于 一 致 性 的 要 求, 商 也 必 须 是 整 数, 对 于 无 法 整 除 的 情 形, 规 定 取 离 小 数 形 式 的 商 最 近 的 整 数 值 作 为 计 算 结 果 对 于 幂 次 运 算 X**Y 如 果 Y 是 负 数, 那 么 表 达 式 就 转 换 为 1/(X**(-Y)) 注 意, 这 里 引 入 除 法 之 后, 就 在 幂 次 运 算 里 增 加 除 法 的 特 殊 性 例 8-35 下 面 表 达 式 5**(-2) 的 结 果 等 于 0 如 果 X 为 负 数, 而 Y 为 实 型, 则 表 达 式 无 意 义 而 当 Y 为 实 型 或 复 型, 则 返 回 值 是 数 学 函 数 X Y 的 基 本 值 完 整 的 对 固 有 运 算 的 解 释 见 表 8-7 表 8-8 固 有 运 算 的 解 释 运 算 运 算 的 解 释 X ** Y X 的 Y 次 乘 方 X / Y X 被 Y 除 X * Y X 乘 Y X - Y X 减 Y - Y Y 反 号 X + Y X 加 Y + Y Y 不 变 X // Y X 后 面 连 接 Y X.LT. Y 如 果 X 小 于 Y 则 为 TRUE X < Y 如 果 X 小 于 Y 则 为 TRUE X.LE. Y 如 果 X 小 于 等 于 Y 则 为 TRUE X <= Y 如 果 X 小 于 等 于 Y 则 为 TRUE X.GT. Y 如 果 X 大 于 Y 则 为 TRUE X > Y 如 果 X 大 于 Y 则 为 TRUE X.GE. Y 如 果 X 大 于 等 于 Y 则 为 TRUE X >= Y 如 果 X 大 于 等 于 Y 则 为 TRUE X.EQ. Y 如 果 X 等 于 Y 则 为 TRUE X == Y 如 果 X 等 于 Y 则 为 TRUE X.NE. Y 如 果 X 不 等 于 Y 则 为 TRUE X /= Y 如 果 X 不 等 于 Y 则 为 TRUE

150 .NOT. Y 如 果 Y 为 FALSE 则 为 TRUE X.AND. Y 如 果 X 与 Y 都 是 TRUE 则 为 TRUE X.OR. Y 如 果 X 或 Y 或 都 是 TURE 则 为 TRUE X.EQV. Y 如 果 X 与 Y 都 是 TURE 或 都 是 FALSE 则 为 TRUE X.NEQV. Y 如 果 X 和 Y 一 个 为 TURE, 一 个 为 FALSE 则 为 TRUE 2. 对 于 非 数 值 固 有 运 算 的 解 释 字 符 型 数 据 的 运 算 就 是 字 符 的 串 联, 按 照 从 左 到 右 的 顺 序 把 右 边 的 算 元 接 在 左 边 的 算 元 的 右 边 即 可 关 系 运 算 按 照 算 元 分 三 类 : 算 元 都 是 数 值 这 时 就 是 一 般 的 数 学 意 义 上 的 大 小 与 相 等 的 概 念, 如 果 它 们 的 类 型 或 种 别 不 同, 则 先 转 换 为 它 们 的 和 的 类 型 或 种 别, 再 进 行 比 较 对 于 复 数, 只 能 说 是 否 相 等, 不 能 比 较 大 小 结 果 都 是 默 认 逻 辑 型 算 元 都 是 字 符 型 算 元 的 长 度 可 以 不 同, 但 是 类 型 必 须 相 同 如 果 长 度 不 同, 则 在 短 字 符 串 的 右 边 添 加 空 格 符, 使 得 两 者 长 度 一 致, 再 从 左 边 第 一 个 字 符 开 始 作 比 较, 如 果 相 同, 则 比 较 第 二 个 字 符, 直 到 出 现 不 相 同 的 情 况, 这 时 就 可 以 得 到 是 否 相 等 的 判 断, 进 一 步 根 据 第 一 个 不 相 同 的 字 符 在 编 译 器 规 则 的 字 符 顺 序 表 里 的 位 置 前 后, 来 决 定 它 们 的 大 小 因 此 字 符 型 数 据 的 大 小 关 系 是 依 赖 于 编 译 系 统 的, 而 是 否 相 等 则 不 依 赖 算 元 都 是 逻 辑 型 逻 辑 型 运 算 的 取 值 表 见 表 8-9 表 8-9 固 有 逻 辑 运 算 的 值 X Y.NOT.Y X.AND.Y X.OR.Y X.EQV.Y X.NEQV.Y TURE TURE FALSE TURE TURE TURE FALSE FALSE TURE FALSE FALSE TURE FALSE TURE TURE FALSE TURE FALSE TURE FALSE TURE FALSE FALSE TURE FALSE FALSE TURE FALSE 3. 对 于 具 有 数 组 算 元 的 固 有 运 算 的 解 释 对 于 二 元 固 有 运 算 来 说, 基 于 一 致 性 的 要 求, 数 组 作 为 算 元 只 会 出 现 两 者 情 况 : 两 个 算 元 都 是 数 组, 而 且 形 状 必 定 相 同 一 个 算 元 是 数 组, 另 一 个 是 标 量 这 时, 由 于 两 个 算 元 形 状 不 同, 如 果 导 致 特 定 的 运 算 无 法 进 行, 则 把 标 量 扩 充 为 一 个 与 数 组 算 元 具 有 相 同 形 状 的 数 组, 该 数 组 的 所 有 元 素 都 等 于 该 标 量 数 组 的 运 算, 无 论 是 一 元 还 是 二 元 运 算, 基 本 的 规 则 就 是 对 所 有 的 元 素 进 行 相 同 的 运 算

151 例 如 数 组 运 算 A+B 的 结 果 是 一 个 与 A,B 相 同 形 状 的 数 组, 该 数 组 的 每 个 元 素 都 等 于 相 应 位 置 上 的 A 与 B 的 元 素 的 和 而 数 组 运 算 -A 的 结 果 是 一 个 与 A 相 同 形 状 的 数 组, 该 数 组 的 每 个 元 素 都 等 于 相 应 位 置 上 的 A 的 元 素 的 反 号 结 果 注 意 这 里 的 运 算 解 释 不 同 于 数 学 意 义 上 的 矩 阵 的 运 算 如 果 固 有 运 算 出 现 在 过 滤 赋 值 语 句 当 中, 那 么 运 算 就 只 针 对 满 足 过 滤 条 件 的 元 素 实 际 上, 在 机 器 内 部, 所 有 元 素 的 计 算 都 执 行 了, 但 是 不 满 足 过 滤 条 件 的 元 素 的 计 算 并 不 影 响 最 终 的 结 果, 因 为 不 满 足 过 滤 条 件 的 元 素 再 也 不 会 在 随 后 的 程 序 当 中 出 现, 也 就 不 会 导 致 运 行 时 错 误 数 组 元 素 的 分 别 计 算 并 不 存 在 顺 序, 对 于 处 理 器 来 说, 可 以 是 任 意 顺 序 实 际 上 不 管 是 向 量 处 理 器 还 是 标 量 处 理 器, 都 有 可 能 是 所 有 元 素 的 计 算 一 次 同 时 完 成 4. 对 于 具 有 指 针 算 元 的 固 有 运 算 的 解 释 固 有 运 算 的 算 元 也 有 可 能 是 指 针, 这 时 指 针 必 须 已 经 关 联 到 一 个 已 经 定 义 好 了 的 目 标 上, 然 后 把 目 标 的 取 值 代 入 指 针, 再 按 照 前 面 的 解 释 进 行 运 算 如 果 运 算 的 算 元 是 一 个 同 时 也 是 指 针 的 结 构 变 量 的 成 员, 那 么 它 的 取 值 就 是 和 该 结 构 变 量 关 联 的 作 为 目 标 的 结 构 的 相 应 命 名 成 员 例 8-36 TYPE(ADD) I,J::INTEGER END TYPE TYPE(ADD),POINTER::PTR TYPE(ADD),TARGET::T 这 里 PTR 被 关 联 到 T, 如 果 PTR%I 成 为 了 一 个 算 元, 那 么 该 算 元 的 取 值 就 是 目 标 T 的 成 员 I, 即 T% I 自 定 义 运 算 的 解 释 对 自 定 义 运 算 的 解 释 由 带 有 OPERATOR 界 面 的 函 数 子 程 序 提 供 如 果 同 一 个 OPERATOR 界 面 包 含 多 个 函 数, 那 么 由 所 含 哑 元 的 类 型, 种 别, 秩 等 一 致 的 函 数 提 供 解 释 例 8-37 设 有 自 定 义 运 算.ADD., 而 派 生 类 型 RATIONAL 对 象 A 和 B 构 成 如 下 表 达 式 : A.ADD. B 其 中 的 自 定 义 运 算.ADD. 来 自 如 下 OPERATOR 界 面 块, 里 面 包 含 了 2 个 函 数 : INTERFACE OPERATOR(.ADD.) FUNCTION RATIONAL_ADD(L, R) USE RATIONAL_MODULE TYPE (RATIONAL),INTENT(IN)::L,R TYPE (RATIONAL) ::RATIONAL_ADD END FUNCTION RATIONAL_ADD

152 FUNCTION LOGICAL_ADD(L, R) LOGICAL, INTENT(IN)::L, R LOGICAL ::LOGICAL_ADD END FUNCTION LOGICAL_ADD END INTERFACE 显 然.ADD. 由 函 数 RATIONAL_ADD 给 出 解 释. 下 面 是 自 定 义 运 算 的 说 明 : 自 定 义 运 算 由 包 含 1 个 或 2 个 哑 元 的 函 数 定 义 函 数 哑 元 代 表 了 运 算 的 算 元 如 果 只 有 1 个 哑 元, 则 为 一 元 运 算 ; 如 果 有 2 个 哑 元, 则 为 二 元 运 算, 其 中 第 一 个 哑 元 为 左 算 元, 第 二 个 哑 元 为 右 算 元 必 定 存 在 一 个 具 有 通 用 说 明 符 OPERATOR 的 界 面 块 定 义 函 数 表 达 式 里 的 算 元 的 数 据 属 性 必 须 与 函 数 里 的 哑 元 保 持 一 致 自 定 义 运 算 的 算 符 不 能 和 任 何 固 有 运 算 的 算 符 相 雷 同 如 果 函 数 不 是 基 本 的, 那 么 算 元 的 秩 必 须 与 函 数 里 的 哑 元 保 持 一 致 ; 如 果 函 数 是 基 本 的, 算 元 可 以 是 数 组, 如 果 包 含 2 个 算 元, 它 们 必 须 保 持 一 致 性 或 者 有 一 个 哑 元 是 派 生 类 型, 或 者 都 是 固 有 类 型, 但 是 与 表 8-3 里 的 固 有 运 算 不 保 持 一 致 如 果 存 在 两 个 界 面 都 满 足 给 一 个 自 定 义 运 算 提 供 解 释 的 条 件, 例 如 : 一 个 界 面 包 含 1 或 2 个 满 足 条 件 的 哑 元 ; 另 一 个 函 数 界 面 是 基 本 的, 同 样 包 含 1 或 2 个 满 足 条 件 的 标 量 哑 元 那 么 引 用 非 基 本 函 数 的 那 个 例 8-38 设 有 如 下 界 面 块 : INTERFACE OPERATOR(.ADD.) ELEMENTAL FUNCTION ELEM(X,Y) REAL,INTENT(IN)::X,Y END FUNCTION ELEM FUNCTION NOELEM(X,Y) REAL,INTENT(IN),DIMENSION(20)::X,Y REAL NONELEM(20) END FUNCTION NONELEM END INTERFACE 然 后 在 以 下 程 序 当 中 引 用 运 算 A. ADD.B REAL A(20),B(20),C(20) C=A.ADD.B

153 基 于 以 上 的 规 则, 这 里 执 行 的 函 数 是 NONELEM, 而 不 是 ELEM 注 意 自 定 义 运 算 的 算 元 不 需 要 在 形 状 上 保 持 一 致 性, 因 为 函 数 可 能 是 非 基 本 的 对 于 自 定 义 运 算 必 须 注 意 避 免 产 生 如 下 的 异 常 运 算 : 由 固 有 运 算 或 固 有 函 数 导 致 的 整 数 溢 出 整 数 除 法 0/0 固 有 数 值 运 算 导 致 的 浮 点 溢 出 0**0 浮 点 运 算 导 致 的 浮 点 下 溢 浮 点 舍 入 错 误 X**Y,X 为 实 型,Y 为 负 数 8.3 表 达 式 的 计 算 基 于 表 达 式 的 语 义, 一 个 计 算 过 程 得 以 开 始 的 前 提 是 每 个 算 元 都 已 经 定 义 好, 或 者 说 具 有 具 有 确 定 的 定 义 状 态 ( 参 见 第 17 章 通 讯 ) 而 一 旦 开 始 计 算, 机 器 的 计 算 过 程, 或 者 说 计 算 途 径 并 不 是 唯 一 的, 因 为 要 唯 一 确 定 表 达 式 的 计 算 过 程, 就 必 须 把 括 号 全 都 写 出 来, 实 际 上 我 们 省 略 了 很 多 括 号, 这 就 使 得 编 译 系 统 的 计 算 可 以 在 许 多 不 同 的 途 径 当 中 进 行 优 化 这 种 优 化 的 实 质, 就 是 给 出 表 达 式 的 等 价 表 达 式, 选 择 更 加 有 效 率 的 表 达 式 进 行 实 际 的 计 算 所 谓 两 个 表 达 式 等 价, 是 指 如 果 它 们 的 算 元 取 所 有 可 能 的 值 时 都 结 果 一 样 在 这 样 的 定 义 之 下, 似 乎 只 要 两 个 表 达 式 具 有 数 学 上 的 等 价 性 即 可, 然 而 由 于 在 数 值 计 算 方 面, 计 算 机 具 有 本 质 上 的 局 限 性, 使 得 FORTRAN 语 言 里 的 表 达 式 的 等 价 与 数 学 意 义 上 的 表 达 式 的 等 价 并 不 完 全 一 致, 这 点 主 要 表 现 在 如 下 方 面 : 因 为 按 照 FORTRAN 语 言 的 规 定, 括 号 的 位 置 是 绝 对 不 可 变 更 的, 因 此 对 表 达 式 的 等 价 变 换 受 到 了 一 定 的 限 制 即 在 对 一 个 表 达 式 进 行 等 价 变 换 时, 显 式 的 括 号 位 置 不 能 改 变, 不 能 减 少, 只 能 增 加 当 遵 循 交 换 律, 结 合 律 和 分 配 律 来 进 行 等 价 变 换 时, 必 须 考 虑 到 所 涉 及 的 算 元 的 取 值 精 度 是 否 会 因 此 而 发 生 改 变 因 为 所 谓 等 价 变 换, 实 际 上 就 是 改 变 表 达 式 里 的 各 种 算 符 的 计 算 顺 序, 甚 至 有 可 能 省 略 掉 本 来 有 的 算 符, 由 于 各 种 运 算 对 于 精 度 的 影 响 是 不 同 的, 有 的 运 算 总 是 绝 对 精 确 的, 有 的 运 算, 或 者 在 有 的 时 候, 会 产 生 一 定 的 误 差, 这 样 的 运 算 在 被 改 变 运 算 顺 序 之 后, 在 数 值 上 就 不 会 是 等 价 的 了 在 下 面 的 表 8-10 和 表 8-11 里 面 我 们 分 别 给 出 有 效 的 等 价 代 换 与 无 效 的 等 价 代 换 的 例 子 : 表 8-10 表 达 式 计 算 的 有 效 代 换 表 达 式 X+Y X*Y -X+Y X+Y+Z X-Y+Z X*Y/Z X*Y-X*Z 等 价 的 表 达 式 Y+X Y*X Y-X X+(Y+Z) X-(Y-Z) X*(Y/Z) X*(Y-Z)

154 X/Y/Z X/5.0 X>Y X.OR.Y.OR.Z X.AND.X X=Y//Z X/(Y*Z) 0.2*X (X-Y)>0 X.OR.(Y.OR.Z) X X=Y!LEN(X)<=LEN(Y) 表 8-11 无 效 的 表 达 式 代 换 的 例 子 表 达 式 不 允 许 的 代 换 表 达 式 I/2 0.5*I X*I/J I/J/X (X+Y)+Z (X*Y)-(X*Z) X*(Y-Z) X*(I/J) I/(J*X) X+(Y+Z) X*(Y-Z) X*Y-X*Z 注 意 在 改 变 运 算 顺 序 之 后 有 可 能 发 生 的 舍 入 误 差, 导 致 计 算 结 果 的 不 一 致 例 如 X-Y-Z 和 X-(Y+Z) 就 有 可 能 具 有 不 同 的 数 值 结 果 需 要 注 意 在 表 达 式 没 有 进 行 计 算 的 部 分, 有 可 能 包 含 具 有 在 引 用 运 行 后, 能 够 改 变 程 序 状 态 的 副 作 用 第 9 章 基 本 计 算 ( 一 ) 赋 值 语 句 从 计 算 机 的 实 际 状 态 来 看, 给 出 表 达 式 并 不 意 味 着 计 算 的 开 始, 真 正 能 够 驱 动 计 算 的 是 可 执 行 语 句, 而 最 直 接 驱 动 表 达 式 的 计 算 过 程 的 就 是 赋 值 语 句, 完 成 一 个 赋 值 步 骤, 就 意 味 着 机 器 的 状 态 的 局 部 或 全 局 发 生 了 一 个 根 本 的 变 化 从 语 法 的 角 度 来 看, 一 个 表 达 式 还 只 是 一 个 比 较 复 杂 的 复 合 词 汇, 还 不 能 构 成 一 个 完 整 的 语 句, 而 赋 值 语 句 则 是 一 个 在 语 法 意 义 上 的 完 整 的 语 句, 表 达 式 在 赋 值 语 句 中 扮 演 关 键 的 语 法 作 用 从 计 算 问 题 的 角 度 来 看, 赋 值 可 以 说 是 基 本 的 计 算 步 骤, 考 虑 一 下 我 们 人 工 计 算 的 过 程 就 可 以 发 现, 任 何 一 个 完 整 的 计 算 步 骤, 都 可 以 说 就 是 一 个 赋 值 步 骤, 特 别 是 公 式 演 算 和 数 值 计 算, 完 成 一 个 局 部 运 算 过 程 的 标 志, 往 往 就 是 求 出 某 个 中 间 变 量 的 数 值 或 表 达 式 FORTRAN 语 言 作 为 一 种 以 公 式 翻 译 为 初 衷 的 高 级 语 言, 它 的 赋 值 语 句 的 一 般 形 式 就 是 一 个 数 学 等 式, 当 然 不 是 那 种 公 式 恒 等 变 换 得 到 的 恒 等 式, 而 是 要 把 运 算 的 结 果 赋 予 一 个 变 量, 因 此 它 的 一 般 句 法 形 式 为 : variable = expression variable => expression

155 可 以 看 到 一 个 赋 值 语 句 作 为 一 个 完 整 的 语 句, 分 为 三 个 部 分 : 被 赋 值 的 变 量 赋 值 符 号 计 算 ( 表 达 式 ) 其 中 被 赋 值 的 变 量, 通 过 赋 值, 就 拥 有 了 明 确 的 取 值 形 式, 如 果 该 变 量 含 有 下 标, 片 断 下 标 或 子 串 范 围, 则 赋 值 的 前 提 是 它 们 都 已 经 获 得 具 体 的 取 值 基 于 表 达 式 结 果 的 不 同 种 类, 赋 值 语 句 分 为 : 固 有 赋 值 : 固 有 赋 值 是 把 任 意 类 型 的 值 赋 予 一 个 非 指 针 变 量, 或 把 一 个 指 针 变 量 赋 予 一 个 与 之 相 关 联 的 目 标 自 定 义 赋 值 : 自 定 义 赋 值 得 以 构 成 的 前 提 是 存 在 一 个 可 访 问 的 子 例 行 程 序, 它 包 含 一 个 具 有 ASSIGNMENT 形 式 的 赋 值 界 面, 其 属 性 与 自 定 义 赋 值 语 句 里 的 变 量 和 表 达 式 的 属 性 保 持 一 致 指 针 赋 值 : 指 针 赋 值 把 一 个 指 针 变 量 关 联 到 它 的 目 标 对 象, 或 者 说 把 一 个 目 标 对 象 赋 予 到 一 个 指 针 变 量 在 形 式 上 它 使 用 符 号 => 过 滤 数 组 赋 值 : 这 个 赋 值 过 程 是 对 满 足 一 定 条 件 的 数 组 元 素 进 行 赋 值, 而 不 是 对 数 组 整 体 进 行 赋 值 并 行 指 标 数 组 赋 值 这 种 赋 值 形 式 给 出 了 一 种 有 效 的 并 行 机 制, 能 够 大 规 模 地 对 多 重 指 标 变 量 进 行 赋 值 下 面 我 们 将 分 节 讨 论 这 5 类 赋 值 形 式, 首 先 给 出 一 些 例 子 如 下 : 例 9-1 X=X-2 实 型 的 固 有 赋 值 CHAR(5:8)= M_30 逻 辑 型 的 固 有 赋 值 SAMPLE=NOTE_2 结 构 的 固 有 赋 值 STRING= MYSAMPLE 可 变 串 结 构 的 自 定 义 赋 值 WHERE(X/=0.0) 过 滤 数 组 赋 值 A=B/X END WHERE FORALL(I=0:N,J=1:N) 并 行 指 标 结 构 A(I,J)= 3.0/(I-J+2) 并 行 指 标 赋 值 B(I,J)%PTR=>C(I:N,J:N) 并 行 指 标 指 针 赋 值 END FORALL PTR=>X 指 针 赋 值 9.1 固 有 赋 值 语 句 所 谓 固 有 赋 值 的 主 要 特 征 就 是 被 赋 值 的 变 量 不 能 是 指 针 变 量, 赋 值 语 句 本 身 就 是 对 变 量 的 定 义 或 重 定 义, 变 量 的 取 值 就 是 直 接 计 算 赋 值 语 句 右 边 的 表 达 式 所 得 不 需 要 额 外 的 子 程 序 来 加 以 说 明 下 面 说 明 固 有 赋 值 语 句 的 用 法 :

156 固 有 赋 值 中 变 量 与 表 达 式 所 能 够 具 有 的 类 型, 以 及 它 们 的 一 致 性 要 求 见 表 9-1 变 量 的 类 型 INTEGER REAL COMPLEX CHARACTER LOGICAL 派 生 类 型 表 9-1 固 有 赋 值 中 变 量 与 表 达 式 的 类 型 表 达 式 的 类 型 INTEGER,REAL,COMPLEX INTEGER,REAL,COMPLEX INTEGER,REAL,COMPLEX 变 量 为 具 有 相 同 种 别 参 数 的 CHARACTER LOGICAL 变 量 为 相 同 的 派 生 类 型 如 果 变 量 是 标 量, 那 么 表 达 式 也 必 须 是 标 量 如 果 变 量 是 数 组, 那 么 表 达 式 或 者 是 标 量, 或 者 是 相 同 形 状 的 数 组 如 果 变 量 是 显 形 数 组, 那 么 变 量 的 形 状 可 以 通 过 说 明 语 句 说 明 如 果 变 量 是 待 定 形 数 组, 那 么 它 的 形 状 由 ALLOCATE 语 句, 或 指 针 赋 值 语 句 确 定 如 果 变 量 是 哑 形 数 组, 那 么 它 的 形 状 由 变 量 里 的 片 断 下 标, 或 实 元 确 定 变 量 不 能 是 哑 尺 度 数 组, 除 非 存 在 含 有 最 后 一 个 维 度 上 的 上 界 的 片 断 下 标, 或 数 组 的 下 标 向 量, 或 者 标 量 下 标 表 达 式 的 形 状 由 算 元 的 形 状, 表 达 式 里 的 运 算, 以 及 其 中 的 函 数 引 用 决 定 如 果 变 量 是 一 个 指 针, 那 么 它 必 定 已 经 关 联 到 一 个 目 标, 赋 值 语 句 把 表 达 式 的 值 赋 予 指 针 的 目 标 指 针 所 关 联 的 目 标 可 以 是 一 个 数 组, 指 针 决 定 数 组 的 秩, 而 每 个 维 度 的 宽 度 则 由 目 标 决 定 在 赋 值 过 程 本 身 被 执 行 之 前, 赋 值 语 句 右 边 表 达 式 以 及 表 达 式 和 变 量 里 面 包 含 的 下 标 与 下 标 片 断 表 达 式, 都 必 须 预 先 求 值 完 毕 如 果 变 量 的 类 型 以 及 种 别 参 数 和 表 达 式 的 不 一 致, 那 么 在 执 行 赋 值 语 句 之 前, 还 必 须 完 成 必 要 的 针 对 表 达 式 的 类 型 转 换, 固 有 转 换 函 数 见 下 表 9-2: 变 量 的 类 型 INTEGER REAL COMPLEX LOGICAL 表 9-2 固 有 转 换 函 数 被 赋 的 值 INT(expression,KIND(variable)) REAL(expression,KIND(variable)) CMPLX(expression,KIND(variable)) LOGICAL(expression,KIND(variable)) 表 达 式 里 面 可 以 使 用 赋 值 语 句 左 边 变 量 的 部 分 值 例 9-2 DATE(5:10)=DATE(2:6) 注 意 这 是 FORTAN 现 代 版 本 所 增 加 的 功 能, 在 FORTRAN77 里 面 是 不 允 许 的 如 果 变 量 和 表 达 式 都 是 字 符 型 的, 那 么 它 们 必 须 具 有 相 同 的 种 别 参 数 值 如 果 变 量 和 表 达 式 是 具 有 不 同 长 度 属 性 的 字 符 型 对 象, 那 么 赋 值 过 程 遵 循 以 下 规 则 : 如 果 变 量 的 长 度 比 表 达 式 的 短, 那 么 把 表 达 式 的 右 边 长 出 来 的 部 分 截 除 ;

157 如 果 变 量 的 长 度 比 表 达 式 的 长, 那 么 在 表 达 式 的 右 边 添 加 空 格, 直 到 跟 变 量 一 样 长 如 果 在 赋 值 语 句 左 边 的 变 量 里 面 含 有 表 达 式, 例 如 下 标 表 达 式, 那 么 这 个 表 达 式 的 计 算 与 取 值 完 全 与 赋 值 语 句 右 边 的 表 达 式 无 关, 因 为 左 边 变 量 的 任 何 表 达 式 都 必 须 是 预 先 完 成 计 算 的 如 果 把 一 个 标 量 赋 值 给 一 个 数 组, 为 了 保 持 形 状 的 一 致 性, 需 要 把 该 标 量 扩 充 为 一 个 与 左 边 数 组 同 样 形 状 的 数 组, 该 数 组 的 每 个 元 素 都 是 那 个 标 量 例 9-3 INTEGER X(100) X=5.0 经 过 赋 值 后 X 的 取 值 为 含 有 100 个 元 素 的 数 组, 每 个 元 素 都 是 5.0 数 组 的 赋 值 过 程 是 按 照 元 素 位 置 一 一 对 应 进 行 的 例 9-4 设 有 两 个 相 同 形 状 的 数 组 X 和 Y, 有 赋 值 语 句 : X=Y 那 么 具 体 的 赋 值 过 程 就 是 Y 的 元 素 赋 予 X 的 相 同 位 置 的 元 素, 至 于 不 同 位 置 的 元 素 是 按 照 什 么 顺 序 来 进 行 赋 值 的, 并 不 需 要 考 虑, 可 以 认 为 所 有 元 素 的 赋 值 是 同 时 进 行 的 对 于 派 生 类 型 的 对 象 的 固 有 赋 值, 变 量 与 表 达 式 必 须 是 属 于 同 一 个 派 生 类 型, 而 赋 值 方 法 类 似 于 数 组, 在 相 同 位 置 的 成 员 之 间 进 行 赋 值, 如 果 某 个 成 员 是 指 针, 则 该 成 员 的 赋 值 过 程 按 照 指 针 赋 值 的 规 则 进 行 9.2 自 定 义 赋 值 语 句 如 果 需 要 进 行 赋 值 的 变 量 和 表 达 式 是 不 符 合 表 9-1, 表 9-2 所 规 定 的 一 致 性 要 求 的 固 有 类 型 或 派 生 类 型, 那 么 就 需 要 使 用 自 定 义 赋 值 语 句, 它 提 供 赋 值 界 面 与 相 应 子 例 行 程 序 以 供 访 问, 从 而 完 成 赋 值 自 定 义 赋 值 是 由 具 有 赋 值 说 明 符 ASSIGNMENT(=) 的 子 例 行 程 序 来 完 成 赋 值 操 作 的 用 户 可 以 在 子 例 行 程 序 当 中 通 过 定 义 新 的 规 则, 来 扩 充 可 以 进 行 赋 值 的 类 型 下 面 介 绍 自 定 义 赋 值 运 算 的 用 法 : 自 定 义 赋 值 运 算 由 具 有 两 个 哑 元 的 子 例 行 程 序 声 明 ( 子 例 行 程 序 可 以 是 外 部 或 模 块 子 例 行 程 序 里 的 对 象 ) 子 例 行 程 序 的 哑 元 按 照 其 出 现 的 前 后 顺 序, 分 别 表 示 自 定 义 赋 值 的 变 量 与 表 达 式 其 中 第 一 个 哑 元 必 须 具 有 INTENT 的 OUT 或 INOUT 的 属 性, 而 第 二 个 哑 元 必 须 具 有 INTENT 的 IN 的 属 性 具 有 ASSIGNMENT(=) 形 式 的 通 用 说 明 符 的 子 例 行 程 序 必 须 带 有 界 面 块 变 量 与 表 达 式 的 类 型 以 及 种 别 参 数 必 须 与 哑 元 保 持 一 致 对 于 一 个 非 基 本 子 例 行 程 序, 变 量 与 表 达 式 的 秩 必 须 与 哑 元 的 秩 相 同 对 于 一 个 基 本 子 例 行 程 序, 变 量 必 须 是 数 组, 而 表 达 式 与 之 保 持 一 致 ; 或 者 两 者 都 是 标 量 如 果 变 量 和 表 达 式 同 时 与 一 个 基 本 子 例 行 程 序 和 一 个 非 基 本 子 例 行 程 序 的 界 面 匹 配, 那 么 赋 值 运 算 由 非 基 本 子 例 行 程 序 定 义 两 个 哑 元 或 者 有 一 个 是 派 生 类 型, 或 者 都 是 固 有 类 型, 但 不 满 足 固 有 赋 值 的 一 致 性 条 件

158 对 变 量 的 自 定 义 赋 值 的 结 果 由 所 引 用 的 子 例 行 程 序 决 定 例 9-5 INTERFACE ASSIGNMENT(=) ELEMENTAL SUBROUTING RATIONAL_TO_REAL(L,R) USE RATIONAL_MODULE TYPE (RATIONAL), INTENT( IN) :: R REAL, INTENT(OUT) ::L END SUBROUTING RATIONAL_TO_REAL ELEMENTAL SUBROUTING REAL_TO_RATIONAL (L,R) USE RATIONAL_MODULE REAL INTENT(IN) ::R TYPE (RATIONAL), INTENT(OUT)::L END SUBROUTING REAL_TO_RATIONAL END INTERFACE 上 面 的 界 面 块 通 过 两 个 外 部 子 例 行 程 序 给 出 了 自 定 义 赋 值, 一 个 把 派 生 类 型 RATIONAL 的 对 象 赋 值 给 实 型 对 象, 另 一 个 把 实 型 对 象 赋 值 给 派 生 类 型 RATIONAL 的 对 象 有 了 上 面 的 界 面 块, 就 可 以 进 行 下 面 的 自 定 义 赋 值 : REAL R_VALUE, R_ARRAY(20) TYPE (RATIONAL) RAT_VALUE, RAT_ARRAY(20) R_VALUE=RATIONAL(5, 8) RAT_VALUE= 指 针 赋 值 所 谓 指 针 赋 值, 实 际 上 就 是 把 指 针 变 量 关 联 到 一 个 具 有 TARGET 属 性 的 对 象 上, 即 使 得 指 针 变 量 成 为 目 标 对 象 的 一 个 别 名 如 果 指 针 所 关 联 的 目 标 的 状 态 发 生 改 变, 例 如 去 关 联, 或 去 定 义, 那 么 指 针 的 状 态 也 发 生 相 应 的 改 变 一 旦 指 针 赋 值 语 句 被 执 行 之 后, 指 针 的 关 联 状 态 就 不 会 改 变 了, 除 非 执 行 另 外 一 个 指 针 赋 值 语 句 来 改 变 其 状 态, 或 执 行 ALLOCATE,DEALLOCATE,NULLIFY 语 句 对 指 针 重 定 义 指 针 赋 值 的 一 般 形 式 (R736) 为 : pointer-object=> target 其 中 指 针 对 象 (pointer-object) 的 一 般 形 式 (R630) 为 : variable-name structure-component 而 目 标 (target) 的 一 般 形 式 (R737) 为 :

159 variable expression 下 面 说 明 指 针 赋 值 的 用 法 : 如 果 指 针 对 象 为 变 量 名 称 或 结 构 成 员, 那 么 它 们 都 必 须 具 有 POINTER 属 性 如 果 目 标 是 命 名 变 量, 那 么 它 必 须 具 有 TARGET 或 POINTER 属 性 如 果 目 标 是 子 对 象 指 示 符, 那 么 它 的 父 结 构 必 须 具 有 TARGET 或 POINTER 属 性, 或 者 它 必 须 是 一 个 在 最 右 边 成 员 具 有 POINTER 属 性 的 结 构 引 用 目 标 与 指 针 对 象 的 类 型, 种 别 参 数, 长 度 参 数, 秩 都 必 须 一 样 如 果 => 右 边 的 变 量 具 有 TARGET 属 性, 那 么 => 左 边 的 指 针 对 象 就 被 关 联 到 该 目 标 如 果 => 右 边 的 变 量 具 有 POINTER 属 性, 并 且 处 于 关 联 状 态, 那 么 => 左 边 的 指 针 对 象 在 指 针 赋 值 语 句 执 行 之 后, 也 被 关 联 到 目 标 指 针 所 关 联 的 同 一 个 数 据 对 象 如 果 => 右 边 的 变 量 具 有 POINTER 属 性, 并 且 处 于 去 关 联 状 态, 或 者 右 边 的 表 达 被 引 用 到 固 有 函 数 NULL, 那 么 => 左 边 的 指 针 对 象 也 成 为 去 关 联 状 态 如 果 => 右 边 的 变 量 具 有 POINTER 属 性, 并 且 处 于 去 定 义 关 联 状 态, 那 么 => 左 边 的 指 针 对 象 也 成 为 去 定 义 关 联 状 态 指 针 赋 值 语 句 终 止 了 指 针 对 象 此 前 所 具 有 的 任 何 关 联 状 态, 从 而 产 生 一 个 新 的 关 联 状 态 如 果 指 针 对 象 是 待 定 形 数 组, 那 么 指 针 赋 值 语 句 就 能 够 确 立 指 针 数 组 每 个 维 度 的 宽 度, 即 其 目 标 的 相 应 维 度 的 宽 度, 除 非 目 标 本 身 是 去 关 联 指 针 或 去 定 义 指 针 例 9-6 执 行 以 下 语 句 : INTEGER,TARGET::T(11:20) INTEGER,POINTER::P1(:),P2(:) P1=>T P2=>T(:) 得 到 P1 的 宽 度 是 11 和 20, 而 P2 的 宽 度 是 1 和 10 目 标 不 能 是 属 于 哑 尺 度 数 组 的 命 名 变 量 如 果 目 标 是 一 个 哑 尺 度 数 组 的 数 组 片 断, 那 么 它 必 须 具 有 下 标, 或 者 具 有 在 最 后 一 维 给 出 了 上 界 的 下 标 三 元 组 如 果 目 标 为 数 组 片 断, 那 么 它 不 能 具 有 下 标 向 量 如 果 目 标 是 一 个 表 达 式, 那 么 它 必 须 给 出 一 个 指 针 结 果, 这 意 味 着 该 表 达 式 引 用 了 固 有 函 数 NULL, 或 者 是 引 用 了 能 够 得 到 指 针 结 果 的 用 户 自 定 义 函 数 或 自 定 义 运 算 因 为 在 固 有 函 数 或 固 有 运 算 里, 只 有 NULL 得 到 指 针 结 果 如 果 一 个 指 针 的 目 标 没 有 被 引 用 或 定 义, 那 么 该 指 针 也 不 能 被 引 用 或 定 义 如 果 一 个 结 构 的 某 些 成 员 具 有 POINTER 属 性, 而 该 结 构 被 固 有 派 生 类 型 赋 值 语 句 进 行 了 赋 值, 那 么 对 于 每 个 具 有 POINTER 属 性 的 成 员, 是 运 用 指 针 赋 值 语 句 进 行 赋 值 的 自 定 义 赋 值 语 句 可 以 用 来 在 结 构 的 成 员 之 间 进 行 指 针 赋 值 例 9-7 MONTH=>DAYS(1:30) PTR=>X(:,5) NUMBER=>INDEXONE%INDEXTWO FIRST_RESLUT=>NULL()

160 例 9-8 下 面 的 目 标 也 是 指 针 : REAL,POINTER::PTR,P REAL,TARGET::X REAL Y X=5.7 P=>X PTR=>P Y=PTR-8.1 例 9-9 下 面 的 目 标 为 表 达 式 : INTERFACE FUNCTION POINTER_FCN(X) REAL X REAL,POINTER::POINTER_FCN END FUNCTION REAL,POINTER::P REAL A P=>POINTER_FCN(A) 注 意 以 下 情 形 : 在 指 针 与 目 标 之 间 建 立 关 联, 除 了 指 针 赋 值 语 句 之 外, 使 用 ALLOCATE 语 句 也 能 做 到, 而 使 得 指 针 去 关 联 则 也 可 使 用 DEALLOCATE 或 NULLIFY 语 句 当 在 表 达 式 或 过 程 里 引 用 指 针 时, 会 得 到 与 该 指 针 关 联 的 目 标 的 值, 这 点 与 在 指 针 赋 值 语 句 里 不 同 当 指 针 是 作 为 一 个 与 具 有 POINTER 属 性 的 哑 元 相 应 的 实 元 出 现 的 时 候, 那 么 该 引 用 是 到 达 指 针 本 身, 而 不 是 它 的 值 9.4 过 滤 数 组 赋 值 对 于 数 组 的 赋 值, 除 了 全 数 组 的 一 一 对 应 的 赋 值 方 式 之 外, 很 多 时 候, 还 需 要 做 到 在 数 组 里 挑 选 符 合 一 定 条 件 的 某 些 元 素, 只 对 这 些 特 定 元 素 进 行 赋 值 这 时 已 有 的 赋 值 语 句 都 无 法 做 到, 因 此 FORTRAN 专 门 提 供 了 过 滤 数 组 赋 值 方 式, 用 来 完 成 这 类 任 务 所 谓 过 滤 数 组 赋 值, 实 际 上 就 是 建 立 WHERE 块, 或 ELSEWHERE 块, 或 者 是 WHERE 语 句, 然 后 在 其 中 使 用 固 有 赋 值 语 句, 它 的 变 量 为 数 组 时, 就 可 以 对 其 元 素 进 行 选 择 性 赋 值 在 WHERE 语 句 或 WHERE 结 构 里 对 数 组 元 素 进 行 过 滤, 是 根 据 一 个 逻 辑 数 组 表 达 式 的 值 来 进 行 的, 该 逻 辑 数 组 表 达 式 是 从 数 组 取 值 而 得 到 逻 辑 型 值 的 条 件 表 达 式, 作 用 于 : 基 本 固 有 运 算 ; 基 本 固 有 函 数 引 用 ; 基 本 自 定 义 运 算 ; 基 本 自 定 义 函 数 引 用 ;

161 固 有 赋 值 ; 基 本 自 定 义 赋 值 注 意 所 谓 WHERE 语 句 或 WHERE 结 构 非 常 类 似 于 选 择 控 制 结 构 IF 结 构 或 IF 语 句, 但 它 们 有 一 个 主 要 的 差 别, 就 是 在 WHERE 结 构 里, 所 有 的 赋 值 语 句 都 是 要 执 行 的, 即 使 是 不 满 足 条 件 的 元 素, 它 的 赋 值 同 样 执 行 了, 只 是 不 满 足 条 件 的 元 素 的 赋 值 对 随 后 的 程 序 不 其 任 何 作 用 而 已 但 是 在 IF 结 构 里, 不 满 足 条 件 的 情 形 是 不 被 执 行 的 WHERE 语 句 WH ERE 语 句 的 句 法 形 式 (R738) 为 : WHERE(logical-expression)array-assignment-statement 其 中 逻 辑 表 达 式 (logical-expression) 对 所 有 数 组 元 素 起 作 用, 就 相 当 于 一 个 过 滤 网, 使 得 表 达 式 结 果 为 TURE 的 数 组 元 素 被 赋 值 给 变 量, 而 表 达 式 结 果 为 FALSE 的 数 组 元 素 不 被 赋 值 给 变 量 例 9-10 WHERE(CURRENT>1.00)PASS=CURRENT WHERE(TEMP<0.40) USEFULL=TEMP WHERE 结 构 WHERE 结 构 的 句 法 形 式 (R739) 为 : [where-construct-name:] WHERE(logical-expression) [where-body-construct] [ELSEWHERE(logical-expression)[where-construct-name] [where-body-construct] ] [ELSEWHERE [where-construct-name] [where-body-construct] ] END WHERE [where-construct-name] 其 中 where 体 结 构 的 句 法 形 式 (R741) 为 : assignment-statement where-construct where-statement 在 初 始 WHERE 语 句 当 中 出 现 的 逻 辑 表 达 式 构 成 了 一 个 过 滤 网, 可 以 控 制 在 WHERE 体 结 构 里 给 出 的 数 组 赋 值 语 句 的 表 达 式 取 值 和 赋 值 如 果 逻 辑 表 达 式 在 ELSEWHERE 语 句 当 中 也 出 现, 那 么 该 语 句 就 成 为 了 过 滤 ELSEWHERE 语 句 例 9-11 INTEGER::N(9)=(/1,2,3,4,5,6,7,8,9/) WHERE(MOD(N,2)==0) N=2! 现 在 N=(/1,2,3,2,5,2,7,2,9/)

162 ELSEWHERE(MOD(N,3)==0) N=3! 现 在 N=(/1,2,3,2,5,2,7,2,3/) ELSEWHERE(MOD(N,5)==0) N=5! 现 在 N=(/1,2,3,2,5,2,7,2,3/) ELSEWHERE N=0! 现 在 N=(/0,2,3,2,5,2,0,2,3/) END WHERE 下 面 说 明 WHERE 结 构 的 用 法 : 一 个 结 构 名 称 不 能 单 独 出 现 在 初 始 WHERE 语 句, 或 END WHERE 语 句 里, 必 须 成 对 出 现 如 果 一 个 结 构 名 称 出 现 在 ELSEWHERE 语 句 里, 或 者 是 过 滤 ELSEWHERE 语 句 里, 那 么 它 也 必 定 出 现 在 WHERE 结 构 语 句 里 在 WHERE 结 构 的 每 个 赋 值 语 句 里, 被 定 义 的 变 量 必 须 和 过 滤 网 具 有 相 同 的 形 状, 如 果 在 WHERE 结 构 的 其 他 位 置 也 出 现 了 过 滤 网, 它 们 的 形 状 必 须 都 相 同 WHERE 结 构 里 的 语 句 按 照 其 出 现 的 顺 序 执 行 每 个 过 滤 网 的 有 效 取 值 只 有 一 次, 随 后 的 逻 辑 表 达 式 里 的 取 值 变 化 都 对 控 制 过 滤 网 的 值 没 有 影 响 WHERE 结 构 里 的 自 定 义 赋 值 必 须 由 基 本 子 例 行 程 序 定 义 只 有 在 控 制 过 滤 网 取 真 值 时, 赋 值 语 句 里 的 基 本 运 算 或 函 数 才 得 到 计 算 例 9-12 REAL X(1,100) WHERE(X>0.0) SQRTX=SQRT(X) END WHERE 如 果 在 结 构 的 逻 辑 表 达 式 或 赋 值 语 句 当 中 出 现 了 数 组 构 造 器, 那 么 它 将 不 经 过 过 滤 而 得 到 完 全 计 算 结 构 里 的 表 达 式 或 变 量 或 逻 辑 表 达 式 里 的 非 基 本 函 数 引 用 将 得 到 完 全 计 算, 尽 管 有 可 能 结 果 数 组 的 所 有 元 素 都 用 不 上 例 9-13 REAL A(2,3),B(3,10),C(2,10), D(2,10) IMTRINSIC MATMUL WHERE (D<0.0) C=MATMUL(A,B) END WHERE 其 中 矩 阵 乘 积 的 所 有 元 素 都 得 到 了, 但 是 只 有 小 于 0 的 元 素 才 得 到 赋 值 在 WHERE 结 构 里, 只 有 WHERE 语 句 才 能 成 为 分 支 目 标 WHERE 结 构 的 运 行 当 WHERE 结 构 开 始 运 行 的 时 候, 其 中 的 控 制 过 滤 网 和 候 选 过 滤 网 就 都 已 经 建 立 了, 而 控 制

163 过 滤 网 主 宰 了 随 后 的 语 句 块 的 执 行 如 果 WHERE 结 构 不 是 嵌 套 WHERE 结 构, 那 么 控 制 过 滤 mask 取 得 逻 辑 表 达 式 的 值, 而 候 选 过 滤 网 的 值 为.NOT.mask 例 9-14 WHERE(A1)! 语 句 1 CALL B1! 块 1 ELSEWHERE(A2)! 语 句 2 CALL B2! 块 2 ELSEWHERE! 语 句 3 CALL B3! 块 3 END WHERE 在 执 行 语 句 1 之 后, 控 制 过 滤 网 的 值 为 A1, 而 候 选 过 滤 网 的 值 为.NOT.A1; 在 执 行 语 句 2 之 后, 控 制 过 滤 网 的 值 为 (.NOT.A1).AND.A2, 而 候 选 过 滤 网 的 值 为 (.NOT.A1).AND(.NOT..A2); 在 执 行 语 句 3 之 后, 控 制 过 滤 网 的 值 为 (.NOT.A1).AND(.NOT..A2) 如 果 WHERE 结 构 是 嵌 套 WH ERE 结 构, 还 是 以 上 面 的 例 子 来 说 明 运 行 过 程 : 如 果 最 外 层 主 宰 着 块 内 的 语 句 运 行 的 初 始 控 制 过 滤 网 是 outer-mask, 那 么 块 1 的 控 制 过 滤 网 取 值 为 outer-mask.and.a1, 从 这 个 初 始 状 态 开 始, 就 可 以 得 到 向 内 嵌 套 过 程 的 每 个 控 制 过 滤 网 取 值, 即 总 是 向 内 取 逻 辑 与 运 算 到 运 行 内 部 END WHERE 语 句 时, 控 制 过 滤 网 就 回 复 到 outer-mask WHERE 结 构 与 控 制 结 构 的 差 别 WHERE 结 构 与 控 制 结 构 的 主 要 差 别 在 前 面 9.4 已 经 讨 论 过, 除 此 之 外, 还 有 个 差 别, 就 是 在 WHERE 结 构 里, 不 存 在 从 WHERE 块 或 ELSEWHERE 块 里 转 移 出 来 的 机 制, 当 然 除 了 使 用 函 数 引 用 之 外 因 为 在 这 些 块 里 都 不 允 许 分 支 语 句 WH ERE 结 构 还 有 一 个 特 征, 就 是 在 结 构 前 面 块 里 的 语 句 的 执 行, 会 影 响 后 面 块 里 的 变 量 引 用, 因 为 所 有 块 里 的 语 句 都 会 顺 序 得 到 执 行 9.5 并 行 指 标 数 组 赋 值 在 数 学 计 算 当 中, 经 常 会 遇 到 如 下 的 计 算 任 务 : x = i j ij 2 2, 对 于 i 从 1 到 n,j 从 1 到 m x ii = y i, 对 于 i 从 1 到 n 其 中 第 一 个 计 算 可 以 使 用 嵌 套 DO 循 环 描 述 如 下 : DO J=1,M DO I=1,N X(I,J)=I**2-J**2

164 END DO END DO 不 过 这 种 实 现 方 法 完 全 没 有 利 用 数 组 这 种 强 大 的 数 据 结 构, 而 在 很 多 系 统 里 面, 通 过 利 用 数 组, 可 以 更 加 有 效 地 完 成 上 面 类 型 的 计 算 任 务 对 于 FORTRAN 而 言, 除 了 运 用 DO 循 环 之 外, 运 用 固 有 函 数 SPREAD, 再 采 用 数 组 赋 值 的 形 式, 也 可 以 完 成 上 面 的 计 算 : X=SPREAD((/(I,I=1,N)/),DIM=2,NCOPIES=M)**2-& SPREAD((/(I,I=1,M)/),DIM=1,NCOPIES=N) 而 在 FORTRAN 里, 一 种 更 加 自 然 的 计 算 方 法 是 使 用 FORALL 语 句 该 语 句 充 分 发 挥 了 数 组 在 数 据 结 构 方 面 的 特 点, 使 得 这 种 计 算 更 加 有 效 率 : FORALL (I=1:N,J=1:M)X(I,J)=I**2-J**2 显 然, 在 这 种 计 算 方 法 里 面,FORALL 能 够 直 接 把 数 组 元 素 和 片 断 引 用 到 表 达 式 里 面, 不 仅 使 得 计 算 过 程 一 目 了 然, 而 且 表 现 了 并 行 计 算 的 优 越 性 对 于 上 面 的 第 二 个 数 学 计 算 任 务, 它 不 能 使 用 数 组 片 断 来 描 述, 但 FORALL 语 句 则 能 够 把 秩 为 1 的 数 组 Y 的 元 素 赋 值 给 数 组 X 的 对 角 线 : FORALL(I:N)X(I,I)=Y(I) 如 此 就 轻 松 自 然 地 完 成 了 计 算 任 务 在 关 键 词 FORALL 后 面 的 括 号 部 分 称 为 FORALL 头, 它 能 够 对 后 面 的 多 个 语 句 发 挥 控 制 作 用 例 9-15 FORALL (I=2:N-1,J=2:N-1) A(I,J)=(A(I+1,J)+A(I-1,J)+A(I,J+1)+A(I,J-1))/10.0 B(I,J)=10.0/A(I+1,J+1) END FORALL 在 FORALL 语 句 与 END FORALL 语 句 之 间 的 部 分, 称 为 FORALL 体,FORALL 体 里 面 可 以 包 含 如 下 内 容 : 赋 值 语 句 ; 指 针 赋 值 语 句 ; WHERE 结 构 和 语 句 ; FORALL 结 构 和 语 句 FORALL 体 可 以 包 含 FORALL 结 构 和 语 句, 也 就 是 说 FORALL 结 构 可 以 嵌 套 FOR ALL 体 的 结 构 和 语 句 的 执 行 是 顺 序 往 下 执 行 的, 所 有 右 边 的 表 达 式 对 所 有 的 指 标 进 行 求 值 计 算 时, 对 于 不 同 的 指 标 的 求 值 计 算, 则 是 按 照 任 意 次 序, 当 这 样 的 计 算 都 完 成 之 后, 随 即 进 行 的 赋 值 也 是 按 照 任 意 的 次 序 所 以 尽 管 FORALL 语 句 构 造 了 一 个 循 环 结 构, 但 是 每 当 针 对 结 构 里 的 一 个 语 句 进 行 求 值 时, 被 认 为 是 进 行 并 行 指 标 运 算, 每 完 成 一 个 语 句 的 所 有 指 标 的 运 算, 才 转 到 下 一 个 语 句 的 计 算, 因 此 具 体 的 在 计 算 每 个 语 句 的 所 有 指 标 时, 到 底 系 统 是 按 照 什 么 顺 序, 是 不 需 要 规 定 的, 完 全 依 靠 具 体 的 系 统 的 自 身 特 定 来 实 现, 在 FORTRAN 语 言 层 面 上 不 加 以 规 定, 因 此 使 得 FORALL 结 构

165 具 有 了 与 控 制 结 构 完 全 不 同 的 特 征, 因 为 所 谓 控 制 结 构, 是 对 每 一 个 指 标 的 运 算 都 加 以 控 制 的, 因 此 在 执 行 控 制 语 句 时, 不 得 不 制 定 不 同 指 标 的 运 算 顺 序 FORALL 的 优 越 性 正 是 体 现 在 这 里, 因 为 语 言 没 有 规 定 的 对 指 标 的 计 算, 完 全 可 能 在 某 些 系 统 里 面 是 并 行 进 行 的, 这 样 的 话, 一 下 子 就 使 得 数 组 具 有 了 并 行 计 算 的 特 征, 从 而 可 以 大 大 地 提 高 程 序 运 行 的 效 率 有 时, 可 能 需 要 排 除 一 些 元 素, 这 时, 就 需 要 在 FORALL 头 里 加 入 一 个 过 滤 表 达 式 例 9-16 FORALL(I=1:N,J-=1:M,A(I)<100.AND.B(I)<100)& C(I,J)=A(I)+B(J) FORALL 结 构 在 FORALL 头 里 的 说 明 三 项 列, 再 加 上 可 选 的 过 滤 网, 就 可 以 控 制 FORALL 体 内 的 多 种 赋 值 语 句, WHERE 结 构 与 语 句, 以 及 嵌 套 FORALL 语 句 与 结 构 下 面 我 们 分 形 式 与 运 行 两 个 部 分 来 讨 论 FORALL 结 构 1. FORALL 结 构 的 形 式 FOR ALL 结 构 的 句 法 形 式 (R747) 为 : [forall-construct-name:]forall(forall-triplet-specification-list & [,scalar-logical-expression]) [forall-body-construct] END FORALL [forall-construct-name] 其 中 的 forall 说 明 三 项 (forall-triplet-specification) 的 句 法 形 式 (R750) 为 : index-name = scalar-integer-expression:& scalar-integer-expression [:scalar-integer-expression] 其 中 的 forall 体 结 构 的 句 法 形 式 (R751) 为 : assignment-statement pointer- assignment-statement where-construct where-statement forall-construct forall-statement FORALL 结 构 的 一 般 规 则 如 下 : 结 构 名 称 必 须 在 FORALL 语 句 与 END FORALL 语 句 里 成 对 出 现, 或 者 都 不 出 现 指 标 名 称 必 须 是 一 个 标 量 整 型 变 量 的 名 称 该 名 称 的 作 用 域 与 FORALL 结 构 的 作 用 域 一 致, 并 且 在 该 作 用 域 内 保 持 自 己 的 属 性 不 变 例 9-17 SUBROUTING OPE(I,X) INTEGER,INTENT(IN)::I

166 INTEGER X(:) FORALL(I=1:SIZE(X)) X(I)=I END FORALL.. END SUBROUTING OPE 在 执 行 了 上 面 的 FORALL 结 构 之 后,X 取 值 为 (1,2, ), 而 I 保 持 它 在 刚 进 入 子 例 行 程 序 时 的 取 值 不 变 ; 在 FORALL 结 构 里 对 I 的 定 义 过 程 也 不 影 响 I 的 意 向 属 性 IN 在 说 明 三 项 里 的 表 达 式 里 面, 不 能 引 用 它 所 在 的 说 明 三 项 列 里 的 指 标 名 称 例 9-18 下 面 的 FORALL 语 句 是 错 误 的 : FORALL(I=1:J,J=1:M)A(I,J)=I*2+J*3 必 须 换 一 种 写 法 如 下, 才 是 有 效 的 : FORALL(I=1:N,J=1:M,I<=J)A(I,J)=I*2+J*3 一 个 标 量 逻 辑 型 表 达 式 定 义 了 一 个 过 滤 网, 其 中 可 以 引 用 指 标 名 称 例 9-19 FORALL(I=1:100,J=1:100,X(I)/=0.0.AND. Y(J) >0.0) END FORALL 在 定 义 过 滤 网 的 逻 辑 表 达 式 或 FORALL 体 结 构 里 的 任 意 位 置, 要 引 用 过 程 的 话, 该 过 程 必 须 是 纯 粹 过 程 在 FORALL 体 结 构 里 指 标 名 称 不 能 被 加 以 赋 值 FORALL 结 构 里 的 单 个 语 句 不 能 进 行 多 对 一 的 赋 值 例 9-20 FORALL(J=1:30) X(INDEX(J))=Y END FORALL 上 面 的 赋 值 只 有 在 INDEX(1:30) 不 包 含 重 复 值 的 情 形 下 才 能 进 行, 不 过 在 FORALL 结 构 里, 可 以 通 过 使 用 多 个 语 句 做 到 赋 值 或 指 针 赋 值 到 同 一 个 数 据 FORALL 体 结 构 不 能 是 分 支 结 构 每 个 说 明 三 项 列 里 的 指 标 名 称, 是 可 以 出 现 在 被 赋 值 的 变 量 的 下 标 或 片 断 下 标 列 表 里 面 FORALL 结 构 里 的 赋 值 语 句 可 以 是 数 组 赋 值 语 句 例 9-21 REAL X(100,100) FORALL(I=1:N) X(I,:)=1.0/REAL(I)

167 上 面 的 赋 值 语 句 把 一 个 标 量 值 1.0/REAL(I) 赋 值 到 数 组 X 的 第 2 维 的 每 个 坐 标 上 FORALL 结 构 里 的 赋 值 语 句 可 以 是 指 针 赋 值 语 句 例 9-22 TYPE SCREW CHARACTER(20),POINTER::HEAD_TYPE REAL LENGTH,THREAD END TYPE SCREW TYPE(SCREW) INVENTORY(500) REAL THREAD(100) CHARACTER(20), TARGET:: HEAD_TYPES(5) FORALL (I=1:500, INVENTORY(I)%LENGTH>.05) INVENTORY(I)% HEAD_TYPE=> HEAD_TYPES & (MOD(I-1, 5)+1! HEAD_TYPES 的 下 标 是 1,2,3,4,5,1,2,3,4,5, INVENTORY(I)%THREAD=THREADS((I-1)/5+1)! THREADS 的 下 标 是 1,1,1,1,1,2,2,2,2,2,3,3,3,3,3, END FORALL 所 谓 三 项 说 明 实 际 上 就 是 一 个 三 元 组, 即 : scalar-integer-expression:scalar-integer-expression:scalar-integer-expression 可 以 理 解 为 一 个 数 学 上 常 规 的 三 元 组, 三 元 组 它 的 取 值 的 集 合 即 对 这 3 个 表 达 式 值 的 集 合 的 笛 卡 儿 乘 积 2. FORALL 结 构 的 运 行 FORALL 结 构 的 运 行 分 如 下 3 个 步 骤 : 确 定 指 标 名 称 变 量 的 取 值 ; 如 果 存 在 过 滤 网 表 达 式 的 话, 计 算 该 表 达 式 ; 执 行 体 结 构 1. 确 定 指 标 名 称 变 量 的 取 值 首 先 对 指 标 名 称 变 量 求 值, 得 到 指 标 值 的 集 合 对 三 元 组 里 的 3 个 标 量 整 型 表 达 式 的 求 值, 可 以 是 任 意 次 序 如 果 有 必 要 的 话, 需 要 把 结 果 值 的 类 型 转 换 为 指 标 名 称 的 类 型 设 3 个 表 达 式 分 别 为 m1,m2,m3, 那 么 指 标 值 的 数 目 由 如 下 公 式 决 定 : n=(m2-m1+m3)/m3 其 中 如 果 m3 不 存 在 的 话, 取 默 认 值 1 如 果 n 小 于 或 等 于 0, 那 么 整 个 结 构 的 执 行 就 到 此 为 止, 否 则 指 标 名 称 的 值 的 集 合 就 是 m1+(k-1)*m3 而 指 标 值 组 合 的 集 合 由 每 个 三 项 说 明 给 出 的 值 集 合 的 笛 卡 儿 乘 积 决 定 2. 计 算 过 滤 网 表 达 式

168 过 滤 网 逻 辑 表 达 式 的 结 果 为 TURE 时, 就 从 上 面 步 骤 得 到 的 指 标 值 的 组 合 的 集 合 ( 一 个 笛 卡 儿 乘 积 ) 里 选 择 出 一 个 子 集 合, 被 称 为 指 标 值 的 激 活 组 合 3. 执 行 体 结 构 FORALL 体 结 构 里 的 可 能 的 执 行 单 位 类 型 包 括 : 赋 值 语 句 ; 指 针 赋 值 语 句 ; WHERE 结 构 或 语 句 ; 嵌 套 FORALL 结 构 或 语 句 整 个 体 结 构 的 执 行 次 序, 就 是 按 照 各 个 执 行 单 位 出 现 的 先 后 次 序 当 每 个 单 位 得 到 执 行 时, 必 须 遍 历 所 有 的 指 标 值 的 激 活 组 合 下 面 分 类 型 予 以 说 明 : 赋 值 语 句 赋 值 语 句 的 一 般 形 式 为 variable = expression 因 此 赋 值 语 句 的 执 行 包 括 两 个 部 分, 即 表 达 式 对 指 标 的 求 值, 和 每 得 到 一 个 表 达 式 的 值 就 进 行 相 应 的 赋 值 因 此 每 个 部 分 都 必 须 遍 历 所 有 的 指 标 值 的 激 活 组 合, 这 种 遍 历 是 不 规 定 次 序 的 也 就 是 被 称 为 并 行 指 标 计 算 的 来 源 如 果 赋 值 过 程 为 自 定 义 赋 值, 那 么 定 义 该 赋 值 的 子 例 行 程 序 不 能 包 含 对 任 何 被 赋 值 的 变 量, 或 被 关 联 的 指 针 的 引 用 指 针 赋 值 语 句 指 针 赋 值 语 句 的 一 般 形 式 为 pointer-object=>target 因 此 与 赋 值 语 句 类 似, 指 针 赋 值 过 程 也 包 括 两 个 部 分, 即 目 标 表 达 式 对 指 标 的 求 值, 和 每 得 到 一 个 目 标 的 值 就 进 行 相 应 的 关 联 因 此 每 个 部 分 都 必 须 遍 历 所 有 的 指 标 值 的 激 活 组 合, 这 种 遍 历 同 样 是 不 规 定 次 序 的 WHERE 结 构 或 语 句 ; WHERE 结 构 里 的 语 句 都 是 按 照 出 现 的 顺 序 执 行 的 首 先 是 WHERE 语 句 或 结 构, 以 及 ELSEWHERE 语 句 里 的 过 滤 网 对 所 有 的 由 外 部 FORALL 结 构 给 出 的 指 标 值 的 激 活 组 合 进 行 过 滤, 如 果 WHERE 结 构 嵌 套 的 话, 则 需 要 一 直 过 滤 到 最 里 层, 然 后 其 中 的 赋 值 语 句 再 对 所 有 经 过 过 滤 剩 下 的 指 标 值 的 激 活 组 合 进 行 赋 值 操 作 例 9-23 INTEGER X(5,4) INT_WHERE: FORALL (I=1:5) WHERE(X(I,:)==0) X(I,:)=I END FORALL INT_WHERE 如 果 X 取 初 始 值 :

169 那 么 运 算 的 结 果 为 : 嵌 套 FORALL 结 构 或 语 句 内 部 FORALL 结 构 或 语 句 的 头 里 的 三 项 列 中 的 表 达 式 的 计 算 是 对 外 部 FORALL 结 构 的 指 标 值 的 激 活 组 合 进 行 的, 每 个 表 达 式 由 此 得 到 的 值 的 集 合 组 合 起 来, 即 得 到 该 层 FORALL 结 构 的 指 标 值 组 合 集 合 然 后 再 通 过 其 中 的 过 滤 网 得 到 它 的 指 标 值 的 激 活 组 合 的 集 合, 再 用 这 个 指 标 值 集 合 来 控 制 其 中 的 赋 值 语 句 例 9-24 INTEGER X(3,3) OUTER:FORALL(I=1:N-1) INTER:FORALL(J=I+1:N) X(I,J)=X(J,I) END FORALL INTER END FORALL OUTER 如 果 N 取 值 3,X 取 初 始 值 为 : 那 么 经 过 上 面 程 序 的 运 算, 得 到 值 : FORALL 语 句 FORALL 语 句 通 过 一 个 指 标 值 集 合 以 及 可 选 的 过 滤 网, 对 单 独 一 个 赋 值 语 句 或 指 针 赋 值 语 句 进 行 控 制 FORALL 语 句 的 一 般 形 式 (R754) 为 : FORALL(forall-triplet-specification-list [,scalar-logical-expression])&

170 forall-assignment-statement 其 中 forall 赋 值 语 句 的 句 法 形 式 (R752) 为 : assignment-statement pointer- assignment-statement FORALL 语 句 实 际 上 可 以 把 它 看 成 是 只 包 含 一 个 为 赋 值 语 句 或 指 针 赋 值 语 句 的 体 结 构 的 FORALL 结 构, 它 的 运 行 过 程 就 是 那 个 FORALL 结 构 的 运 行 过 程, 其 中 头 里 面 的 指 标 的 作 用 域 就 是 该 语 句 自 身 上 面 有 关 嵌 套 FORALL 结 构 的 例 子 里 面 的 嵌 套 FORALL 结 构 的 功 能 可 以 使 用 一 个 单 独 的 FORALL 语 句 来 表 达 : FORALL(I=1:N-1,J=1:N,J>I)X(I,J)=X(J,I) 第 10 章 基 本 计 算 ( 二 ) 选 择 控 制 结 构 在 上 章 我 们 可 以 看 到, 赋 值 语 句 之 所 以 能 够 驱 动 计 算 过 程 的 运 行, 除 了 赋 值 语 句 本 身 构 成 完 整 的 运 算 求 值 指 令 之 外, 计 算 机 本 身 所 具 有 的 串 行 机 制 保 证 了, 只 要 把 执 行 语 句 与 说 明 语 句 串 列 下 来, 然 后 保 证 数 据 对 象 流 的 畅 通, 计 算 机 就 能 够 按 照 语 句 序 列 的 次 序 依 次 执 行 下 来, 从 而 完 成 相 应 的 计 算 任 务 不 过 分 析 一 下 我 们 的 实 际 计 算 任 务, 就 会 发 现 真 正 完 全 可 以 只 需 要 按 照 一 个 固 有 计 算 序 列 算 下 来, 就 可 以 完 成 计 算 的 问 题 只 是 少 数 简 单 的 问 题 而 已, 稍 微 复 杂 点 的 问 题 往 往 都 需 要 在 计 算 过 程 当 中 出 现 某 种 判 别 问 题, 使 得 计 算 途 径 可 以 分 支, 对 不 同 的 情 形, 会 有 不 同 的 计 算 途 径 与 不 同 的 计 算 结 果 ; 还 会 出 现 反 复 进 行 同 一 种 运 算, 然 后 再 在 适 当 的 条 件 下 跳 出 循 环 的 情 形, 如 果 只 是 使 用 串 行 序 列 来 描 述 此 时 的 运 算 过 程, 会 使 得 程 序 的 写 作 充 满 重 沓 的 语 句 显 然 这 些 类 型 的 计 算 任 务, 或 者 是 语 句 串 行 序 列 无 法 描 述 的, 或 者 是 描 述 发 生 令 人 难 以 忍 受 的 所 以 一 种 描 述 计 算 过 程 的 语 言, 除 了 可 以 构 成 串 行 的 计 算 序 列 之 外, 还 必 须 能 够 控 制 这 个 序 列 有 可 能 出 现 的 选 择 分 支 与 循 环 的 情 形, 这 就 是 所 谓 语 言 的 控 制 结 构 本 章 和 下 章, 我 们 将 分 别 讨 论 FORTRAN 所 提 供 的 两 种 类 型 的 控 制 结 构 以 及 相 应 的 控 制 语 句 : 选 择 控 制 结 构 ; 循 环 控 制 结 构 把 程 序 序 列 当 中 的 控 制 结 构 清 晰 地 加 以 强 调 出 来, 实 际 上 既 有 助 于 程 序 的 阅 读, 也 是 符 合 人 的 思 维 的 清 晰 性 原 则 的, 因 此 控 制 结 构 的 规 范 化 正 是 编 程 语 言 追 求 结 构 化 的 一 个 主 要 着 力 点, 但 是 在 早 期 FORTRAN 版 本 里 面, 并 没 有 完 全 意 识 到 结 构 化 编 程 风 格 的 重 要 性, 因 此 引 入 了 一 些 常 常 破 坏 结 构 的 转 移 控 制 语 句, 而 FORTRAN 语 言 的 现 代 版 本 还 没 有 完 全 放 弃 它 们, 但 不 提 倡 使 用, 这 些 转 移 控 制 语 句 我 们 在 下 章 也 将 简 略 地 讨 论 到

171 10.1 执 行 顺 序 一 个 完 整 的 FORTRAN 程 序, 或 程 序 单 位, 就 给 出 了 一 个 由 可 执 行 语 句 引 导 的 语 句 执 行 序 列, 这 个 序 列 就 是 语 句 在 程 序 里 面 出 现 的 序 列, 称 为 正 常 运 行 序 列 但 是 某 些 可 执 行 结 构 或 可 执 行 语 句, 能 够 控 制 实 际 的 语 句 运 行 不 止 是 按 照 语 句 书 写 的 序 列 进 行, 这 样 的 可 执 行 结 构 或 语 句 包 括 控 制 结 构 和 分 支 语 句 控 制 语 句 执 行 序 列 有 两 种 基 本 风 格 : 使 用 可 执 行 结 构, 使 得 程 序 能 够 选 择 性 地 运 行 程 序 序 列 里 某 个 特 定 位 置 的 语 句 块 或 结 构 使 用 能 够 分 支 到 程 序 其 他 任 意 位 置 的 语 句 的 可 执 行 语 句 一 般 说 来, 上 面 的 第 一 种 方 式 具 有 更 好 的 可 阅 读 性 和 可 维 护 性, 因 此 我 们 将 详 细 讨 论 第 一 种 方 式 的 实 现, 而 第 二 种 方 式 则 放 在 下 章 末 尾 简 略 说 明 一 下 10.2 块 与 可 执 行 结 构 所 谓 控 制 结 构 由 一 个 或 多 个 语 句 块 和 结 构 构 成, 其 中 必 定 显 式 地 或 隐 式 地 包 含 控 制 逻 辑 语 句 根 据 相 应 的 逻 辑 控 制 条 件, 就 可 以 选 择 性 地 运 行 某 个 特 定 的 语 句 块 与 结 构 一 个 块 就 是 一 个 由 0 个 或 多 个 语 句 与 结 构 构 成 的 序 列, 句 法 形 式 (R801) 为 : [execution-part-construct] 构 成 块 的 语 句 与 结 构 的 序 列 构 成 一 个 程 序 单 位, 是 一 个 某 种 意 义 上 的 整 体, 即 或 者 整 个 块 被 执 行, 或 者 整 个 块 都 不 被 执 行, 不 能 够 出 现 块 的 某 个 部 分 被 执 行 的 情 形 不 过 也 可 能 出 现 在 整 个 块 被 执 行 的 情 况 下, 块 内 的 某 些 语 句 没 有 被 执 行 的 情 况, 例 如 在 块 内 的 比 较 靠 前 的 分 支 语 句, 常 常 能 够 制 止 它 后 面 的 语 句 得 到 执 行, 但 是 从 语 法 意 义 上 来 看, 整 个 块 的 功 能 得 到 了 完 整 的 实 现, 因 此 这 种 情 形 也 被 认 为 是 块 的 完 全 执 行 所 谓 结 构 就 是 由 一 个 或 多 个 语 句 块 或 者 结 构, 加 上 作 用 于 这 些 块 的 控 制 语 句 构 成 结 构 通 常 在 块 前 具 有 一 个 初 始 语 句, 而 在 块 后 具 有 一 个 终 止 语 句 ; 当 结 构 包 含 不 止 一 个 块 时, 结 构 必 定 包 含 了 用 来 选 择 执 行 哪 个 块 的 条 件 语 句, 而 一 个 块 是 否 被 执 行, 正 是 由 结 构 的 作 为 条 件 语 句 的 控 制 逻 辑 语 句 当 中 的 表 达 式 决 定 的 ; 结 构 也 有 可 能 在 块 之 间 放 置 特 定 的 语 句, 用 来 决 定 相 应 的 块 是 否 被 执 行 ; DO 结 构 专 门 用 来 决 定 一 个 块 可 以 被 连 续 地 执 行 的 次 数 例 10-1 下 面 给 出 的 可 执 行 结 构 控 制 了 一 个 块 : IF(K<=1)THEN X=K**2 Y=SIN(X) END IF!IF 结 构 的 初 始 语 句! 块 的 第 一 个 语 句! 块 的 第 二 个 语 句!IF 结 构 的 终 止 语 句 FORTRAN 提 供 了 三 种 能 够 控 制 块 的 可 执 行 结 构 : IF 结 构 CASE 结 构 DO 结 构 块 的 一 般 规 则 如 下 :

172 首 先 执 行 块 内 的 第 一 个 语 句 或 结 构, 随 后 的 执 行 顺 序 就 是 语 句 的 排 列 顺 序, 除 非 中 间 包 含 控 制 结 构 或 语 句 改 变 这 个 顺 序 一 个 块 作 为 一 个 整 体, 必 须 是 完 整 地 被 包 含 在 一 个 结 构 当 中 ; 一 个 块 也 可 以 是 空 块, 即 不 包 含 任 何 语 句 与 结 构 在 块 内 允 许 出 现 分 支 结 构 或 控 制 结 构, 使 得 运 行 序 列 能 够 转 移 到 该 块 内 的 特 定 语 句 或 结 构 在 块 内 的 任 意 位 置, 都 可 以 强 制 运 行 的 退 出 从 块 的 外 部 通 过 分 支 到 达 块 的 内 部, 哪 怕 是 块 内 的 第 一 个 可 执 行 语 句, 都 是 禁 止 的 块 内 可 以 引 用 过 程 结 构 可 以 具 有 结 构 名 称 结 构 名 称 在 结 构 的 初 始 语 句 和 终 止 语 句 当 中 的 出 现, 必 须 是 成 对 的, 也 就 是 说 或 者 同 时 出 现 在 这 两 个 位 置, 或 者 都 不 出 现 在 上 章 我 们 讨 论 了 WHERE 结 构 与 FORALL 结 构, 它 们 似 乎 同 样 具 有 控 制 结 构 的 功 能, 但 实 质 上 它 们 都 是 属 于 赋 值 语 句 WHERE 结 构 可 以 包 含 多 个 块, 但 是 除 了 块 内 的 某 些 数 组 元 素 被 过 滤 网 过 滤 掉, 从 而 不 参 与 计 算 之 外, 每 个 块 内 的 每 个 语 句, 都 必 须 被 执 行 FORALL 结 构 只 包 含 一 个 块, FORALL 对 这 个 块 的 执 行 控 制, 不 是 反 复 地 运 行 这 个 块, 而 是 其 中 的 每 个 语 句 都 必 须 对 指 标 值 集 合 里 的 所 有 元 素 执 行 一 次, 然 后 才 转 入 下 一 个 语 句 在 FORALL 结 构 里 也 可 以 引 入 过 滤 网, 以 排 除 掉 不 符 合 条 件 的 计 算 10.3 IF 结 构 和 IF 语 句 一 个 IF 结 构 至 多 选 择 结 构 里 的 一 个 语 句 与 结 构 的 块 来 得 到 执 行 而 一 个 IF 语 句 至 多 控 制 一 个 语 句 的 执 行 在 下 章 后 面 会 简 略 讨 论 到 的 算 术 IF 语 句 与 这 里 的 IF 语 句 没 有 关 系, 算 术 IF 语 句 是 一 种 分 支 语 句, 并 且 是 过 时 的 IF 结 构 IF 结 构 可 以 包 含 多 个 块 与 多 个 逻 辑 表 达 式, 还 可 能 包 含 ELSE 语 句 与 ELSE IF 语 句 逻 辑 表 达 式 总 是 放 置 在 相 应 的 块 之 前, 因 此 IF 结 构 的 执 行 总 是 从 逻 辑 表 达 式 开 始 的, 一 旦 逻 辑 表 达 式 取 真 值, 则 相 应 的 块 获 得 执 行, 整 个 IF 结 构 内 至 多 只 有 一 个 块 能 够 被 选 择 执 行, 而 如 果 没 有 ELSE 语 句 的 话, 可 能 没 有 块 满 足 执 行 的 条 件 一 旦 被 选 择 执 行 的 块 运 行 完 毕, 或 者 不 存 在 满 足 执 行 条 件 的 块, 则 整 个 IF 结 构 的 运 行 被 终 止 1. IF 结 构 的 形 式 IF 结 构 的 句 法 形 式 (R802) 为 : [if-construct-name:] IF(scalar-logical-expression) THEN block [ELSE IF(scalar-logical-expression)THEN[if-construct-name]

173 block]. [ELSE [if- construct-name] block] END IF [if-construct-name] IF 结 构 的 一 般 规 则 如 下 : 至 多 只 有 一 个 结 构 里 的 块 被 执 行, 或 者 没 有 块 被 执 行 ELSE IF 语 句 不 能 跟 随 在 ELSE 语 句 后 面 不 能 出 现 分 支 到 ELSE IF 语 句 或 ELSE 语 句 的 情 形 从 IF 结 构 里 的 任 意 块 都 可 以 分 支 到 END IF 语 句, 即 随 时 可 以 退 出 IF 结 构 结 构 名 称 必 须 成 对 出 现 在 IF-THEN 语 句 和 END IF 语 句 当 中 ELSE IF 语 句 和 ELSE 语 句 里 的 结 构 名 称 是 可 选 的, 如 果 有 的 话, 必 须 和 IF-THEN 语 句 里 的 结 构 名 称 一 致 在 同 一 个 作 用 域 单 位 内, 同 一 个 结 构 名 称 不 能 用 于 不 同 的 命 名 结 构 2. IF 结 构 的 运 行 结 构 里 的 逻 辑 表 达 式 按 照 序 列 位 置 执 行, 直 到 某 个 表 达 式 为 真 值, 然 后 紧 跟 该 表 达 式 后 面 的 块 得 到 执 行, 该 块 运 行 完 毕 之 后, 整 个 IF 结 构 即 退 出 运 行 在 第 一 个 真 值 表 达 式 后 面 如 果 还 存 在 真 值 表 达 式, 则 它 们 不 影 响 对 执 行 块 的 选 择 如 果 在 该 IF 结 构 内 ( 而 不 是 它 的 子 结 构 内 ) 找 不 到 真 值 表 达 式, 则 ELSE 语 句 后 面 的 块 被 执 行 ; 如 果 没 有 ELSE 语 句, 则 退 出 IF 结 构 下 面 的 图 10-1 给 出 了 IF 结 构 的 运 行 示 意 图 例 10-2 IF(I<J)THEN X=Y*2.5 ELSE IF(I>8.3)THEN X=0.0 Y=100 ELSE X=100 Y=0.0 END IF 上 例 的 执 行 顺 序 就 是 : 首 先 执 行 I<J, 如 果 为 真, 则 执 行 X=Y*2.5; 如 果 为 假, 则 执 行 紧 跟 后 面 的 ELSE IF -THEN 语 句 进 入 ELSE IF-THEN 语 句 后, 首 先 执 行 I>8.3, 如 果 为 真, 则 执 行 X=0.0,Y=100; 如 果 为 假, 则 执 行 紧 跟 后 面 的 ELSE 语 句 进 入 ELSE 语 句 后, 执 行 X=100,Y=0.0

174 然 后 执 行 END IF 语 句, 退 出 该 IF 结 构 图 10-1 IF 结 构 的 运 行 流 示 意 图 IF 语 句 一 个 IF 语 句 用 在 只 需 要 控 制 一 个 语 句 的 场 合 1. IF 语 句 的 形 式 IF 语 句 的 句 法 形 式 (R807) 为 ; IF(scalar-logical-expression)action-statement 例 10-3 IF(X=0)Y=X+1

175 2. IF 语 句 的 运 行 首 先 执 行 逻 辑 表 达 式, 如 果 为 真 值, 则 执 行 IF 语 句 里 的 作 用 语 句 (action-statement); 如 果 为 假, 则 退 出 该 语 句, 执 行 程 序 里 跟 在 IF 语 句 后 面 的 其 他 语 句 注 意 作 用 语 句 (action-statement) 不 能 是 一 个 IF 语 句, 也 不 能 是 一 个 END 语 句 如 果 逻 辑 表 达 式 包 含 一 个 函 数 引 用, 那 么 逻 辑 表 达 式 的 运 行 可 能 产 生 修 改 作 用 语 句 的 副 作 用, 这 是 允 许 的 作 用 语 句 能 够 改 变 变 量, 或 输 入 输 出 系 统 条 件, 或 控 制 语 句 的 状 态, 作 用 语 句 的 例 子 包 括 赋 值,WRITE, GO TO 语 句 等 ; 说 明 性 语 句,FORMAT 语 句, 和 ENTRY 语 句 等 不 属 于 作 用 语 句, 而 结 构 也 不 能 看 成 是 作 用 语 句 10.4 CASE 结 构 和 IF 结 构 类 似 的 是,CASE 结 构 也 可 以 包 含 多 个 块, 而 最 终 能 够 获 得 执 行 的 最 多 只 能 是 一 个 和 IF 结 构 不 同 的 是,CASE 结 构 的 选 择 是 基 于 结 构 开 头 的 SELECT CASE 语 句 里 的 标 量 表 达 式 的 取 值, 这 个 取 值 被 称 为 情 况 指 标, 它 可 以 是 离 散 型 的 各 种 标 量 值, 例 如 整 型, 字 符 型, 逻 辑 型, 而 在 IF 结 构 里, 用 来 进 行 判 别 而 提 供 选 择 条 件 的 是 逻 辑 型 取 值, 即 只 有.TURE. 和.FALSE. 两 个 值 得 到 情 况 指 标 之 后, 搜 索 所 有 的 CASE 语 句 里 的 情 况 选 择 符 的 值, 如 果 有 与 情 况 指 标 匹 配 的, 则 执 行 相 应 的 CASE 语 句 里 的 块, 否 则 执 行 具 有 默 认 选 择 符 的 CASE, 如 果 不 存 在 具 有 默 认 选 择 符 的 CASE, 则 退 出 使 用 CASE 结 构 可 以 很 自 然 地 表 达 需 要 分 情 况 考 虑 的 问 题, 同 时 每 种 情 况 的 定 义 必 须 是 已 知 的 例 10-4 设 分 段 函 数 : sin( x) x 0 y = cos( x) x< 0 可 以 很 自 然 地 使 用 CASE 结 构 描 述 如 下 : SELECT CASE(x>=0) CASE(.TRUE.) Y=SIN(X) CASE(.FALSE.) Y=COS(X) END SELECT 例 10-5 一 年 中 十 二 个 月 的 天 数 也 可 以 用 CASE 结 构 表 示 如 下 : MONTHDAY :SELECT CASE(MONTH) CASE(2) DAYS=28 CASE(4,6,9,11) DAYS=30 CASE(1,3,5,7,8,10,12)

176 DAYS=31 END SELECT MONTHDAY CASE 结 构 的 形 式 CA SE 结 构 的 句 法 形 式 (R808) 为 : [case-construct-name:]select CASE(case-expression) [CASE(case-value-range-list)[case-construct-name] block] [CASE DEFAULT[case-construct-name] block] END SELECT [case-construct-name] 其 中 的 情 况 表 达 式 (case-expression) 为 标 量 表 达 式, 该 表 达 式 经 过 计 算 得 到 的 取 值 为 情 况 指 标 其 中 的 情 况 值 范 围 (case-value-range) 即 连 同 其 括 号 称 为 情 况 选 择 符, 表 示 它 的 取 值 所 属 的 离 散 区 间, 也 可 以 就 是 一 个 单 独 的 值, 它 的 句 法 形 式 (R814) 为 : case-value case-value : :case-value case-value :case-value 即 如 果 是 区 间 的 话, 该 区 间 可 以 是 半 边 开 的 其 中 的 情 况 值 (case-value) 是 一 个 标 量 初 始 化 表 达 式, 与 情 况 表 达 式 的 类 型 等 属 性 一 样 所 谓 初 始 化 表 达 式 即 在 编 译 时 可 以 取 值 的 表 达 式, 本 质 上 即 常 量 表 达 式 它 们 的 取 值 都 只 能 是 整 型, 字 符 型 和 逻 辑 型 可 以 看 到 在 CASE 结 构 里, 包 含 了 三 种 语 句 : SELECT CASE 语 句 ; CASE 语 句 ; END SELECT 语 句 而 在 CASE 语 句 当 中, 跟 在 关 键 词 CASE 后 面 的 (case-value-range-list) 或 DEFAULT 就 是 情 况 选 择 符 CASE 结 构 的 一 般 规 则 如 下 : 如 果 CASE 结 构 具 有 名 称 的 话, 那 么 结 构 名 称 必 须 成 对 出 现 在 SELECT CASE 语 句 和 END SELECT 语 句 当 中 情 况 选 择 符 后 面 如 果 出 现 结 构 名 称 的 话, 必 须 与 SELECT CASE 语 句 当 中 的 结 构 名 称 一 致 具 有 情 况 选 择 符 DEFAULT 的 CASE 语 句 是 可 选 的, 如 果 它 出 现 在 结 构 当 中 的 话, 上 述 CASE 结 构 的 句 法 形 式 并 没 有 要 求 它 放 置 在 结 构 的 最 后 在 一 个 CASE 结 构 里, 情 况 表 达 式 与 所 有 的 情 况 值 都 必 须 属 于 同 一 个 类 型, 如 果 属 于 字 符 型, 它 们 可 以 具 有 不 同 的 长 度, 但 是 种 别 参 数 必 须 一 致 情 况 值 范 围 里 面 出 现 冒 号 时, 表 示 一 个 区 间, 而 区 间 的 构 成 隐 含 着 相 应 的 关 系 表 达 式

177 情 况 值 不 能 是 逻 辑 型 如 果 是 字 符 型 的 话, 则 依 据 字 符 型 的 关 系 运 算 规 则 确 定 相 应 的 取 值 范 围 例 10-6 CASE( ABOUT : Z ) 里 面 的 情 况 值 范 围 为 按 照 与 处 理 器 相 关 的 默 认 字 符 类 型 的 关 系 运 算, 在 ABOUT 与 Z 之 间 的 所 有 字 符 串 结 构 当 中 的 表 达 式 的 取 值 完 成 后, 必 须 保 证 最 多 只 能 有 一 个 情 况 选 择 符 的 值 与 情 况 指 标 值 匹 配, 也 即 不 允 许 在 不 同 的 情 况 之 间 情 况 值 出 现 重 复 的 情 形 情 况 值 DEFAULT 与 任 何 跟 所 有 结 构 内 的 其 他 情 况 值 都 不 匹 配 的 情 况 指 标 值 匹 配 例 10-7 CALCU_AREA: SELECT CASE(OBJECT) CASE(RECTANGLE) CALCU_AREA AREA=LENGTH*WIDTH CASE(SQUARE) CALCU_AREA AREA=SIDE*SIDE CASE(CIRCLE) CALCU_AREA AREA=PI*RADIUS**2 END SELECT CALCU_AREA CASE 结 构 的 运 行 首 先 计 算 SELECT CASE 语 句 当 中 的 作 为 标 量 表 达 式 的 情 况 指 标, 它 的 值 最 多 与 结 构 里 的 一 个 情 况 值 匹 配, 与 之 匹 配 的 情 况 值 后 面 紧 跟 的 块 得 到 执 行, 然 后 退 出 结 构 程 序 进 入 紧 跟 该 结 构 的 END SELECT 语 句 后 面 的 可 执 行 语 句 或 结 构 如 果 没 有 与 情 况 指 标 值 匹 配 的 情 况 值, 而 结 构 里 包 含 了 CASE DEFAULT 语 句, 按 照 DEFAULT 的 定 义, 情 况 值 这 时 必 定 与 之 匹 配, 因 此 执 行 该 语 句 后 面 的 块, 然 后 退 出 该 结 构 如 果 结 构 当 中 不 存 在 CASE DEFAULT 语 句, 又 没 有 与 情 况 指 标 值 匹 配 的 情 况 值, 那 么 退 出 该 结 构, 不 执 行 结 构 里 的 任 何 块 所 谓 情 况 指 标 值 与 结 构 里 的 一 个 情 况 值 匹 配, 包 含 如 下 情 形 : 如 果 情 况 值 为 单 独 的 一 个 值, 则 运 用 等 价 与 非 等 价 关 系 运 算, 看 是 否 与 指 标 值 等 价 ; 如 果 情 况 值 是 一 个 区 间, 则 按 照 下 表 10-1 的 定 义 : 情 况 值 范 围 case-value1 :case-value2 case-value : :case-value 表 10-1 不 同 情 况 值 的 匹 配 匹 配 的 定 义 case-value1.le. case-index.le. case-value2 case-value.le. case-index case-value.ge. case-index 注 意 不 同 CASE 语 句 的 情 况 值 范 围 不 能 有 重 叠 结 构 的 执 行 最 多 只 允 许 其 中 的 一 个 块 被 执 行 只 能 从 结 构 内 部 分 支 到 该 结 构 的 END SELECT 语 句

178 不 允 许 分 支 到 CASE 语 句, 但 可 以 分 支 到 SELECT CASE 语 句 下 面 的 图 10-2 给 出 了 CASE 结 构 的 运 行 流 的 示 意 图 : 例 10-8 图 10-2 CASE 结 构 的 运 行 流 示 意 图 INDEX=2 SELECT CASE(INDEX) CASE(1) A=(1,2) CASE(2) A=(2,3) CASE DEFAULT A=(0,0) END SELECT

179 例 10-9 下 面 的 例 子 描 述 了 一 个 交 通 规 则 : COLOR= GREEN SELECT CASE(COLOR) CASE( RED ) STOP CASE( YELLOW ) CALL STOP_IF_YOU_CAN_SAFELY CASE( GREEN ) CALL GO_AHEAD END SELECT 第 11 章 基 本 计 算 ( 三 ) 循 环 控 制 结 构 上 章 讨 论 的 控 制 结 构 的 特 点 是 通 过 判 别 条 件 来 对 结 构 内 的 块 进 行 选 择, 所 对 应 的 算 法 结 构, 最 简 单 的 例 子, 就 是 解 一 元 二 次 方 程, 在 输 入 方 程 所 以 的 参 数 值 之 后, 需 要 首 先 计 算 一 个 判 别 式, 然 后 根 据 判 别 式 的 值, 再 选 择 使 用 哪 个 公 式, 也 就 是 计 算 的 途 径, 才 能 够 给 出 最 终 的 解 在 本 章 所 讨 论 的 控 制 结 构 的 特 点 则 是 针 对 结 构 内 的 块 进 行 多 次 的 重 复 运 算, 每 完 成 一 次 运 算, 都 判 别 一 下 是 否 需 要 把 此 次 运 算 结 果 作 为 输 入, 再 进 行 一 次 运 算 这 种 控 制 结 构 所 对 应 的 算 法 结 构, 一 个 最 简 单 的 例 子, 就 是 求 级 数 的 部 分 和 我 们 知 道 对 于 具 有 通 项 表 达 式 的 级 数, 求 它 的 部 分 和 的 每 一 项, 总 是 需 要 进 行 同 样 的 运 算 过 程, 如 果 使 用 按 照 序 列 形 式 排 列 的 程 序 结 构, 那 么 需 要 计 算 多 少 项, 就 需 要 写 下 多 少 条 语 句, 把 它 们 顺 序 排 列 下 来, 才 能 做 到 程 序 走 一 遍 即 完 成 计 算 这 样 的 算 法 设 计 显 然 是 没 有 利 用 运 算 过 程 里 所 表 现 的 循 环 结 构, 如 果 使 用 一 种 控 制 结 构 与 循 环 过 程 对 应, 让 程 序 的 运 行 能 够 重 复 表 示 通 项 公 式 的 表 达 式 计 算, 就 能 够 用 一 个 表 达 式 代 替 所 有 项 的 表 达 式, 显 然 更 加 合 理 例 11-1 设 有 一 个 级 数 : n x = 1/ i 如 果 要 求 级 数 在 N=K 时 的 值, 如 果 一 定 要 使 用 序 列 结 构 的 程 序, 那 么 在 程 序 当 中 肯 定 会 出 现 如 下 K 个 表 达 式 顺 序 排 列 的 情 形 : I=1 SUM=1/I**3 I=2 SUM=SUM+1/I**3 I=3 SUM=SUM+1/I**3 i= 1 3

180 I=K SUM=SUM+1/I**3 由 于 这 K 个 表 达 式 是 一 样 的, 因 此 如 果 使 用 如 下 的 一 个 控 制 结 构, 只 需 要 使 用 一 个 表 达 式 赋 值 语 句, 就 可 以 表 示 整 个 循 环 运 算 过 程 : SUM=0.0 DO I=1, K SUM= SUM+1/I**3 END DO 上 面 的 控 制 结 构, 就 是 本 章 所 要 讨 论 的 DO 结 构 实 际 上 这 是 一 种 基 本 的 计 算 过 程, 为 很 多 重 要 算 法 的 实 现 提 供 了 基 础 FOR TRAN 语 言 提 供 用 来 进 行 循 环 控 制 的 主 要 结 构 就 是 DO 结 构, 因 此 本 章 主 要 讨 论 的 就 是 DO 结 构 最 后 还 会 简 略 的 讨 论 有 关 分 支 转 移 的 实 现 问 题, 尽 管 它 们 不 属 于 循 环 控 制, 但 是 由 于 在 现 代 结 构 性 编 程 风 格 的 要 求 下, 这 种 分 支 转 移 是 一 种 过 时 的 方 式, 因 此 简 略 地 附 加 在 本 章 后 面 11.1 DO 结 构 DO 结 构 包 含 0 个 或 多 个 语 句 或 结 构, 它 们 在 DO 结 构 的 其 他 部 分 的 控 制 下 进 行 重 复 运 行 这 些 被 重 复 运 算 的 语 句 或 结 构 构 成 一 个 循 环,DO 结 构 控 制 了 该 循 环 的 运 行 次 数 DO 结 构 的 运 行 分 为 如 下 步 骤 : 如 果 DO 结 构 由 一 个 DO 变 量 控 制, 那 么 决 定 循 环 次 数 的 该 表 达 式 的 值 首 先 需 要 计 算 出 来 ; 然 后 决 定 循 环 部 分 是 否 运 行 ; 如 果 运 行 循 环 部 分, 则 完 成 循 环 后, 更 新 DO 变 量, 再 进 入 第 二 个 步 骤 ; 如 果 不 需 要 运 行 循 环 部 分, 则 退 出 该 DO 结 构, 进 入 程 序 的 后 续 部 分 其 中 对 于 DO 结 构 的 循 环 部 分 的 控 制 方 式 有 3 种 : 利 用 一 个 循 环 变 量 从 初 始 DO 语 句 开 始, 以 确 定 的 方 式 增 长 ( 也 可 能 是 负 方 向 增 长 ), 该 变 量 作 为 一 个 循 环 计 数 器, 它 的 取 值 变 化 的 次 数 标 记 了 循 环 的 次 数 ; 利 用 WHERE 条 件 ; 使 用 简 单 DO 结 构, 或 者 称 为 永 远 DO 显 然 这 种 方 式 需 要 一 个 可 执 行 语 句 来 终 止 DO 结 构, 例 如 EXIT 语 句, 可 以 用 来 退 出 循 环 从 D O 结 构 的 整 体 构 造 来 看,DO 结 构 分 为 两 种 形 式 : DO 结 构 块 ; DO 结 构 本 身 构 成 一 个 块 结 构, 总 是 使 用 一 个 END DO 语 句 或 CONTINUE 语 句 来 终 止 DO 结 构 的 运 行 非 块 DO 结 构 非 块 DO 结 构 本 身 不 构 成 一 个 块 状 结 构, 它 或 者 使 用 一 个 作 用 语 句 或 结 构 来 终 止 该 DO 结 构 的 运 行, 或 者 与 其 他 DO 结 构 共 享 一 个 终 止 语 句 这 两 种 形 式 具 有 相 同 的 功 能, 都 可 以 使 用 DO WHERE 与 永 远 DO 的 循 环 形 式, 但 是 非 块 DO 结 构 属 于 早 期 FORTRAN 版 本 的 遗 留 物, 是 在 还 不 重 视 结 构 化 编 程 的 时 代 的 产 物, 因 此 是 过 时 的 表 达 方 式, 现 代 FORTRAN 语 言 不 提 倡 使 用 下 面 是 一 个 DO 结 构 块 的 例 子

181 例 11-2 DO I=1,N SUM=SUM+X(I) END DO 下 面 是 执 行 与 上 例 同 样 的 计 算 任 务 的 非 块 DO 结 构 的 例 子 例 11-3 DO 100 I=1,N 100 SUM=SUM+X(I) DO 结 构 块 的 形 式 DO 结 构 块 就 是 使 用 不 与 其 他 DO 结 构 共 享 的 END DO 语 句 或 CONTINUE 语 句 作 为 终 止 语 句 的 DO 结 构 它 的 一 般 句 法 形 式 (R817) 为 : [do-construct-name:] DO [label][loop-control] [execution-part-construct] [label] END DO 其 中 循 环 控 制 (loop-control) 的 句 法 形 式 (R821) 为 : [,]scalar-integer-variable-name = & scalar-integer-expression,scalar-integer-expression & [,scalar-integer-expression] [,]WHILE(scalar-logical-expression) 其 中 END DO 语 句 的 句 法 形 式 (R824) 为 : END DO [do-construct-name] CONTINUE 其 中 在 可 选 的 结 构 名 称 加 关 键 词 DO 后 面 的 语 句 称 为 DO 语 句 ; 关 键 词 END DO 后 面 的 语 句 称 为 END DO 语 句 ; 关 键 词 CONTINUE 后 面 的 语 句 称 为 CONTINUE 语 句 DO 结 构 的 一 般 规 则 如 下 : DO 结 构 里 循 环 控 制 里 的 DO 变 量, 必 须 是 整 型 的 标 量 命 名 变 量 整 个 DO 结 构 块 如 果 有 一 个 结 构 名 称, 那 么 它 必 须 同 时 出 现 在 DO 语 句 和 END DO 语 句 里 面, 而 不 能 只 出 现 在 其 中 之 一 里 面 如 果 DO 语 句 里 面 不 包 含 标 签, 那 么 END DO 语 句 里 面 也 不 能 包 含 标 签 ; 如 果 DO 语 句 里 面 包 含 标 签, 那 么 END DO 语 句 必 须 使 用 同 样 的 标 签 注 意 DO 结 构 块 里 的 终 止 语 句 绝 对 不 能 与 其 他 DO 结 构 共 享, 因 此 END DO 语 句 的 标 签 绝 对 不 能 在 别 的 地 方 被 引 用 如 果 终 止 语 句 其 他 DO 结 构 共 享 了, 则 属 于 非 块 DO 结 构 DO 结 构 里 面 可 选 的 标 签 既 可 以 使 用 自 由 源 码 形 式 也 可 以 使 用 固 定 源 码 形 式 下 面 给 出 一 些 不 同 形 式 的 DO 结 构 的 例 子 例 11-4

182 SUM=0.0 DO I=1,N SUM=SUM+(-1)**N*(1/N**2) END DO 这 个 例 子 里 面 的 DO 变 量 是 I 例 11-5 FOUND=.FALSE. I=0 DO WHILE(.NOT. FOUND.AND.I<LIMIT) IF(KEY==X(I))THEN FOUND=.TRUE. ELSE I=I+1 END IF END DO 这 个 例 子 使 用 了 WHERE 语 句 例 11-6 NO_ITERS=0 DO 下 面 的 FU 和 FU_PRIME 都 是 函 数 X1=X0-FU(X0)/FU_PRIME(X0) IF ( ABS (X1 - X0 ) < SPACING ( X0 ).OR. & NO_ITERS > MAX_ITERS ) EXIT X0 = X1 NO_ITERS=NO_ITERS+1 END D O 这 个 DO 结 构 里 面 使 用 IF 语 句 例 11-7 INNER_PROD= 0.0 DO 100 I=1,10 INNER_PROD=INNER_PROD+X(I)*Y(I) 100 CONTINUE 这 个 例 子 里 面 使 用 了 CONTINUE 语 句 例 11-8 LOOP: DO I=1, N Y(I)=A*X(I)+Y(I) END DO LOOP

183 在 这 个 例 子 里 面 给 出 了 DO 结 构 名 称 非 块 DO 结 构 的 形 式 非 块 DO 结 构 的 终 止 语 句 总 是 使 用 标 签, 并 且 采 取 如 下 两 种 情 形 : 一 个 非 块 DO 结 构 的 终 止 语 句 是 与 其 他 的 DO 结 构 共 享 的 ; 非 块 DO 结 构 的 终 止 语 句 本 身 是 一 个 结 构 或 作 用 语 句, 而 不 是 END DO 语 句 或 CONTINUE 语 句 具 有 这 样 的 终 止 语 句 的 DO 结 构, 就 不 能 形 成 一 个 块 结 构, 这 导 致 它 是 一 种 过 时 的 表 述 方 式 非 块 DO 结 构 的 句 法 形 式 (R826) 为 : action-terminated-do-construct outer-shared-do-construct 其 中 作 用 语 句 终 止 DO 结 构 (action-terminated-do-construct) 的 句 法 形 式 (R827) 为 : [do-construct-name:]do label [loop-control] [execution-part-construct] label action-statement 其 中 可 外 部 共 享 DO 结 构 (outer-shared-do-construct) 的 句 法 形 式 (R830) 为 : [do--construct-name:]do label [loop-control] [execution-part-construct] label shared-termination-do-construct 其 中 可 共 享 终 止 DO 结 构 (shared-termination-do-construct) 的 句 法 形 式 (R831) 为 : outer-shared-do-construct inner-shared-do-construct 其 中 可 内 部 共 享 DO 结 构 (inner-shared-do-construct) 的 句 法 形 式 (R832) 为 : [do-construct-name:]do label [loop-control] [execution-part-construct] label action-statement 其 中 用 来 退 出 作 用 语 句 终 止 DO 结 构 (action-terminated-do-construct) 的 作 用 语 句 称 为 终 止 DO 作 用 语 句 ; 用 来 退 出 可 内 部 共 享 DO 结 构 (inner-shared-do-construct) 的 作 用 语 句 称 为 终 止 DO 共 享 语 句 ; 所 有 这 些 用 来 终 止 非 块 DO 结 构 的 语 句 或 结 构 形 式, 包 括 终 止 DO 作 用 语 句, 终 止 DO 共 享 语 句, 终 止 DO 共 享 结 构, 都 称 为 DO 终 止, 或 DO 结 构 的 终 止 语 句 非 块 DO 结 构 的 一 般 规 则 如 下 : 一 个 终 止 DO 作 用 语 句 不 能 是 任 何 形 式 的 如 下 语 句 : CONTINUE 语 句 ;GO TO 语 句 ;RETURN 语 句 ;STOP 语 句 ;EXIT 语 句 ;CYCLE 语 句 ; END 语 句 终 止 DO 作 用 语 句 和 相 应 的 DO 语 句 必 须 具 有 相 同 的 标 签 一 个 终 止 DO 共 享 语 句 不 能 是 任 何 形 式 的 如 下 语 句 : GO T O 语 句 ;RETURN 语 句 ;STOP 语 句 ;EXIT 语 句 ;CYCLE 语 句 ;END 语 句 终 止 DO 共 享 语 句 和 相 应 的 所 有 共 享 它 的 DO 语 句 必 须 具 有 相 同 的 标 签

184 D O 结 构 里 面 可 选 的 标 签 既 可 以 使 用 自 由 源 码 形 式 也 可 以 使 用 固 定 源 码 形 式 下 面 给 出 一 些 不 同 形 式 的 非 块 DO 结 构 的 例 子 : 例 11-9 PROD=1.0 DO 20 I=1,N 20 PROD=PROD*P(I) 例 DO 20 I=1,N DO 20 J=1,N 20 HILBERT(I,J)=1.0/REAL(I+J) 这 个 例 子 里 面 包 含 DO 语 句 的 嵌 套 结 构 例 FOUND=.FALSE. I=0 DO 20 WHILE(.NOT.FOUND.AND.I<LIMIT) I=I+1 20 FOUND=KEY==X(I) 这 个 例 子 里 面 使 用 了 WHERE 语 句 例 : DO 20 I=1,N DO 20 J=I+1,N A=B(I,J) ;B(I,J)=B(J,I);B(J,I)=A 20 CONTINUE 这 个 例 子 里 面 使 用 了 CONTINUE 语 句 DO 结 构 的 范 围 所 谓 DO 结 构 的 范 围 是 指 从 DO 语 句 到 该 DO 结 构 的 终 止 语 句 的 所 有 语 句 在 D O 结 构 的 范 围 内 部 可 以 包 含 其 他 类 型 的 结 构, 例 如 IF 结 构,CASE 结 构, 以 及 其 他 DO 结 构, 其 中 任 何 一 个 内 部 结 构 都 必 须 是 完 整 地 包 含 在 另 一 个 结 构 之 中, 而 不 能 有 各 个 结 构 相 互 交 错 的 情 形 如 果 在 一 个 DO 结 构 里 面 包 含 了 其 他 DO 结 构, 那 么 该 DO 结 构 称 为 嵌 套 DO 结 构 嵌 套 的 DO 结 构 共 享 一 个 终 止 语 句 是 允 许 的, 但 是 属 于 即 将 淘 汰 的 语 法 形 式, 因 此 尽 量 不 要 使 用 从 一 个 DO 结 构 的 外 部 分 支 到 它 的 内 部 某 个 语 句 是 绝 对 禁 止 的 DO 结 构 的 激 活 与 灭 活 一 个 DO 结 构 可 以 处 于 激 活 状 态, 也 可 以 处 于 灭 活 状 态

185 当 一 个 DO 结 构 被 运 行 时, 就 是 处 于 激 活 状 态 当 一 个 DO 结 构 处 于 如 下 几 种 情 形 时, 就 是 处 于 灭 活 状 态 : 在 检 测 条 件 时 循 环 计 数 器 取 值 为 0; 在 检 测 条 件 时 WHILE 条 件 为 假 ; 执 行 了 EXIT 语 句, 导 致 从 DO 结 构 退 出 ; 执 行 了 CYCLE 语 句 ; 出 现 一 个 指 向 DO 结 构 外 部 的 控 制 转 移 ; 执 行 了 RETURN 语 句 ; 任 何 其 他 原 因 导 致 程 序 终 止 DO 结 构 的 运 行 由 于 DO 结 构 具 有 非 常 不 一 样 的 三 种 形 式, 因 此 DO 结 构 的 运 行 也 具 有 三 种 形 式 : 带 循 环 计 数 器 的 DO 结 构 的 运 行 ; DO WHILE 结 构 的 运 行 ; 简 单 DO 结 构 的 运 行 所 有 这 些 运 行 形 式 都 可 以 包 含 能 够 导 致 程 序 不 按 照 语 句 顺 序 执 行 的 可 执 行 语 句, 当 然 也 可 以 包 含 导 致 DO 结 构 运 行 终 止 的 语 句 下 面 分 别 予 以 说 明 1. 带 循 环 计 数 器 的 DO 结 构 的 运 行 在 这 种 DO 结 构 的 形 式 里 面, 循 环 计 数 器 控 制 了 循 环 部 分 执 行 的 次 数 带 循 环 计 数 器 的 DO 结 构 的 句 法 形 式 (R818) 为 : DO [label] [,] do-variable=expression1,expression2[,expression3] 其 中 的 DO 变 量 与 相 应 的 表 达 式 都 必 须 是 整 型 下 面 是 这 样 的 不 同 形 式 的 DO 语 句 的 一 个 例 子 例 DO 100 I=0,N DO,I=-N,N DO J=N,1,-1 所 谓 循 环 计 数 器 是 用 来 计 量 DO 结 构 里 面 的 循 环 部 分 的 循 环 运 行 次 数 的 循 环 计 算 器 里 面 包 括 三 个 表 达 式, 这 些 表 达 式 经 过 计 算 后 得 到 的 结 果 必 须 转 换 为 DO 变 量 的 类 型, 假 设 分 别 为 e1,e2,e3,( 其 中 e3 不 能 是 0, 但 可 以 省 略, 而 取 默 认 值 1 ) 它 们 的 含 义 为 : e1 表 示 DO 变 量 的 初 始 值 ; e2 表 示 DO 变 量 的 终 止 值 ; e3 作 为 可 选 项 表 示 DO 变 量 的 变 化 的 步 长, 默 认 值 取 1 那 么 循 环 的 次 数 可 以 由 下 面 的 公 式 得 到 : MAX((e2-e1+e3)/e3,0) 注 意 在 下 面 的 情 形 下 导 致 循 环 计 算 器 的 取 值 为 0, 也 就 导 致 DO 结 构 灭 活 : e1>e2 并 且 e3>0; e1<e2 并 且 e3<0

186 然 后 通 过 循 环 计 算 器 的 控 制,DO 结 构 的 运 行 步 骤 如 下 : 1. D O 变 量 的 初 始 值 设 置 为 e1; 2. 检 测 循 环 计 数 器, 如 果 取 值 为 0, 则 退 出 DO 结 构 ; 3. 如 果 循 环 计 数 器 的 取 值 不 是 0, 则 DO 结 构 的 范 围 得 到 执 行 这 时 循 环 计 数 器 的 值 减 1, 而 DO 变 量 增 长 e3 4. 重 复 步 骤 2 和 3, 一 直 到 循 环 计 数 器 的 值 为 0 注 意 在 整 个 DO 结 构 终 止 后,DO 变 量 的 取 值 保 持 为 相 应 的 循 环 计 数 器 值 为 0 时 的 值 在 DO 结 构 的 范 围 的 整 个 运 行 过 程 中, DO 变 量 不 能 被 重 定 义, 也 不 能 被 去 定 义 在 DO 结 构 的 运 行 过 程 当 中, 决 定 循 环 参 数 的 表 达 式 里 面 的 变 量 的 变 化 不 影 响 循 环 计 数 器, 每 次 进 入 DO 结 构, 循 环 计 数 器 的 值 都 是 固 定 的 下 面 的 示 意 图 11-1 表 示 了 带 有 循 环 计 数 器 的 DO 结 构 的 运 行 流 : 图 11-1 带 有 循 环 计 数 器 的 DO 结 构 的 运 行 流 例 下 面 的 例 子 运 行 了 10 次 N=10 SUM=0.0 DO 10 I=1,N SUM=SUM+A(I) N=N+1 10 CONTINUE 运 行 之 后,I=11,N=20

187 例 下 面 的 内 部 循 环 运 行 了 10 次 : X=20 DO 10 I=1,2 DO 9 J=1,5 X=X CONTINUE 10 CONTINUE 运 行 整 个 DO 结 构 之 后,I=3,J=6,X=30 如 果 其 中 的 第 二 个 DO 语 句 改 为 : DO 9 J=5,1 那 么 其 中 的 内 部 DO 结 构 根 本 就 不 会 运 行, 而 X 取 值 仍 然 是 20,J=5,I=3 2. DO WHILE 结 构 的 运 行 DO WHILE 结 构 的 循 环 控 制 不 是 通 过 一 个 整 型 变 量 来 给 出 循 环 的 次 数, 而 是 通 过 对 一 个 取 逻 辑 型 值 的 表 达 式 的 运 算, 来 获 得 进 行 循 环 的 条 件 关 键 词 DO WHILE 后 接 逻 辑 型 表 达 式 的 语 句 称 为 DO WHILE 语 句 DO WHILE 语 句 的 句 法 形 式 为 : DO [label ] [,]WHILE [scalar-logical-expression] DO WHILE 语 句 的 例 子 : DO 100 WHILE(X(I)/=0) DO,WHILE(.NOT.FOUND) DO WHILE(y>=0.01) DO WHILE 结 构 的 运 行 非 常 简 单 : 首 先 计 算 逻 辑 表 达 式, 如 果 为 真, 则 运 行 循 环 部 分 ; 如 果 为 假, 则 退 出 该 DO 结 构 例 SUM=0.0 I=0 DO WHILE (I<5) I=I+1 SUM=SUM+I END DO 上 面 的 循 环 执 行 5 次, 最 后 得 到 SUM=15.0,I=5 3. 简 单 DO 结 构 的 运 行 也 可 以 在 DO 结 构 里 面 不 使 用 任 何 循 环 控 制, 而 是 直 接 使 用 终 止 语 句, 即 DO 范 围 里 面 的 语 句 总 是 循 环 执 行, 除 非 DO 范 围 里 面 的 某 条 终 止 语 句 在 一 定 条 件 下 被 执 行 简 单 DO 结 构 的 一 般 形 式 就 是 :

188 DO [label ] 例 DO READ*, DATA IF(DATA<0) STOP CALL PROCESS(DATA) END DO 在 这 个 例 子 里 面, 一 直 到 DATA 读 入 一 个 负 值, 其 中 的 DO 范 围 才 停 止 循 环, 并 退 出 DO 结 构 把 上 面 的 例 子 改 写 为 带 有 标 签 的 形 式, 如 下 : DO 15 READ*,DATA IF(DATA<0) STOP CALL PROCESS(DATA) 15 CONTINUE 在 DO 结 构 范 围 内 改 变 运 行 顺 序 在 DO 结 构 范 围 内 部, 可 以 使 用 两 个 专 门 的 语 句 来 改 变 正 常 的 运 行 顺 序, 它 们 是 : EXIT 语 句 ; CYCLE 语 句 当 然 可 以 用 来 在 DO 范 围 内 改 变 正 常 运 行 顺 序 的 语 句, 并 不 只 是 这 两 个 语 句, 还 包 括 一 些 分 支 语 句, 例 如 RETURN 语 句,STOP 语 句 等, 但 是 这 两 个 语 句 是 专 门 用 于 DO 结 构 内 部 的 而 那 些 分 支 语 句 则 没 有 这 个 限 制 下 面 分 别 说 明 这 两 个 语 句 1. EXIT 语 句 EXI T 语 句 直 截 了 当 地 导 致 程 序 退 出 DO 结 构,DO 结 构 里 面 的 任 何 其 他 语 句 都 不 再 被 执 行 EXI T 语 句 既 可 以 在 DO 结 构 块 里 面 使 用, 也 可 以 在 非 块 DO 结 构 里 面 使 用, 但 是 它 本 身 不 能 充 当 非 块 DO 结 构 里 面 的 终 止 DO 作 用 语 句 和 终 止 DO 共 享 语 句 EXIT 结 构 的 句 法 形 式 (R835) 为 : EXIT[do-construct-name] 注 意 EXIT 语 句 必 须 是 在 一 个 DO 结 构 内 部 如 果 EXIT 语 句 具 有 一 个 结 构 名 称, 那 么 该 EXIT 语 句 必 须 是 在 同 名 DO 结 构 的 内 部 ; 当 该 EXIT 语 句 被 执 行 的 时 候, 该 同 名 DO 结 构 就 被 终 止, 同 时, 任 何 包 含 了 该 EXIT 语 句 的 DO 结 构 以 及 包 含 在 该 同 名 DO 结 构 里 面 的 DO 结 构 全 都 被 终 止 如 果 EXIT 语 句 不 带 结 构 名 称, 那 么 只 有 所 有 包 含 EXIT 语 句 的 结 构 之 中 最 接 近 EXIT 语 句 的 DO 结 构 被 终 止 例 11-18

189 LOOP10:DO IF(TEMP==INDEX)EXIT LOOP10 END DO LOOP10 上 例 当 中 的 EXIT 语 句 带 有 结 构 名 称, 那 么 当 IF 语 句 里 面 的 条 件 被 满 足 时, 就 运 行 EXIT 语 句, 也 就 退 出 整 个 LOOP10 结 构 2. CYCLE 语 句 上 面 的 EXIT 语 句 是 完 全 地 退 出 整 个 DO 结 构, 而 CYCLE 语 句 则 只 是 中 断 已 经 完 成 的 循 环, 使 用 可 能 更 新 过 的 循 环 计 数 器 以 及 DO 变 量, 再 次 启 动 循 环 部 分 的 循 环 计 算 过 程 CYCLE 语 句 既 可 以 在 DO 结 构 块 里 面 使 用, 也 可 以 在 非 块 DO 结 构 里 面 使 用, 但 是 它 本 身 不 能 充 当 非 块 DO 结 构 里 面 的 终 止 DO 作 用 语 句 和 终 止 DO 共 享 语 句 如 果 CYCLE 语 句 在 非 块 DO 结 构 里 面 使 用, 那 么 非 块 DO 结 构 里 面 的 终 止 DO 作 用 语 句 和 终 止 DO 共 享 语 句 将 不 会 得 到 执 行 CYCLE 语 句 的 句 法 形 式 (R834) 为 : CYCLE[do-construct-name] 注 意 CYCLE 语 句 必 须 是 在 一 个 DO 结 构 内 部 如 果 CYCLE 语 句 具 有 一 个 结 构 名 称, 那 么 该 CYCLE 语 句 必 须 是 在 同 名 DO 结 构 的 内 部 ; 当 该 CYCLE 语 句 被 执 行 的 时 候, 该 同 名 DO 结 构 就 被 中 断, 同 时, 任 何 包 含 了 该 CYCLE 语 句 的 DO 结 构 以 及 包 含 在 该 同 名 DO 结 构 里 面 的 DO 结 构 全 都 被 终 止 如 果 CYCLE 语 句 不 带 结 构 名 称, 那 么 只 有 所 有 包 含 CYCLE 语 句 的 结 构 之 中 最 接 近 CYCLE 语 句 的 DO 结 构 被 中 断 CYCL E 语 句 可 以 用 于 任 意 形 式 的 DO 语 句 ; 在 循 环 控 制 条 件 许 可 的 情 形 下, 就 可 以 启 动 下 一 个 循 环 的 开 始 当 DO 结 构 被 CYCL E 语 句 中 断 之 后, 如 果 DO 结 构 存 在 DO 变 量 的 话, 该 DO 变 量 就 被 更 新, 同 时 循 环 计 数 器 被 减 小 1, 然 后 就 开 始 了 DO 范 围 的 下 一 个 循 环 的 执 行 例 DO INDEX= IF (INDEX<0)EXIT IF (INDEX=0)CYCLE END DO 在 上 面 的 例 子 当 中, 只 要 INDEX 为 正 数, 循 环 就 一 直 进 行 ; 一 旦 INDEX 为 负 值, 则 整 个 DO 结 构 被 终 止 ; 而 如 果 INDEX 为 0 时, 则 循 环 部 分 在 CYCLE 后 面 的 所 有 语 句 都 被 跳 过 去, 重 新 开 始 循 环 过 程

190 11.2 程 序 的 分 支 所 谓 分 支 就 是 使 得 程 序 的 运 行 从 当 前 的 语 句 转 移 到 该 程 序 单 位 里 的 另 外 一 个 语 句, 也 就 意 味 着 紧 接 当 前 语 句 的 下 面 的 语 句 得 不 到 执 行 了 导 致 转 移 的 当 前 语 句 称 为 分 支 语 句, 而 被 转 移 到 的 得 到 执 行 的 语 句 称 为 分 支 目 标 语 句 可 以 成 为 分 支 目 标 语 句 的 语 句 包 括 所 有 的 作 用 语 句, 另 外 还 有 如 下 语 句 : IF-THEN 语 句 ; SELECT CASE 语 句 ; DO 语 句 ; WHERE 语 句 ; FORALL 语 句 ; 以 及 其 他 在 一 定 条 件 下 的 语 句, 包 括 : END SELECT 语 句, 接 受 来 自 CASE 结 构 里 面 的 分 支 ; END DO 语 句, 接 受 来 自 DO 结 构 里 面 的 分 支 ; END IF 语 句, 接 受 来 自 IF 结 构 里 面 的 分 支 END DO 语 句, 终 止 DO 作 用 语 句 以 及 终 止 DO 共 享 语 句, 接 受 来 自 DO 结 构 的 分 支, 这 种 用 法 是 过 时 的 用 法 注 意 在 一 个 块 的 内 部 的 任 意 语 句 都 不 能 接 受 来 自 块 的 外 部 的 任 意 分 支 在 转 移 到 分 支 目 标 语 句 时, 需 要 在 分 支 语 句 当 中 给 出 目 标 语 句 的 位 置, 因 此 就 需 要 对 目 标 语 句 标 上 标 签 当 然 从 FORTRAN 语 法 的 角 度 来 讲, 任 何 语 句 都 可 以 加 上 标 签, 但 是 现 在 一 般 在 不 必 要 的 时 候, 都 是 省 略 掉 标 签 的 因 此 一 定 要 注 意, 分 支 语 句 引 用 了 分 支 目 标 语 句 的 标 签, 就 意 味 着 相 应 的 分 支 目 标 语 句 必 须 具 有 相 应 的 标 签, 绝 对 不 能 省 略 另 外 标 签 的 形 式 既 可 以 使 用 自 由 源 码 形 式 也 可 以 使 用 固 定 源 码 形 式 GO TO 语 句 GO TO 语 句 是 一 种 无 条 件 的 改 变 程 序 运 行 顺 序 的 分 支 语 句 DO TO 语 句 的 句 法 形 式 (R836) 为 : GO TO label 注 意 GO TO 语 句 里 的 标 签 必 须 是 引 用 在 与 GO TO 语 句 同 一 个 作 用 域 单 位 里 的 分 支 目 标 语 句, 包 括 内 部 过 程, 派 生 类 型 的 定 义, 以 及 界 面 块 里 面 的 语 句 的 标 签 当 执 行 GO TO 语 句 时, 接 下 来 执 行 的 是 GO TO 语 句 里 面 给 出 的 标 签 所 指 定 的 分 支 目 标 语 句, 后 面 的 程 序 运 行 则 从 该 目 标 语 句 开 始 例 GO TO 100! 表 示 无 条 件 地 转 移 到 标 签 为 100 的 语 句 IF X=3,THEN A(X)=X**2! 尽 管 该 语 句 紧 接 着 上 面 的 GO TO 语 句,! 但 是 由 于 它 不 具 有 标 签 100, 因 此 不 被 执 行 GO TO 20

191 GO TO 020!GO TO 语 句 含 义 一 样! 由 于 20 和 020 是 同 一 个 标 签, 因 此 这 两 个 CONTINUE 语 句 CONTINUE 语 句 的 句 法 形 式 (R839) 为 : [label] CONTINUE CONTINUE 语 句 主 要 用 来 作 为 DO 终 止 语 句, 也 可 以 作 为 分 支 目 标 语 句 如 果 CONTINUE 语 句 只 有 它 自 己, 没 有 充 当 任 何 功 能, 那 么 它 对 程 序 的 运 行 顺 序 以 及 运 行 结 果 都 没 有 任 何 影 响 例 CONTINUE 20 CONTINUE STOP 语 句 无 论 何 时 何 地 执 行 STOP 语 句, 都 能 够 终 止 程 序 的 运 行 STOP 语 句 的 句 法 形 式 (R840) 为 : STOP [scalar-character-constant] STOP digit [digit [digit [digit [digit ] ] ] ] 其 中 的 标 量 字 符 常 量 (scalar-character-constant) 和 数 字 (digit) 列 是 可 选 的, 称 为 停 止 码 注 意 可 选 的 字 符 常 量 必 须 是 默 认 字 符 型 可 选 的 数 码 的 第 一 个 数 字 如 果 为 0, 是 没 有 意 义 的 这 些 停 止 码 在 程 序 终 止 后 可 以 访 问 如 果 存 在 多 个 STOP 语 句, 这 些 停 止 码 就 可 以 用 来 标 志 程 序 终 止 的 位 置 对 于 停 止 码 的 解 释 依 赖 于 编 译 系 统 所 使 用 的 局 部 中 断 过 程 例 STOP STOP 100 STOP Error # 算 术 IF 语 句 算 术 IF 语 句 是 一 个 基 于 算 术 表 达 式 的 三 路 分 支 语 句 它 的 句 法 形 式 (R838) 为 : IF(scalar-numeric-expression)label,label,label 算 术 IF 语 句 的 一 般 规 则 如 下 : 在 同 一 个 算 术 IF 语 句 当 中, 同 一 个 标 签 可 以 重 复 出 现 不 止 一 次

192 其 中 的 标 量 数 值 表 达 式 (scala r-numeric-expression) 不 能 是 复 型 表 达 式 语 句 当 中 的 每 个 标 签 都 必 须 是 算 术 IF 语 句 所 在 作 用 域 单 位 里 的 作 为 分 支 目 标 的 语 句 的 标 签 当 然, 具 有 这 些 标 签 的 语 句 首 先 必 须 存 在 于 此 作 用 域 单 位 之 中 算 术 IF 语 句 的 执 行 顺 序 是 : 首 先 计 算 数 值 表 达 式, 如 果 为 负 值, 则 分 支 到 第 一 个 标 签 ; 如 果 得 到 0, 则 分 支 到 第 二 个 标 签 ; 如 果 得 到 正 值, 则 分 支 到 第 三 个 标 签 算 术 IF 语 句 现 在 已 经 很 少 用 到, 属 于 过 时 的 语 言 成 分 计 算 GO TO 语 句 类 似 于 算 术 IF 语 句, 计 算 GO TO 语 句 通 过 计 算 一 个 整 型 表 达 式, 根 据 得 到 的 数 值, 从 一 系 列 的 分 支 目 标 的 标 签 当 中 选 择 下 一 个 应 该 执 行 的 分 支 目 标 语 句 由 于 运 用 CASE 语 句 能 够 实 现 完 全 相 同 的 功 能, 而 CASE 语 句 更 加 具 有 结 构 化 的 特 征, 因 此 计 算 GO TO 语 句 已 经 完 全 过 时 计 算 GO TO 语 句 的 句 法 形 式 (R837) 为 : GO TO(label-list)[,]scalar-integer-expression 计 算 GO TO 语 句 的 一 般 规 则 如 下 : 如 果 在 标 签 列 表 (label-list) 当 中 出 现 了 n 个 标 签, 而 表 达 式 的 结 果 是 从 1 到 n 的 数 值 k, 那 么 该 数 值 表 示 了 被 选 择 的 标 签 是 列 表 当 中 的 第 k 个 标 签, 即 分 支 到 该 标 签 所 表 示 的 语 句 继 续 程 序 的 运 行 过 程 如 果 表 达 式 的 结 果 小 于 1 或 大 于 n, 那 么 不 进 行 任 何 分 支 转 移 过 程, 直 接 执 行 紧 接 该 计 算 GO TO 语 句 的 下 一 个 可 执 行 语 句 标 签 列 表 当 中 的 每 一 个 标 签, 都 必 须 是 在 与 该 计 算 GO TO 语 句 同 一 个 作 用 域 单 位 里 的 分 支 目 标 语 句 的 标 签 一 个 标 签 可 以 在 标 签 列 表 当 中 出 现 不 止 一 次 例 GO TO(15,45),A(X) GO TO(33,47,32,1),X**2*I 例 SWITCH= GO TO(33,100,33,56)SWITH X=Y**3 X=Y+2. X=SIN(Y) 100 X=Y**( 1/2) 如 果 SWITH 取 值 为 1 或 者 3, 则 分 支 到 语 句 33, 执 行 语 句 33; 如 果 SWITH 取 值 为 2, 则 分 支 到 语 句 100; 如 果 SWITH 取 值 为 4, 则 分 支 到 语 句 56; 如 果 SWITH 取 值 大 于 4, 小 于 1, 那 么 在 GO TO 语 句 后, 执 行 语 句 X=Y **3, 然 后 再 执 行 语 句 33

193 第 三 篇 计 算 任 务 的 剖 分 与 组 合 从 前, 有 两 个 表 匠, 一 个 叫 霍 拉, 一 个 叫 坦 普 斯 两 人 都 很 受 顾 客 的 欢 迎, 他 们 各 自 的 工 场 中 的 电 话 总 是 响 个 不 停, 因 为 老 有 新 主 顾 上 门 不 过, 霍 拉 发 了 大 财, 坦 普 斯 却 越 来 越 穷, 最 后 连 店 铺 都 给 亏 没 了 这 是 为 什 么 呢? 他 们 做 的 表 都 是 由 1000 个 零 件 组 成 坦 普 斯 做 表 的 方 式 是 连 续 地 把 一 只 表 从 头 做 到 尾, 如 果 尚 未 装 完 一 只 表 就 不 得 不 中 途 放 下 ( 比 如 说 要 去 接 客 户 电 话 了 ), 那 么 装 了 一 半 的 表 就 会 立 刻 散 掉, 又 得 从 头 装 起 顾 客 们 越 喜 欢 他 的 表, 他 的 电 话 就 越 多, 也 就 越 难 得 到 足 够 的 不 被 打 断 的 时 间 来 装 成 一 只 表 霍 拉 做 的 表 并 不 比 坦 普 斯 的 简 单 但 他 经 过 设 计, 用 十 个 零 件 装 成 一 个 组 件 十 个 组 件 又 可 装 成 更 大 的 组 件 十 个 大 组 件 构 成 的 系 统 就 是 整 只 表 因 此, 当 霍 拉 不 得 不 放 下 装 了 一 部 分 的 表 去 接 电 话 时, 他 只 损 失 了 一 小 部 分 活 儿, 他 装 表 所 用 工 时 只 是 坦 普 斯 所 用 工 时 的 一 个 零 头 在 这 个 寓 言 里 面, 我 的 中 心 思 想 是, 具 有 复 杂 性 的 系 统 最 好 是 采 取 层 级 结 构 的 形 式, 而 层 级 结 构 有 一 些 与 系 统 的 具 体 内 容 无 关 的 共 同 性 质 我 将 论 证 说, 层 级 结 构 是 构 造 复 杂 事 物 的 建 筑 师 们 所 使 用 的 主 要 结 构 方 式 之 一 ----H.Simon [1] The Sciences of the Artificial 一 个 计 算 任 务 可 以 很 简 单, 使 用 几 个 语 句 进 行 描 述, 执 行 之 后 就 可 以 得 到 结 果, 但 是 如 果 说 我 们 人 类 使 用 计 算 机 只 是 进 行 那 种 简 单 的 计 算, 显 然 是 浪 费 而 复 杂 的 计 算 任 务, 则 和 任 何 复 杂 事 物 一 样, 具 有 非 常 庞 大 的 内 部 结 构, 人 类 解 决 复 杂 问 题 的 一 般 思 路, 就 是 把 一 个 大 的 结 构 分 解 为 相 对 比 较 小 的 结 构, 如 果 可 能 就 一 直 分 解 到 非 常 简 单 的 结 构, 分 别 解 决 了 那 些 简 单 结 构 的 问 题, 按 照 我 们 分 解 大 问 题 的 逻 辑, 也 就 解 决 了 开 始 的 复 杂 问 题 如 何 运 用 程 序 语 言 来 表 达 这 个 解 构 的 思 路, 就 是 本 篇 我 们 要 讨 论 的 主 要 论 题 首 先 我 们 讨 论 一 个 FORTRAN 程 序 所 可 以 具 有 的 结 构, 按 照 这 个 语 言 对 程 序 结 构 模 本 的 规 定, 我 们 就 可 以 规 划 相 应 的 针 对 计 算 任 务 的 问 题 解 构 方 式 所 谓 FORTRAN 程 序 的 结 构, 就 是 一 个 FORTRAN 程 序 可 以 包 含 那 些 程 序 单 位, 然 后 这 些 单 位 又 必 须 如 何 组 装 在 一 起 所 以 我 们 分 类 讨 论 了 FORTRAN 的 程 序 单 位 之 后, 就 需 要 讨 论 数 据 流 与 指 令 流 是 如 何 进 行 不 同 程 序 单 位 之 间 的 通 讯 的, 通 过 这 种 通 讯, 一 个 由 许 多 程 序 单 位 组 成 的 FORTRAN 程 序 就 构 成 了 一 个 有 机 的 整 体, 恢 复 了 被 支 解 的 问 题 的 本 来 结 构 特 别 的, 我 们 还 需 要 讨 论 最 为 重 要 的 程 序 单 位, 就 是 过 程, 它 的 可 执 行 程 序 单 位 的 主 体 其 中 FORTRAN 语 言 以 标 准 形 式 给 出 的 固 有 过 程, 相 当 于 为 解 决 常 见 计 算 问 题 而 准 备 的 常 用 工 具, 熟 练 使 用 它 们 可 以 达 到 事 半 功 倍 的 效 果 [1] Herbert A. Simon, ,20 世 纪 所 谓 认 知 科 学 革 命 的 核 心 人 物, 人 工 智 能 的 巨 擘, 在 计 算 机 科 学 和 心 理 学 领 域 都 作 出 了 开 创 性 贡 献 1975 年 获 得 图 灵 奖,1978 年 以 决 策 理 论 荣 膺 诺 贝 尔 经 济 学 奖,1993 年 美 国 心 理 学 协 会 授 予 他 终 生 杰 出 成 就 奖,1994 年 获 选 中 科 院 外 籍 院 士, 生

194 前 多 次 访 华 第 12 章 程 序 的 单 位 一 个 FORTRAN 程 序 可 以 由 那 些 单 位 组 成, 在 第 一 篇 以 及 第 4 章 都 已 经 简 单 涉 及 过, 在 这 里 我 们 要 详 尽 地 讨 论 这 个 问 题, 特 别 是 给 出 每 种 程 序 单 位 的 结 构 与 功 能 12.1 程 序 单 位 FORTRAN 的 程 序 单 位 分 为 两 大 类 : 可 执 行 程 序 单 位 ; 不 可 执 行 程 序 单 位 其 中 可 执 行 程 序 单 位, 用 来 执 行 一 个 完 整 的 功 能, 包 括 : 主 程 序 ; 外 部 函 数 子 程 序 ; 外 部 子 例 行 程 序 子 程 序 不 可 执 行 程 序 单 位, 用 来 为 其 他 程 序 单 位 提 供 定 义, 包 括 : 模 块 程 序 单 位 ; 数 据 块 程 序 单 位 因 此 上 面 的 五 种 类 型 的 程 序 单 位 构 成 了 FORTRAN 程 序 的 基 本 单 位, 不 过 在 后 面 我 们 会 看 到, 数 据 块 程 序 单 位 属 于 早 期 版 本 的 遗 留 物, 完 全 是 多 余 的 一 个 完 整 的 FORTRAN 程 序 至 少 需 要 一 个 主 程 序, 而 且 也 只 能 有 一 个 主 程 序 一 般 说 来, 要 完 成 一 个 完 整 的 计 算 任 务, 除 了 一 个 主 程 序 之 外, 往 往 还 需 要 有 函 数 以 及 子 例 行 程 序 作 为 辅 助, 这 时, 主 程 序 的 作 用 就 还 包 括 驱 动 与 管 理 这 些 作 为 过 程 的 外 部 子 程 序, 使 得 它 们 构 成 一 个 整 体, 从 而 完 整 地 解 决 相 关 计 算 问 题 模 块 程 序 单 位 主 要 是 提 供 给 编 程 者 用 来 组 织 程 序 元 素 的 一 个 模 块 程 序 单 位 包 含 了 如 下 几 个 方 面 的 内 容 : 数 据 声 明 ; 派 生 类 型 定 义 ; 过 程 界 面 信 息 ; 供 其 他 程 序 单 位 使 用 的 子 程 序 定 义 因 此 这 样 一 个 程 序 单 位 本 身 不 是 可 执 行 程 序 单 位 数 据 块 程 序 单 位 用 于 给 出 命 名 公 用 块 里 面 的 变 量 的 初 始 值, 因 此 同 样 不 是 可 执 行 程 序 单 位 由 于 FORTRAN 的 现 代 版 本 引 入 了 模 块 结 构, 而 模 块 能 够 提 供 全 局 的 数 据 初 始 化, 因 此 数 据 块 程 序 单 位 几 乎 可 以 说 是 多 余 的 由 于 在 第 13 章 我 们 将 专 门 讨 论 过 程 以 及 过 程 的 应 用, 因 此 属 于 过 程 的 外 部 函 数 子 程 序 和 外 部 子 例 行 程 序 子 程 序, 在 本 章 都 只 是 简 略 说 明, 需 要 详 细 讨 论 的 是 主 程 序 和 模 块 各 种 程 序 单 位 里 面 并 不 是 能 够 使 用 任 何 FORTRAN 语 句, 语 句 类 型 与 程 序 单 位 之 间 的 兼 容 性 在 下 面 的 表 中 予 以 说 明

195 语 句 表 12-1 语 句 与 程 序 单 元 的 兼 容 性 主 程 模 块 说 数 据 序 明 部 分 块 USE 语 句 可 可 可 可 可 可 可 ENTRY 语 句 否 否 否 可 可 否 否 FO RMAT 语 句 可 否 否 可 可 可 否 几 种 声 明 语 句 * 可 可 可 可 可 可 可 D ATA 语 句 可 可 可 可 可 可 否 派 生 类 型 定 义 可 可 可 可 可 可 可 界 面 块 可 可 否 可 可 可 可 语 句 函 数 # 可 否 否 可 可 可 否 CONTAINS 可 可 否 可 可 否 否 可 执 行 语 句 可 否 否 可 可 可 否 注 意 :* 几 种 声 明 语 句 包 括 :PARAMETER 语 句,IMPLICIT 语 句, 类 型 声 明 语 句 以 及 说 明 语 句 # 语 句 函 数 语 句 属 于 过 时 语 言 成 分 一 个 FORTRAN 程 序 总 是 从 主 程 序 的 第 一 个 可 执 行 语 句 开 始 运 行, 在 第 三 章 我 们 已 经 讨 论 过 一 个 完 整 FORTRAN 程 序 的 结 构 在 下 面 的 图 12-1 中, 我 们 再 给 出 一 个 完 整 FORTRAN 程 序 的 外 部 子 程 示 意 图, 它 包 含 了 一 个 主 程 序, 一 个 模 块, 以 及 两 个 子 例 行 程 序 序 模 块 子 程 序 内 部 子 程 序 界 面 体 图 12-1 钟 表 制 作 程 序 的 结 构 在 上 面 的 例 子 里 面, 我 们 假 设 在 装 配 一 块 钟 表 时, 零 件 装 配 与 工 具 配 套 分 别 由 两 个 徒 弟 完 成, 那 么 等 负 责 工 具 配 套 的 徒 弟 把 零 件 都 放 置 在 适 当 的 工 具 旁 边 的 时 候, 就 可 以 让 钟 表 匠 开 始 总 的 钟 表 装 配 工 作 了 因 此 模 块 ACCESSORY_BOX( 附 件 箱 ) 里 面 包 含 了 子 例 行 程 序 PARTS( 零 件 ) 与 TOOL( 工 具 ) 所 需 要 的 一 切 数 据 与 过 程 信 息 主 程 序 调 用 了 子 例 行 程 序 TOOL, 而 主 程 序 本 身 不 需 要 模 块 ACCESSORY_BOX 里 面 的 信 息

196 12.2 主 程 序 主 程 序 说 明 了 整 个 FORTRAN 程 序 的 逻 辑 结 构, 同 时 整 个 程 序 的 运 行 就 是 从 主 程 序 的 第 一 个 可 执 行 语 句 开 始 的 不 过 从 形 式 上 看, 一 个 主 程 序 和 外 部 子 程 序 其 实 的 非 常 类 似 的 一 个 主 程 序 包 括 如 下 三 个 基 本 部 分 : 说 明 部 分 这 个 部 分 定 义 了 程 序 的 数 据 环 境 运 行 部 分 整 个 程 序 从 这 个 部 分 的 第 一 个 可 执 行 语 句 开 始, 该 部 分 给 出 了 整 个 程 序 运 行 的 逻 辑 结 构 内 部 子 程 序 部 分 处 于 主 程 序 内 部 的 与 主 程 序 共 享 数 据 的 过 程 下 面 我 们 分 小 节 说 明 主 程 序 的 说 明 部 分 和 运 行 部 分, 由 于 内 部 子 程 序 部 分 由 一 个 或 多 个 内 部 过 程 组 成, 而 内 部 过 程 的 讨 论 见 12.3, 因 此 在 12.2 略 过 终 止 主 程 序 运 行 的 方 式 有 如 下 两 种 : 在 程 序 的 任 意 位 置 执 行 STOP 语 句, 就 能 即 刻 终 止 整 个 程 序 所 谓 任 意 位 置, 包 括 组 成 程 序 的 任 意 程 序 单 位 的 任 意 位 置 程 序 的 运 行 到 达 主 程 序 的 最 后 一 个 语 句 主 程 序 的 组 织 主 程 序 的 形 式 (R1101) 如 下 : [PROGRAM program-name] [specification-part] [execution-part] [internal-subprogram-part] END [PROGRAM [program-name]] 下 面 是 一 个 最 最 简 单 的 FORTRAN 程 序 : 例 12-1 END 下 面 是 一 个 稍 微 有 意 思 一 点 的 最 简 单 程 序 : 例 12-2 PROGRAM HI PRINT*, HELLO END 主 程 序 的 一 般 规 则 如 下 : PROGRAM 语 句 作 为 主 程 序 的 程 序 头 是 可 选 的, 但 是 其 他 的 程 序 单 位 都 必 须 具 有 程 序 头 如 果 程 序 名 称 出 现 在 END 语 句 当 中 的 话, 那 么 该 名 称 必 须 和 PROGRAM 语 句 里 面 的 名 称 一 样, 并 且 放 置 在 关 键 词 的 后 面 不 能 单 独 出 现 END 语 句 当 中

197 主 程 序 不 提 供 哑 元 主 程 序 不 能 在 任 何 位 置 被 引 用, 也 就 是 说, 主 程 序 不 能 被 直 接 或 间 接 地 递 归 运 行 主 程 序 不 能 包 含 RETURN 语 句 和 ENTRY 语 句, 不 过 主 程 序 里 面 的 内 部 过 程 可 以 包 含 RETURN 语 句 主 程 序 的 说 明 部 分 主 程 序 的 说 明 部 分 主 要 就 是 用 来 描 述 程 序 的 数 据 环 境 主 程 序 里 面 所 能 够 包 含 的 语 句 类 型 见 表 12-1, 具 体 列 出 如 下 表 12-2: ALLOCATABLE COMMON DATA DIMENSION EQUIVALENCE EXTERNAL FORMAT IMPLICIT INTRINSIC NAMELIST 表 12-2 主 程 序 说 明 部 分 允 许 使 用 的 语 句 PARAMETER POINTER SAVE TARGET USE 派 生 类 型 定 义 界 面 块 语 句 函 数 语 句 类 型 声 明 语 句 主 程 序 的 说 明 部 分 的 一 般 规 则 如 下 : OPTIONAL 以 及 INTENT 属 性 或 语 句 都 不 能 在 主 程 序 的 说 明 部 分 出 现, 因 为 它 们 都 只 能 应 用 于 哑 元 可 访 问 性 说 明 PUBLIC 以 及 PRIVATE 都 不 能 出 现 于 主 程 序, 因 为 它 们 都 只 能 应 用 于 模 块 内 部 在 主 程 序 里 面, 动 态 对 象 没 有 意 义 尽 管 在 主 程 序 里 面 可 以 使 用 SAVE 属 性 或 语 句, 但 它 们 在 主 程 序 里 面 并 没 有 实 际 的 作 用 主 程 序 的 运 行 部 分 主 程 序 的 运 行 部 分 由 可 执 行 语 句 构 成, 能 够 出 现 在 主 程 序 的 运 行 部 分 的 语 句 列 出 如 下 表 12-3 所 示 : ALLOCATE BACKSPACE CALL CASE 结 构 CLOSE CONTINUE 表 12-3 主 程 序 运 行 部 分 允 许 使 用 的 语 句 GO TO IF IF 结 构 INQUIRE NULLIFY OPEN

198 CYCLE DATA DEALLOCATE DO 结 构 END ENDFILE ENTRY EXIT FORAL L FORAL L 结 构 FORMA T PRINT READ REWIND STOP WHERE WHERE 结 构 WRITE 算 术 IF 语 句 赋 值 语 句 计 算 GO TO 语 句 指 针 赋 值 语 句 12.3 内 部 过 程 内 部 过 程 和 外 部 过 程 的 主 要 差 别 就 在 于 它 们 的 的 位 置 不 同 : 内 部 过 程 必 须 封 装 在 主 程 序 或 其 他 过 程 子 程 序 内 部, 这 就 导 致 以 下 后 果 : 内 部 过 程 的 名 称 是 局 部 的 而 不 是 全 局 的 ; 内 部 过 程 只 能 被 包 含 了 它 的 定 义 的 程 序 单 位 所 引 用 ; 内 部 过 程 能 够 访 问 它 的 宿 主 的 数 据 对 象 ; 内 部 过 程 可 以 递 归, 不 能 包 含 ENTRY 语 句, 也 不 能 作 为 实 元 传 递 构 造 内 部 过 程 的 主 要 原 因 如 下 : 内 部 过 程 提 供 了 能 够 很 方 便 地 访 问 宿 主 环 境 的 过 程 内 部 过 程 提 供 了 一 种 具 有 语 句 函 数 功 能 的 多 语 句 形 式 便 于 模 块 设 计 以 及 具 有 更 好 的 软 件 工 程 效 能 内 部 过 程 之 所 以 能 够 提 高 安 全 性 以 及 灵 活 性, 是 因 为 其 界 面 非 常 清 晰 宿 主 的 内 部 过 程 部 分 的 形 式 (R210) 为 : CONTAINS internal-subprogram [internal-subprogram] 其 中 的 内 部 子 程 序 由 一 个 或 多 个 内 部 过 程 组 成, 而 内 部 过 程 或 者 是 由 如 下 形 式 (R1216) 的 函 数 组 成 : function-statement [specification-part] [execution-part] END FUNCTION [function-name] 或 者 是 由 如 下 形 式 (R1221) 的 子 例 行 程 序 组 成 : subroutine-statement [specification-part]

199 例 12-3 [execution-part] END SUBROUTINE [subroutine-name] PROGRAM WEATHER CONTAINS FUNCTION STORM(CLOUD) END FUNCTION STORM END 其 中 的 过 程 STORM 就 是 主 程 序 WEATHER 里 面 的 一 个 内 部 过 程 内 部 过 程 的 一 般 规 则 如 下 : 内 部 过 程 内 部 不 能 再 包 含 内 部 过 程, 即 内 部 过 程 不 能 嵌 套 内 部 过 程 不 能 包 含 ENTRY 语 句 内 部 过 程 不 能 包 含 PUBLIC 和 PRIVATE 属 性 或 语 句 内 部 过 程 不 能 作 为 实 元 传 递 内 部 过 程 的 说 明 部 分 除 了 可 以 包 含 主 程 序 的 说 明 部 分 所 许 可 的 语 句 之 外, 还 可 以 包 含 INTENT 语 句 以 及 OPTIONAL 语 句 内 部 过 程 的 运 行 部 分 除 了 可 以 包 含 主 程 序 的 运 行 部 分 所 许 可 的 语 句 之 外, 还 可 以 包 含 RETURN 语 句 在 CONTAINS 语 句 之 后, 至 少 需 要 有 一 个 内 部 子 程 序 内 部 过 程 可 以 被 它 的 宿 主 的 运 行 部 分 引 用, 也 能 够 被 同 一 个 宿 主 里 面 的 所 有 内 部 过 程 引 用, 包 括 它 自 身, 因 此 内 部 过 程 可 以 直 接 或 间 接 地 使 用 递 归 的 形 式 内 部 过 程 名 称 属 于 局 部 名 称, 因 此 满 足 如 下 规 则 : 内 部 过 程 名 称 具 有 比 相 同 名 称 的 外 部 过 程 或 固 有 过 程 更 高 的 优 先 级 内 部 过 程 名 称 必 须 不 同 于 任 何 同 一 个 宿 主 里 面 的 其 他 内 部 过 程 的 名 称, 也 必 须 不 同 于 任 何 通 过 模 块 进 入 宿 主 或 进 入 该 内 部 过 程 的 名 称 内 部 过 程 的 名 称 必 须 不 同 于 任 何 宿 主 或 自 身 内 部 的 其 他 局 部 名 称, 也 必 须 不 同 于 通 过 USE 语 句 可 访 问 的 名 称 有 关 宿 主 以 及 内 部 过 程 里 面 的 其 他 名 称 所 需 要 遵 循 的 规 则 参 见 第 15 章 有 关 宿 主 关 联 的 内 容 12.4 宿 主 关 联 内 部 过 程 当 中 的 某 些 变 量 有 可 能 并 非 源 自 内 部 过 程 本 身, 而 是 从 内 部 过 程 的 宿 主 单 位 继 承 而 来 的, 这 样 的 变 量 被 称 为 宿 主 关 联 的, 它 反 映 了 内 部 程 序 与 宿 主 在 数 据 交 流 方 面 的 密 切 关 系 宿 主 关 联 作 为 一 种 数 据 通 讯 方 式, 同 样 存 在 于 模 块 过 程 与 其 作 用 域 单 位 之 间, 因 此 我 们 将 在 第 15 章 的 更 为 一 般 的 情 形 下 讨 论 它

200 12.5 外 部 子 程 序 同 样 外 部 子 程 序 是 由 一 个 或 多 个 外 部 过 程 组 成, 因 此 下 文 当 中, 我 们 将 根 据 具 体 的 上 下 文 交 替 使 用 外 部 子 程 序 与 外 部 过 程 这 两 个 概 念 外 部 过 程 与 内 部 过 程 从 语 法 上 来 看, 实 质 上 是 一 致 的, 因 为 毕 竟 它 们 都 是 属 于 过 程, 因 此 外 部 子 程 序 的 语 法 形 式 和 内 部 子 程 序 一 样, 即 : 外 部 子 程 序 由 一 个 或 多 个 外 部 过 程 组 成, 而 外 部 过 程 或 者 是 由 如 下 形 式 (R1216) 的 函 数 组 成 : function-statement [specification-part] [execution-part] [internal-subprogram-part] END FUNCTION [function-name] 或 者 是 由 如 下 形 式 (R1221) 的 子 例 行 程 序 组 成 : subroutine-statement [specification-part] [execution-part] [internal-subprogram-part] END SUBROUTINE [subroutine-name] 这 是 两 种 不 同 风 格 的 过 程 形 式 同 时, 外 部 过 程 与 内 部 过 程 又 具 有 如 下 一 些 很 重 要 的 差 别 : 对 于 一 个 FORTRAN 程 序 来 说, 外 部 子 程 序 是 全 局 性 的, 因 为 它 可 以 在 任 何 位 置 被 调 用 或 引 用, 相 反, 内 部 过 程 则 只 是 对 于 它 的 宿 主 而 言 是 已 知 的 外 部 过 程 的 界 面 在 它 被 其 他 过 程 引 用 的 时 候, 并 非 已 知 的, 因 为 外 部 过 程 一 般 都 是 单 独 编 译 的 ; 相 反, 对 于 内 部 过 程 来 说, 它 是 由 它 的 宿 主 单 位 编 译 的, 因 此 在 它 的 宿 主 单 位 引 用 它 的 时 候, 它 的 界 面 信 息 必 定 已 经 给 出 了 具 有 与 生 俱 来 的 显 式 界 面 是 内 部 过 程 或 模 块 过 程 的 一 个 很 大 的 优 点, 它 的 好 处 将 在 第 13 章 讨 论 相 比 之 下, 外 部 过 程 就 只 能 单 独 给 出 它 的 界 面 信 息 从 FORTRAN 标 准 语 法 上 来 看, 外 部 过 程 可 以 包 含 内 部 过 程, 而 内 部 过 程 则 不 能 包 含 内 部 过 程, 不 过 也 有 许 多 FORTRAN 的 实 现 都 允 许 内 部 过 程 的 嵌 套 下 面 是 外 部 过 程 的 两 个 不 同 形 式 的 例 子 : 例 12-4 FUNCTION CIRCLE(NET) INTEGER CIRCLE CIRCLE=NODE END FUNCTION 这 个 例 子 使 用 了 函 数 作 为 外 部 过 程 例 12-5

201 SUBROUTINE TAYLOR(I,J) I= J= END SUBROUTINE 这 个 例 子 使 用 了 子 例 行 程 序 作 为 外 部 过 程 外 部 子 程 序 的 一 般 规 则 如 下 : 外 部 子 程 序 作 为 程 序 单 位 的 头, 即 FUNCTION 语 句 或 SUBROUTINE 语 句, 是 不 能 省 略 的, 这 点 与 主 程 序 不 同 如 果 在 END 语 句 出 现 过 程 名 称, 那 么 它 必 须 与 头 语 句 里 面 的 过 程 名 称 一 样 用 于 哑 元 的 INTENT 和 OPTIONAL 属 性 或 语 句 可 以 出 现 在 外 部 子 程 序 的 说 明 部 分, 注 意 它 们 只 能 应 用 于 哑 元 外 部 子 程 序 的 说 明 部 分 和 运 行 部 分 都 可 以 包 含 ENTRY 语 句 ; 运 行 部 分 可 以 包 含 RETURN 语 句 外 部 子 程 序 不 能 包 含 用 来 说 明 可 访 问 性 的 PUBLIC 或 PRIVATE 属 性 或 语 句 外 部 过 程 可 以 采 用 直 接 或 间 接 的 递 归 形 式, 这 时, 在 该 过 程 的 头 语 句 里 面 必 须 使 用 关 键 词 RECURSIVE 一 个 外 部 子 程 序 对 于 在 它 内 部 定 义 的 内 部 过 程 而 言, 就 是 宿 主 单 位 外 部 过 程 名 称 可 以 在 过 程 引 用 的 时 候 作 为 实 元 来 使 用, 相 应 的 哑 元 就 是 引 用 它 的 过 程 里 面 的 过 程 哑 元 无 论 是 外 部 过 程, 内 部 过 程 或 模 块 过 程, 作 为 过 程 的 更 加 一 般 的 讨 论 参 见 第 13 章 12.6 模 块 模 块 是 到 了 FORTRAN90 版 标 准 之 后 才 引 入 的 一 个 极 其 强 大 的 程 序 结 构 单 位 形 式 只 要 是 多 于 一 个 程 序 单 位 都 需 要 使 用 的 任 何 东 西, 都 可 以 封 装 在 一 个 模 块 里 面, 供 相 关 的 程 序 单 位 使 用 在 F ORTRAN 的 早 期 版 本 当 中, 为 了 解 决 一 些 程 序 要 素 的 重 复 使 用 问 题, 使 用 了 INCLUDE 行, 它 的 功 能 纯 粹 只 是 把 一 段 源 码 原 封 不 动 地 引 入 某 个 程 序 ( 参 见 第 四 章 ), 相 当 于 COPY+PASTE 的 功 能, 以 避 免 在 重 复 写 入 别 处 的 源 码 段 时 可 能 出 现 的 笔 误, 也 节 省 编 写 源 码 的 工 作 量 但 是 这 样 一 种 解 决 方 式 是 非 常 有 局 限 性 的, 因 为 这 完 全 只 是 一 种 形 式 上 的 重 用, 根 本 不 具 有 灵 活 性 与 多 功 能 性, 因 此 到 了 制 订 FORTRAN90 标 准 的 时 候, 就 引 入 了 符 合 现 代 编 程 风 格 的 模 块 结 构, 使 得 INC LUDE 行 逐 渐 退 出 了 历 史 舞 台 模 块 为 FORTRAN 解 决 了 如 下 的 问 题 : 解 决 了 大 量 的 与 全 局 性 数 据 公 用 块 相 关 联 的 可 靠 性 问 题, 因 为 对 于 全 局 性 数 据 来 说, 名 称 关 联 比 存 储 关 联 更 为 有 必 要 提 供 了 更 为 可 靠 的 定 义 派 生 类 型 的 方 式 许 多 的 情 形 下 都 要 求 显 式 的 界 面, 而 模 块 正 好 满 足 了 这 种 需 求 提 供 了 极 其 重 要 的 信 息 隐 藏 功 能, 模 块 保 证 了 可 靠 性 所 要 求 的 有 效 的 封 装 与 隐 藏 功 能 尽 管 模 块 可 以 包 含 被 其 他 程 序 单 位 的 运 行 部 分 引 用 的 可 执 行 过 程, 但 它 自 身 并 不 是 可 执 行 的 程 序 单 位, 实 质 上 它 只 是 被 动 地 提 供 信 息, 在 这 个 意 义 上, 模 块 就 已 经 是 足 够 强 大 的 管 理 程 序 的 组 织 与 简 化 程 序 设 计 的 工 具

202 模 块 的 组 织 模 块 的 语 法 形 式 (R1104) 为 : MODULE module-name [specification-part] [module-subprogram-part] END [MODULE [module-name]] 模 块 的 名 称 如 果 出 现 在 END 语 句, 那 么 必 须 和 MODULE 语 句 里 面 的 模 块 名 称 一 样 模 块 的 说 明 部 分 示 : 模 块 的 说 明 部 分 与 其 他 的 程 序 单 位 的 说 明 部 分 非 常 类 似, 它 可 以 包 含 的 语 句 如 下 表 12-4 所 ALLOCATABLE COMMON DATA DIMENSION EQUIVALENCE EXTERNAL IMPLICIT INTRIN SIC NAMELIST PARAMETER 表 12-4 模 块 说 明 部 分 允 许 使 用 的 语 句 POINTER PRIVATE PUBLIC SAVE TARGET USE 派 生 类 型 定 义 界 面 块 类 型 声 明 语 句 模 块 的 说 明 部 分 的 一 般 规 则 如 下 : 不 允 许 使 用 OPTIONAL 和 INTENT 属 性 或 语 句 不 允 许 使 用 ENTRY 语 句 不 允 许 使 用 FORMAT 语 句 不 允 许 使 用 动 态 对 象 不 允 许 使 用 语 句 函 数 语 句 可 以 使 用 PUBLIC 和 PRIVATE 属 性 或 语 句 注 意 在 模 块 的 说 明 部 分 中 使 用 SAVE 属 性 或 语 句 是 非 常 必 要 的, 因 为 SAVE 能 够 保 证 模 块 里 面 的 数 据 对 象, 不 会 受 到 使 用 该 模 块 的 其 他 程 序 单 位 的 影 响 如 果 没 有 使 用 SAVE 属 性 或 语 句 的 话, 那 么 相 应 的 数 据 对 象 常 常 会 被 使 用 该 模 块 的 其 他 程 序 单 位 去 定 义, 而 使 用 SAVE 属 性 或 语 句, 则 能 够 保 证 相 应 的 数 据 对 象 保 留 其 定 义 状 态 例 12-6 MODULE DATA1 SAVE INTEGER::X,IX REAL::K=0.01

203 REAL::Y(10,20),Z(20,30) END MODULE DATA1 SUBROUTINE TASK1 USE DATA1 END SUBROUTINE TASK1 在 上 面 的 模 块 DATA1 当 中, 声 明 了 三 个 标 量 变 量 : X,IX 和 K, 其 中 K 给 出 了 初 始 值, 还 有 两 个 数 组 :Y(10,20),Z(20,30), 这 5 个 数 据 对 象 都 是 全 局 性 的, 都 可 以 在 任 何 时 候 被 其 他 的 程 序 单 元 使 用 在 后 面 的 子 例 行 程 序 TASK1 里 面 就 通 过 USE 语 句 使 用 了 这 5 个 变 量 模 块 的 子 程 序 部 分 在 语 法 上, 模 块 的 子 程 序 部 分 类 似 于 主 程 序 的 内 部 过 程 部 分 或 外 部 子 程 序 模 块 的 子 程 序 部 分 由 一 个 或 多 个 模 块 过 程 组 成, 它 们 通 过 宿 主 关 联 共 享 模 块 的 数 据 环 境, 不 过 模 块 的 子 程 序 部 分 与 内 部 子 程 序 有 如 下 两 个 基 本 的 差 别 : 模 块 过 程 的 组 织 结 构, 规 则 与 限 制 都 与 外 部 过 程 的 一 样, 而 与 内 部 过 程 的 不 同, 例 如 模 块 过 程 可 以 包 含 内 部 过 程, 而 内 部 过 程 不 能 包 含 内 部 过 程 模 块 过 程 并 非 严 格 地 局 限 于 宿 主 模 块, 也 不 是 全 局 性 地 面 对 整 个 程 序, 只 有 使 用 了 模 块 的 程 序 单 位 才 能 访 问 没 有 标 记 为 PRIVATE 的 模 块 过 程 模 块 子 程 序 部 分 的 语 法 形 式 (R212) 为 : CONTAINS module-subprogram [module-subprogram] 其 中 的 模 块 子 程 序 或 者 是 由 如 下 形 式 (R1216) 的 函 数 组 成 : function-statement [specification-part] [execution-part] [internal-subprogram-part] END FUNCTION [function-name] 或 者 是 由 如 下 形 式 (R1221) 的 子 例 行 程 序 组 成 : subroutine-statement [specification-part] [execution-part] [internal-subprogram-part] END SUBROUTINE [subroutine-name] 这 是 两 种 不 同 风 格 的 过 程 形 式 模 块 过 程 的 一 个 例 子 如 下 : 例 12-7

204 MODULE INTERNAL. CONTAINS FUNCTION SET_INTERNAL(KEY) END FUNCTION END 注 意 模 块 过 程 通 过 宿 主 关 联 来 访 问 它 的 宿 主 模 块 的 数 据 对 象, 但 不 能 访 问 使 用 该 模 块 的 程 序 单 位 的 数 据 对 象 CONTAINS 语 句 后 面 至 少 需 要 有 一 个 内 部 子 程 序 模 块 的 使 用 方 法 任 何 一 个 程 序 单 位 都 可 以 通 过 USE 语 句 来 使 用 一 个 模 块 里 面 的 说 明 与 定 义 这 样 一 种 从 模 块 外 部 的 程 序 单 位 到 模 块 内 部 的 命 名 对 象 的 访 问, 导 致 一 种 关 联, 称 为 使 用 关 联 USE 语 句 必 须 跟 在 要 使 用 模 块 的 程 序 单 位 的 头 语 句 后 面, 对 于 USE 语 句 的 数 目 并 没 有 具 体 的 限 制 每 个 模 块 里 面 的 命 名 对 象 都 具 有 PUBLIC 属 性 或 者 PRIVATE 属 性, 这 两 个 属 性 决 定 了 该 对 象 是 否 可 以 被 使 用 该 模 块 的 程 序 单 位 所 使 用, 即 : 如 果 具 有 PUBLIC 属 性, 则 可 以 被 使 用 该 模 块 的 程 序 单 位 所 使 用, 当 然 这 种 可 访 问 性 也 有 可 能 遭 到 USE 语 句 本 身 的 限 制 如 果 具 有 PRIVATE 属 性, 则 不 能 被 使 用 该 模 块 的 程 序 单 位 所 使 用 下 面 的 图 12-2 表 示 了 模 块 内 对 象 与 外 部 程 序 单 位 的 使 用 关 联 图 12-2 模 块 内 对 象 与 外 部 程 序 单 位 的 使 用 关 联 1. 访 问 模 块 内 的 所 有 公 用 对 象 USE 语 句 最 简 单 的 功 能 就 是 通 过 使 用 该 语 句, 外 部 程 序 单 位 可 以 访 问 模 块 内 部 的 所 有 公 用 对 象 USE 语 句 的 语 法 形 式 (R1107) 为 :

205 USE module-name 如 果 外 部 程 序 单 位 在 引 用 了 模 块 的 公 用 命 名 对 象 后, 导 致 与 程 序 单 位 自 身 的 命 名 对 象 的 冲 突, 或 违 反 了 该 程 序 单 位 的 命 名 约 定, 那 么 就 需 要 在 USE 语 句 当 中 加 上 改 名 选 项, 即 : USE module-name,rename-list 其 中 改 名 列 表 (rename-list) 里 面 的 每 个 元 素 都 具 有 以 下 形 式 (R1108): local-name=>module-entity-name 即 给 每 个 模 块 内 需 要 使 用 的 对 象 的 名 称 (module-entity-name) 重 新 赋 予 一 个 新 的 程 序 单 位 内 使 用 的 本 地 名 称 (local-name) 例 12-8 USE FOURIER USE S_LIB, PRESSURE => X_PRES 注 意 改 名 的 形 式 与 赋 值 语 句 的 相 似 性, 但 是 改 名 属 于 USE 语 句 内 的 一 个 选 项, 而 不 是 一 个 单 独 的 语 句 2. 访 问 模 块 内 的 部 分 公 用 对 象 如 果 要 想 让 外 部 程 序 单 位 只 是 访 问 一 个 模 块 的 部 分 公 用 对 象, 则 使 用 如 下 形 式 的 USE 语 句 : USE module-name, ONLY:access-list 即 在 USE 语 句 的 ONLY 子 句 里 面 显 式 指 出 可 以 访 问 的 公 用 对 象 对 于 这 些 公 用 对 象 也 可 以 根 据 程 序 单 位 的 本 地 要 求 进 行 改 名 可 访 问 对 象 列 表 里 面 的 元 素 的 形 式 可 以 具 有 如 下 这 些 形 式 (R1109): [local-name=>]module-entity-name OPERATOR(defined-operator) ASSIGNMENT(=) 即 除 了 模 块 对 象 名 称 之 外, 还 可 以 是 模 块 内 定 义 的 自 定 义 运 算 或 赋 值 界 面 例 12-9 USE TENSOR1,ONLY:X,Y,OPERATOR(.CROSS.) USE MONTHS,ONLY:JANUARY=>JAN,MAY 3. 模 块 内 的 对 象 的 可 访 问 性 在 模 块 内 部, 如 下 类 型 的 对 象 都 可 以 被 声 明, 定 义, 或 说 明, 并 且 可 以 具 有 公 用 属 性, 然 后 就 可 以 被 外 部 程 序 单 位 通 过 USE 语 句 而 使 用, 其 中 除 了 自 定 义 运 算 和 赋 值 界 面 之 外, 还 可 以 被 改 名 这 些 对 象 包 括 : 经 过 声 明 的 变 量 ; 命 名 常 量 ; 派 生 类 型 定 义 ; 过 程 界 面 ; 模 块 过 程 和 固 有 过 程 ;

206 通 用 识 别 符 ; 名 称 列 表 集 合 公 用 块 也 可 以 放 置 在 模 块 里 面, 由 于 公 用 块 的 名 称 总 是 全 局 性 的, 因 此 公 用 块 名 称 总 是 可 以 被 模 块 外 部 访 问, 并 且 不 需 要 使 用 额 外 的 USE 语 句, 不 过 如 果 要 对 公 用 块 里 面 的 变 量 进 行 改 名, 则 可 以 使 用 加 改 名 选 项 的 USE 语 句 在 默 认 情 况 下, 模 块 里 面 的 上 述 所 有 对 象 都 是 具 有 PUBLIC 属 性 的, 如 果 使 用 一 个 PRIVATE 语 句 加 上 空 的 对 象 列 表, 则 把 模 块 内 的 所 有 对 象 的 属 性 改 为 私 用 的 了 当 然 可 以 使 用 PRIVATE 语 句 或 在 类 型 声 明 语 句 当 中 附 加 PRIVATE 属 性 的 方 式 单 独 地 对 单 个 对 象 赋 予 私 用 属 性 而 一 旦 默 认 可 访 问 属 性 被 改 为 PRIVATE 之 后, 还 可 以 使 用 PUBLIC 语 句 或 在 类 型 声 明 语 句 当 中 附 加 PUBLIC 属 性 的 方 式 单 独 地 对 单 个 对 象 赋 予 公 用 属 性 相 比 之 下, 模 块 内 部 的 任 何 对 象, 包 括 模 块 内 部 的 模 块 过 程 里 面 的 对 象, 都 可 以 通 过 宿 主 关 联 而 被 模 块 过 程 访 问 模 块 内 部 对 象 的 这 两 种 被 访 问 方 式 以 及 它 们 各 自 的 特 点, 示 意 于 下 面 的 图 12-3 图 12-3 模 块 内 对 象 的 使 用 关 联 与 宿 主 关 联 把 U SE-ONLY 语 句 和 模 块 内 的 PUBLIC 以 及 PRIVATE 属 性 这 两 种 方 式 综 合 起 来, 就 使 得 模 块 兼 具 了 信 息 安 全 性 和 数 据 访 问 灵 活 性 4. 使 用 模 块 时 的 可 能 的 名 称 冲 突 当 一 个 外 部 程 序 单 位 使 用 某 个 模 块 时, 有 可 能 出 现 以 下 两 种 名 称 冲 突 的 情 形 : 模 块 内 的 公 用 对 象 和 外 部 程 序 单 位 内 的 本 地 对 象 具 有 相 同 的 名 称 ; 一 个 外 部 程 序 单 位 同 时 使 用 了 两 个 或 多 个 模 块, 它 们 的 公 用 对 象 具 有 相 同 的 名 称 这 样 的 冲 突 只 有 在 产 生 冲 突 的 名 称 永 远 也 不 会 被 引 用 的 情 形 下 才 能 够 容 忍, 否 则, 就 必 须 使 用 改 名 选 项 或 USE 语 句 的 ONLY 子 句, 来 限 制 相 关 对 象 的 使 用 例 MODULE BLUE INTEGER A,B,C END MODULE BLUE

207 MODULE GREEN USE BLUE, ONLY: A1=>A REAL B,C END MODULE GREEN! 在 下 面 的 程 序 RED 里 面 :! 用 A1 或 A 访 问 整 型 A;! 用 B 访 问 整 型 B;! 用 B1 访 问 实 型 B;!C 不 能 被 访 问, 因 为 存 在 名 称 冲 突 PROGRAM RED USE BLUE! 访 问 了 A,B, USE GREEN B1=>B! 用 A1 访 问 A, 用 B1 访 问 B, 访 问 C END PROGRAM 5. 使 用 关 联 当 一 个 外 部 程 序 单 位 通 过 使 用 USE 语 句 而 访 问 一 个 模 块 里 面 它 自 身 所 不 具 有 的 对 象 时, 就 意 味 着 这 些 被 访 问 的 对 象 与 外 部 程 序 发 生 了 关 联, 这 种 关 联 称 为 使 用 关 联 ; 相 比 之 下, 在 模 块 的 内 部, 当 模 块 里 面 的 模 块 过 程 访 问 其 宿 主 模 块 的 对 象 时 所 发 生 的 关 联, 称 为 宿 主 关 联 使 用 关 联 与 宿 主 关 联 具 有 如 下 两 个 重 要 的 差 别 : 一 个 模 块 的 隐 式 类 型 规 则 对 于 使 用 它 的 外 部 程 序 单 位 的 环 境 没 有 影 响 通 过 USE 语 句 来 访 问 的 对 象, 不 能 在 它 所 在 的 本 地 重 说 明, 改 名 不 属 于 重 说 明 范 畴 不 过 这 个 规 则 存 在 一 个 例 外, 即 假 如 外 部 程 序 单 位 本 身 是 一 个 模 块, 那 么 它 从 某 个 模 块 访 问 得 到 的 对 象, 可 以 在 它 的 内 部 重 新 说 明 为 具 有 PRIVATE 属 性, 显 然, 该 对 象 在 原 来 的 模 块 里, 是 具 有 PUBLIC 属 性 的 例 设 一 个 程 序 单 位 使 用 如 下 所 示 的 模 块 M2, 那 么 它 就 只 能 使 用 对 象 X, 而 不 能 使 用 对 象 Y, 因 为 Y 在 M2 里 面 被 重 说 明 为 具 有 PRIVATE 属 性, 尽 管 Y 来 自 模 块 M1, 并 且 在 M1 里 面 是 具 有 PUBLIC 属 性 的 MODULE M2 USE M1,ONLY:X,Y PRIVATE Y END MODULE M2 对 象 不 能 被 重 说 明 意 味 着 同 一 个 公 用 块, 也 不 能 在 模 块 和 相 应 的 外 部 程 序 单 位 里 面 被 说 明 这 也 就 意 味 着 本 地 的 对 象 不 能 和 从 模 块 里 面 访 问 得 到 的 对 象 等 价 一 个 模 块 可 以 一 个 或 多 个 COMMON 块, 这 些 COMMON 块 总 是 可 以 被 访 问 的, 这 意 味 着 它 们 不 能 在 使 用 它 们 的 宿 主 模 块 的 外 部 程 序 单 位 不 能 再 次 声 明 它 们 因 为 从 一 个 模 块 里 面 访 问 得 到 的 名 称 不 能 在 本 地 被 重 新 说 明, 所 以 要 从 不 同 的 模 块 里 面 访 问 同 一 个 名 称, 就 只 有 在 下 面 的 两 种 情 形 下, 才 有 可 能 :

208 从 不 同 的 模 块 里 面 访 问 得 到 的 同 名 对 象 本 身 就 是 同 一 个 对 象 ; 如 果 从 不 同 的 模 块 里 面 访 问 得 到 的 同 名 对 象 不 是 同 一 个 对 象, 那 么 只 要 该 名 称 并 没 有 被 外 部 程 序 单 位 引 用, 那 么 也 是 可 能 的 模 块 的 典 型 应 用 如 下 几 种 功 能 可 以 很 容 易 地 包 装 在 一 个 模 块 里 面 : 全 局 数 据, 包 括 数 据 结 构 和 公 用 块 自 定 义 运 算 软 件 库 数 据 抽 象 所 有 模 块 的 典 型 应 用 也 就 集 中 在 这 4 种 功 能 上, 下 面 分 别 予 以 讨 论 1. 全 局 数 据 利 用 模 块 可 以 很 容 易 地 在 整 个 程 序 当 中 进 行 全 局 性 的 类 型 定 义 与 数 据 声 明 模 块 当 中 的 数 据 并 不 存 在 隐 式 的 存 储 关 联, 也 不 存 在 任 何 隐 式 地 对 这 些 数 据 的 的 排 列 顺 序 的 约 定 模 块 当 中 的 全 局 数 据 可 以 是 任 意 的 类 型, 或 任 意 类 型 的 组 合 例 MODULE MODELS COMPLEX ::A(33,98) REAL::X(50) REAL, ALLOCATABLE::Y(:),Z(:,:) INTEGER LVA,RVA END MODELS 使 用 这 个 模 块 的 方 式 可 以 有 如 下 几 种 : USE MODELS 通 过 这 种 方 式 可 以 使 用 模 块 内 的 任 意 对 象 以 及 它 们 的 属 性 USE MODELS,ONLY:A,Z 通 过 这 种 方 式 可 以 使 用 模 块 内 的 对 象 A 和 Z USE MODELS,K=>LVA 通 过 这 种 方 式 可 以 使 用 模 块 内 的 任 意 对 象 以 及 它 们 的 属 性, 只 是 其 中 的 整 型 LVA 需 要 改 名 为 K 2. 模 块 内 的 公 用 块 把 一 个 公 用 块 封 装 起 来 的 一 种 方 法, 就 是 把 它 放 置 在 一 个 模 块 里 面 例 MODULE COFF COMMON

209 COMMON COMMON COMMON /BLOCK1/ END MODULE PROGRAM EQU1 USE COFF END 上 面 的 例 子 里 面, 在 程 序 EQU1 里 面 使 用 了 USE 语 句 后, 就 可 以 访 问 模 块 COFF 里 面 的 公 用 块 里 面 的 所 有 变 量 运 用 模 块 来 封 装 公 用 块, 显 然 最 大 程 度 地 减 少 了 当 公 用 块 被 多 个 程 序 单 位 使 用 时, 所 产 生 的 错 误 3. 全 局 派 生 类 型 模 块 当 中 的 派 生 类 型 定 义 可 以 通 过 USE 语 句 而 得 到 多 个 程 序 单 位 的 使 用 例 MODULE NEW_TYPE TYPE NODE_STAT REAL X COMPLEX Z END TYPE NODE_STAT END MODULE NEW_TYPE 然 后, 只 要 任 何 程 序 单 位 通 过 USE 来 使 用 该 模 块 的 话, 就 可 以 在 它 的 内 部 声 明 属 于 派 生 类 型 NODE_STAT 的 数 据 对 象 4. 算 符 的 扩 展 算 符 与 赋 值 符 号 都 可 以 进 行 如 下 形 式 的 扩 展 : 一 个 界 面 块 可 以 用 来 声 明 新 的 算 符, 或 者 对 固 有 算 符 定 义 新 的 含 义 赋 值 符 号 = 也 可 以 定 义 新 的 含 义, 或 者 对 于 派 生 类 型 的 固 有 赋 值 也 可 以 进 行 重 定 义 注 意, 只 有 对 于 派 生 类 型 的 赋 值, 才 能 进 行 固 有 算 符 或 固 有 赋 值 的 重 定 义 在 进 行 这 样 的 扩 展 时, 要 求 界 面 块 具 有 OPERATOR 或 ASSIGNMENT 属 性 一 般 说 来, 这 样 的 界 面 块 都 放 置 在 一 个 模 块 里 面, 以 便 利 用 模 块 的 可 靠 性 与 灵 活 性 例 INTERFACE OPERATOR(.INVERSE.) FUNCTION INVERSE(MATRIX1) TYPE(MATRIX),INTENT(IN)::MATRIX1 TYPE(MATRIX)::INVERSE END FUNCTION INVERSE

210 END INTERFACE 在 上 面 的 例 子 当 中, 运 用 具 有 OPERATOR 属 性 的 界 面 来 定 义 矩 阵 的 逆, 这 就 要 求 定 义 一 个 求 逆 的 函 数 以 及 定 义 自 定 义 运 算 的 界 面 块 这 就 是 上 面 定 义 的 函 数 INVERSE 与 算 符.INVERSE., 然 后 就 可 以 把 这 个 自 定 义 算 符 运 用 于 其 他 表 达 式, 例 如 : 0.5+(.INVERSE.A) 注 意 其 中 的 加 法 + 也 必 须 扩 展 为 一 个 实 型 值 与 一 个 矩 阵 的 加 法 5. 数 据 抽 象 把 类 型 定 义 和 运 算 封 装 到 一 个 模 块 当 中 对 于 相 关 的 程 序 单 位 尤 其 方 便 例 MODULE POLAR_COORDINATES TYPE POLAR PRIVATE REAL RHO,THETA END TYPE POLAR INTERFACE OPERATOR(*) MODULE PROCEDURE POLAR_MULT END INTERFACE CONTAINS FUNCTION POLAR_MULT(P1, P2) TYPE (POLAR), INTENT(IN) :: P1,P2 TYPE(POLAR) POLAR_MULT POLAR_MULT = POLAR(P1 % RHO * P2 %RHO, & P1 %THETA + P2 % THETA) END FUNCTION POLAR_MULT END MODULE POLAR_COORDINATES 在 上 面 的 例 子 当 中, 利 用 函 数 POLAR_MULT, 结 构 构 造 器 POLAR 计 算 得 到 一 个 数 值, 表 示 了 在 极 坐 标 里 面 两 个 变 量 的 乘 积, 这 样 任 何 访 问 模 块 POLAR_COORDINATES 的 程 序 单 位, 都 可 以 同 时 数 据 类 型 POLAR 和 对 固 有 运 算 * 的 一 个 扩 展, 即 极 坐 标 乘 法 这 样 的 一 个 把 运 算 与 数 据 对 象 封 装 到 一 个 模 块 的 方 法, 称 为 数 据 抽 象 6. 过 程 库 一 个 模 块 可 以 包 含 相 应 于 过 程 的 一 系 列 界 面 块, 从 而 构 成 一 个 过 程 库 例 MODULE ENG_LIBRARY INTERFACE

211 FUNCTION FOURIER(X,Y) END SUBROUTINE INPUT(A,B,C,L) OPTIONAL C END SUBROUTINE INPUT END INTERFACE END MODULE ENG_LIBRARY 其 中 的 子 例 行 程 序 INPUT 可 以 使 用 如 下 的 方 式 调 用 : CALL INPUT (AXX, L=LXX, B=BXX) 如 果 多 个 过 程 都 需 要 访 问 相 同 的 类 型 定 义 和 数 据 声 明, 那 么 它 们 构 成 一 个 集 合, 就 可 以 都 放 置 在 一 个 模 块 里 面 例 MODULE BOOKKEEPER TYPE,PRIVATE::IDDATA INTEGER IDNUMBER CHARACTER(25) NAME,ADDRESS(3) REAL BALANCE END TYPE IDDATA REAL,PRIVATE::GROSSIN,EXPENSES,PROFIT,LOSS INTEGER,PARAMETER::NUMCUST=1000,& NUMBER=100KUIBU NUMCH=10 CONTAINS SUBROUTINE ACCTS_RECEIVABLE(CUST_ID, AMOUNT) END SUBROUTINE ACCTS_RECEIVABLE SUBROUTINE ACCTS_PAYABLE(CUST_ID, AMOUNT) END SUBROUTINE ACCTS_PAYABLE SUBROUTINE PAYROLL(EMP_ID, AMOUNT) END SUBROUTINE PAYROLL FUNCTION BOTTOM_LINE(AMOUNT) END FUNCTION BOTTOM_LINE END MODULE

212 数 据 块 程 序 单 位 一 个 数 据 块 程 序 单 位 提 供 了 一 个 命 名 公 用 块 里 面 的 初 始 数 据 值, 还 包 含 了 相 应 的 数 据 说 明 在 数 据 块 程 序 单 位 里 面 不 存 在 可 执 行 语 句, 它 的 唯 一 功 能 就 是 提 供 初 始 数 据 实 际 上 它 的 这 个 功 能 完 全 可 以 由 模 块 来 实 现, 因 此 这 种 程 序 单 位 纯 粹 只 是 FORTRAN 早 期 版 本 的 残 留 物, 已 经 完 全 过 时 数 据 块 程 序 单 位 在 其 他 程 序 单 位 里 面 是 通 过 EXTERNAL 语 句 来 引 用 的, 它 的 语 法 形 式 (R1112) 为 : BLOCK DATA[block-data-name] [specification-part] END [BLOCK DATA[block-data-name]] 数 据 块 程 序 单 位 的 一 般 规 则 如 下 : 可 以 只 出 现 一 个 无 名 的 数 据 块 程 序 单 位 如 果 在 END 语 句 出 现 数 据 块 单 位 名 称, 那 么 必 须 和 BLOCK DATA 语 句 里 面 的 名 称 一 样 在 数 据 块 程 序 单 位 的 说 明 部 分 只 能 出 现 如 下 表 12-5 所 示 的 语 句 或 属 性, 其 他 语 句 或 属 性 则 不 能 出 现 : 数 据 块 程 序 单 位 可 以 对 多 个 命 名 公 用 块 里 面 的 对 象 进 行 初 始 化 无 须 初 始 化 整 个 公 用 块 如 果 在 数 据 块 程 序 单 位 里 面 给 出 了 某 个 公 用 块 里 面 的 对 象 的 初 始 值, 那 么 该 公 用 块 必 须 是 完 全 说 明 的 一 个 给 定 的 命 名 公 用 块 可 以 只 出 现 在 一 个 数 据 块 程 序 单 位 里 面 例 BLOCK DATA SEQ COMMON / BLOCK1 / A,B,C DATA A/1.02/,B/9.01/,C/0.04/ END BLOCK DATA SEQ COMMON DATA DIMENSION EQUIVALENCE IMPLICIT INTRINSIC PARAMETER 表 12-5 数 据 块 程 序 单 位 的 说 明 部 分 所 许 可 的 语 句 或 属 性 POINTER SAVE TARGET USE 派 生 类 型 定 义 类 型 声 明 语 句

213 第 13 章 过 程 及 其 通 讯 如 果 说 一 个 语 句 可 以 看 成 是 一 条 指 令, 那 么 在 FORTRAN 95 语 言 里, 一 个 具 有 一 定 结 构 的 计 算 任 务 可 以 对 应 的 最 小 程 序 单 位, 就 是 一 个 过 程 从 专 致 于 科 学 计 算 的 初 衷 出 发,FORTRAN 在 语 言 的 结 构 层 面 上, 可 以 认 为 是 面 向 过 程 的 一 种 语 言, 尽 管 在 编 程 语 言 流 行 面 向 对 象 的 今 天, 面 向 过 程 显 得 有 点 落 伍, 但 却 有 效 地 适 用 于 描 述 计 算 任 务, 当 然 随 着 现 代 技 术 对 于 计 算 的 要 求 越 来 越 复 杂 与 庞 大,FORTRAN 也 不 是 一 味 地 守 旧, 可 以 预 计 FORTRAN 的 下 一 个 版 本, 就 会 具 有 适 应 大 型 软 件 工 程 的 要 求 的 面 向 对 象 的 语 言 特 性 FORTRAN 95 语 言 作 为 一 种 语 言 的 主 要 特 点, 可 以 说 就 体 现 在 它 的 过 程 这 个 主 要 的 程 序 结 构 上 而 从 我 们 程 序 编 写 者 的 角 度 来 看, 能 否 把 一 个 完 整 的 算 法 转 写 成 一 个 完 整 的 程 序, 关 键 也 就 在 于 能 否 构 造 出 一 些 恰 当 的 过 程 来 作 为 程 序 的 基 本 单 位 特 别 是 对 于 大 型 的 FORTRAN 95 程 序, 需 要 把 它 分 解 为 好 几 百 个 过 程 是 很 常 见 的, 这 时 如 何 恰 当 地 使 用 过 程 来 构 建 整 个 程 序, 可 以 说 是 编 写 程 序 最 主 要 的 工 作 因 此 如 何 构 建 过 程, 如 何 根 据 需 求 运 用 过 程, 然 后 在 不 同 的 过 程 之 间 建 立 必 要 的 通 讯, 是 值 得 我 们 非 常 仔 细 地 加 以 讨 论 的 本 章 的 主 要 任 务 即 在 于 此 13.1 过 程 的 分 类 与 性 质 由 于 过 程 具 有 多 方 面 的 功 能 与 属 性, 因 此 对 于 过 程 的 分 类 可 以 有 多 种 方 式 下 面 我 们 首 先 讨 论 过 程 的 各 种 分 类 方 式 及 其 相 应 的 分 类 意 义, 然 后 我 们 讨 论 有 关 过 程 引 用 的 要 点 与 相 应 概 念 过 程 的 分 类 过 程 可 以 有 几 个 不 同 的 分 类 方 式, 每 种 分 类 方 式 反 映 了 过 程 的 某 个 方 面 的 特 性 下 面 分 别 予 以 讨 论 从 形 式 上 根 据 调 用 的 方 式 的 不 同,FORTRAN 的 过 程 分 为 两 类 : 函 数 ; 函 数 返 回 一 个 可 以 供 表 达 式 使 用 的 值 因 此 函 数 的 调 用 总 是 作 为 一 个 表 达 式 的 算 元, 函 数 的 值 也 就 是 相 应 表 达 式 算 元 的 取 值 函 数 调 用 时 直 接 使 用 函 数 的 名 称 和 它 的 变 量, 或 者 作 为 一 个 自 定 义 运 算, 它 返 回 值 之 后, 它 的 功 能 就 算 完 成, 不 对 程 序 产 生 后 效, 当 然,FORTRAN 标 准 也 不 绝 对 禁 止 使 用 产 生 一 定 后 效 的 函 数 子 例 行 程 序 子 例 行 程 序 的 调 用 必 须 使 用 CALL 语 句, 或 者 是 作 为 一 个 赋 值 子 例 行 程 序 的 功 能 主 要 在 于 产 生 一 定 的 后 效, 例 如 改 写 一 些 变 元, 以 及 全 局 变 量, 或 者 执 行 某 些 输 入 输 出 函 数 与 子 例 行 程 序 的 一 般 规 则 如 下 : 函 数 与 子 例 行 程 序 在 调 用 方 式 上 的 差 别 实 际 上 来 源 于 一 个 函 数 总 是 和 一 个 相 应 的 函 数 结 果 值 相 关 联, 只 要 运 行 或 者 调 用 一 个 函 数, 总 会 得 到 相 应 的 函 数 结 果 值, 而 子 例 行 程 序 却 没 有 相 应 的 概 念, 这 就 使 得 子 例 行 程 序 只 能 依 靠 使 用 专 门 的 CALL 语 句 来 调 用, 而 既 然 函 数 总 是 能 够 给

214 出 一 个 函 数 值 来, 就 可 以 直 接 把 它 作 为 表 达 式 的 算 元 来 调 用 函 数 结 果 可 以 是 任 意 的 数 据 类 型, 例 如 派 生 类 型, 或 者 是 取 数 组 值 都 可 以 如 果 在 FUNCTION 语 句 当 中 使 用 RESULT 属 性, 那 么 就 可 以 给 结 果 一 个 与 函 数 定 义 里 面 的 函 数 名 称 不 同 的 名 称, 这 主 要 应 用 于 直 接 调 用 自 身 的 递 归 函 数 在 除 了 模 块 以 及 数 据 块 程 序 单 位 之 外 的 程 序 单 位 的 说 明 部 分 还 可 以 使 用 一 种 由 一 个 语 句 组 成 的 函 数, 称 为 语 句 函 数, 不 过 它 的 功 能 完 全 可 以 由 下 面 的 内 部 过 程 来 实 现, 因 此 已 经 过 时 再 从 过 程 与 其 他 程 序 单 位 的 关 系 的 角 度 来 分 类 的 话, 过 程 也 可 以 分 为 如 下 两 大 类 : 外 部 过 程 ; 顾 名 思 义, 外 部 过 程 就 是 处 于 任 何 的 程 序 单 位 的 外 部, 它 作 为 一 个 孤 立 的 过 程, 可 以 单 独 构 造, 单 独 编 译, 单 独 使 用, 而 可 以 完 全 独 立 于 任 何 的 过 程 与 程 序 单 位 甚 至 还 可 以 是 用 其 他 的 语 言 编 写 的, 例 如 常 见 的 C 语 言 当 然, 一 个 外 部 过 程 还 是 可 以 通 过 变 元 列 表, 模 块, 公 用 块 等 来 共 享 数 据 与 过 程 之 类 的 信 息 内 部 过 程 内 部 过 程 总 是 定 义 在 一 个 程 序 单 位 内 部, 该 程 序 单 位 就 称 为 它 的 宿 主 当 一 个 过 程 出 现 在 它 的 宿 主 内 部 的 时 候, 总 是 出 现 在 宿 主 的 CONTAINS 语 句 和 END 语 句 之 间 一 个 内 部 过 程 对 于 其 宿 主 而 言, 总 是 局 域 的, 而 且 通 过 宿 主 关 联 继 承 了 宿 主 的 数 据 环 境 特 别 的, 如 果 一 个 内 部 过 程 的 宿 主 是 一 个 模 块, 那 么 这 种 内 部 过 程 被 单 独 称 为 模 块 过 程 模 块 过 程 模 块 过 程 同 样 必 须 出 现 在 其 宿 主 模 块 里 面 的 CONTAINS 语 句 和 END 语 句 之 间 一 个 模 块 同 样 可 以 通 过 宿 主 关 联 继 承 宿 主 模 块 的 数 据 环 境 但 与 一 般 内 部 过 程 不 同 的 是, 模 块 内 的 模 块 过 程 可 以 具 有 PUBLIC 属 性, 即 从 模 块 外 部 可 以 直 接 访 问 具 有 PUBLIC 属 性 的 过 程 ; 当 然 模 块 过 程 也 可 以 具 有 PRIVATE 属 性, 使 得 模 块 外 部 不 能 访 问 该 过 程 注 意 在 早 期 FORTRAN 版 本 里 面 出 现 过 语 句 函 数 的 概 念, 它 是 出 现 在 程 序 单 位 的 说 明 部 分 的 单 语 句 定 义 的 函 数, 不 能 够 出 现 在 模 块 或 数 据 块 程 序 单 位 当 中 由 于 它 的 功 能 可 以 完 全 由 内 部 过 程 替 代, 因 此 语 句 函 数 的 概 念 已 经 过 时 一 般 由 多 个 过 程 组 成 过 程 子 程 序 对 于 内 部 过 程 来 说, 组 成 过 程 子 程 序 的 多 个 过 程 可 以 通 过 宿 主 关 联 而 获 得 对 宿 主 数 据 环 境 的 共 享 ; 而 对 于 外 部 过 程 来 说, 当 一 些 外 部 过 程 要 组 成 过 程 子 程 序 的 时 候, 由 于 缺 乏 类 似 的 关 联 机 制, 它 们 的 数 据 共 享 问 题 是 通 过 所 谓 过 程 登 录 机 制 来 解 决 的 所 谓 过 程 登 录 是 通 过 运 用 ENTRY 语 句 来 说 明 一 个 过 程 与 一 个 过 程 子 程 序 的 关 联 关 系 的 每 一 个 ENTRY 语 句 就 给 出 了 一 个 过 程, 所 有 这 些 过 程 就 可 以 共 享 该 过 程 子 程 序 的 数 据 环 境 例 如 两 个 不 同 的 函 数 SIN 和 COS 就 可 以 通 过 这 种 方 式 使 用 同 一 个 外 部 子 程 序, 因 为 SIN 和 COS 具 有 如 下 的 关 系 : π cos( x) = sin( x) 2 尽 管 对 于 内 部 过 程 来 说, 过 程 登 录 是 不 必 要 的, 但 也 可 以 应 用 于 模 块 过 程 根 据 过 程 对 于 变 元 的 作 用 效 果 来 分 类, 则 可 以 把 过 程 分 为 纯 过 程 与 非 纯 过 程 所 谓 纯 过 程 就 是 在 执 行 对 变 元 的 作 用 之 后, 不 会 产 生 后 效, 这 对 于 程 序 按 照 序 列 进 行 一 般 是 没 有 什 么 影 响 的, 但 是 对 于 程 序 的 并 行 执 行, 却 往 往 会 给 程 序 带 来 不 确 定 性, 因 此 就 需 要 对 一 般 的 过 程 加 以 约 束, 使 得 其 完 全 没 有 后 效, 从 而 得 到 纯 过 程 例 如 过 程 A 和 B, 都 具 有 对 X 进 行 赋 值 的 后 效, 设 A 把 X 赋 值 为 1.0, 而 B 把 X 赋 值 为 2.0, 那 么 如 果 A 和 B 这 两 个 过 程 是 并 行 完 成 的, 那 么 X 的 具 体 取 值 就 变 得 不 可 预 料, 因 此 需 要 对 过 程 A 和 B 进 行 一 定 的 约 束, 使 得 它 们 成 为 纯 过 程

215 如 果 从 过 程 作 用 于 数 据 对 象 的 方 式 来 进 行 分 类, 那 么 过 程 可 以 分 为 逐 元 过 程 和 变 换 过 程 逐 元 过 程, 即 过 程 的 本 来 属 于 标 量 形 式 的 变 元 可 以 被 赋 予 数 组, 这 时 过 程 的 作 用 方 式 是 对 数 组 的 每 个 元 素 进 行 单 独 的 运 算, 得 到 的 所 有 结 果 再 构 成 一 个 与 变 元 数 组 相 同 形 状 的 数 组, 就 称 为 该 过 程 作 用 于 数 组 后 的 结 果 变 换 过 程, 即 过 程 的 变 元 本 来 就 是 数 组, 对 数 组 的 作 用 方 式 是 把 数 组 作 为 一 个 整 体 进 行 变 换, 而 不 是 逐 个 地 针 对 元 素 进 行 因 此 逐 元 过 程 既 可 以 标 量 变 元 来 引 用, 也 可 以 通 过 数 组 变 元 来 引 用, 只 是 当 通 过 数 组 变 元 来 引 用 的 时 候, 实 际 上 就 是 通 过 标 量 数 组 元 素 来 引 用, 只 不 过 需 要 引 用 多 次 引 用 的 次 数 等 于 数 组 元 素 的 个 数 逐 元 过 程 总 是 纯 过 程, 因 为 逐 元 过 程 不 产 生 后 效 如 果 从 过 程 的 来 源 来 看, 过 程 还 可 以 分 为 固 有 过 程 和 自 定 义 过 程 两 类 所 谓 固 有 过 程, 也 称 为 内 建 过 程, 即 FORTRAN 标 准 已 经 建 立 好 了 的 过 程, 一 共 包 括 115 个 固 有 过 程 这 意 味 着 任 何 的 FORTRAN 实 现, 都 必 须 能 够 直 接 提 供 这 些 固 有 过 程 固 有 过 程 的 名 称 在 程 序 单 位 的 任 何 地 方 都 是 可 以 直 接 引 用 的, 唯 一 的 例 外, 就 是 当 使 用 了 显 式 的 EXTERNAL 语 句 或 过 程 界 面 块 的 时 候, 固 有 过 程 的 通 用 属 性 就 可 能 被 扩 充, 即 固 有 过 程 的 名 称 也 可 能 用 来 引 用 非 固 有 过 程, 这 时 该 名 称 所 表 示 的 固 有 过 程 反 而 成 了 一 种 默 认 值 大 部 分 的 固 有 过 程 同 时 还 是 逐 元 的, 自 定 义 过 程 也 可 以 被 定 义 为 逐 元 过 程, 这 样 就 极 大 地 增 强 了 FORTRAN 的 数 组 计 算 能 力 过 程 的 引 用 所 谓 过 程 的 引 用 就 是 使 得 过 程 的 名 称 出 现 在 程 序 的 恰 当 位 置, 当 程 序 运 行 到 该 位 置 时, 过 程 名 称 能 够 导 致 程 序 转 入 执 行 该 过 程 过 程 的 引 用 也 可 以 称 为 调 用 或 访 问, 在 本 书 当 中, 这 几 个 词 汇 是 根 据 一 般 用 词 习 惯 而 交 替 使 用 的 过 程 的 引 用 分 为 两 种 形 式, 即 子 例 行 程 序 的 引 用 和 函 数 的 引 用 子 例 行 程 序 的 引 用 是 依 靠 一 个 单 独 的 CALL 语 句, 某 些 时 候 也 可 以 使 用 赋 值 语 句 的 形 式 函 数 的 引 用 是 作 为 表 达 式 的 一 部 分, 即 采 用 函 数 名 称 及 其 变 元 列 表 作 为 表 达 式 的 项 出 现, 某 些 时 候, 函 数 引 用 也 可 以 采 取 一 元 运 算 或 二 元 运 算 的 形 式, 其 变 元 作 为 表 达 式 的 算 元 过 程 的 引 用 本 质 上 就 是 通 过 变 元 来 进 行 数 据 的 传 递 或 通 讯, 在 进 行 过 程 的 引 用 过 程 当 中, 变 元 根 据 它 所 行 使 的 功 能, 还 可 以 分 为 三 种 : 实 元, 哑 元, 替 代 返 回 变 元 实 元 在 过 程 的 引 用 当 中, 所 谓 实 元 就 是 在 程 序 执 行 的 时 候 需 要 实 际 采 用 的 数 据 对 象 例 如 实 元 在 作 为 变 量 的 时 候, 可 以 在 每 次 引 用 当 中 取 不 同 的 值, 因 为 作 为 实 元, 是 直 接 面 向 具 体 取 值 的 实 元 的 取 值 可 以 是 输 入 值, 也 可 以 是 过 程 运 行 之 后 返 回 的 值, 或 者 两 者 都 是 哑 元 所 谓 哑 元 就 是 一 个 名 称, 通 过 该 名 称 过 程 内 部 就 能 够 访 问 到 相 应 实 元 因 此 哑 元 在 过 程 被 定 义 的 时 候 就 已 经 给 出, 在 过 程 进 行 计 算 时, 它 就 充 当 变 元 名 称 一 旦 在 程 序 运 行 时 引 用 该 过 程, 那 么 引 用 的 实 元 就 通 过 变 元 关 联 而 与 相 应 哑 元 建 立 关 联 关 系 如 果 过 程 界 面 是 显 式 的, 那 么 在 引 用 过 程 时, 就 可 以 直 接 使 用 哑 元 名 称 作 为 实 元 关 键 词 过 程 定 义 里 面 的 哑 元 名 称 还 可 以 用 来 指 称 一 个 过 程, 这 实 际 上 就 是 一 个 过 程 引 用 因 为 与 该 哑 元 具 有 变 元 关 联 关 系 的 实 元 名 称 就 是 一 个 过 程 的 名 称, 不 过 这 个 被 关 联 的 过 程 不 能 是 内 部 过

216 程, 语 句 函 数, 已 经 具 有 类 属 性 的 过 程 替 代 返 回 变 元 所 谓 替 代 返 回 是 只 在 子 例 行 程 序 里 面 出 现 的 一 种 变 元 的 功 能, 通 过 替 代 返 回, 就 可 以 中 断 程 序 的 顺 序 执 行 次 序, 控 制 程 序 的 执 行 分 支 到 其 他 某 个 位 置, 替 代 返 回 里 面 的 实 元 就 是 分 支 目 标 语 句 的 标 签, 这 种 分 支 方 式 经 常 用 于 从 子 例 行 程 序 里 面 出 错 退 出 的 情 形, 不 过 在 现 代 的 FORTRAN 控 制 结 构 里 面, 具 有 更 合 理 的 控 制 方 式, 因 此 这 种 分 支 方 式 已 经 过 时 过 程 通 过 变 元 进 行 通 讯 的 途 径 就 是 关 联, 过 程 关 联 的 形 式 有 4 种 : 变 元 关 联, 宿 主 关 联, 使 用 关 联, 以 及 共 享 存 储 关 联 变 元 关 联 变 元 关 联 是 过 程 之 间 进 行 数 据 通 讯 的 主 要 方 式 在 13.7 节 会 详 细 地 加 以 讨 论 宿 主 关 联 宿 主 关 联 是 建 立 在 一 个 过 程 与 其 所 属 的 程 序 单 位 之 间 的 数 据 关 联 关 系 一 个 宿 主 程 序 单 位 可 以 是 一 个 主 程 序, 模 块 程 序 单 位, 外 部 过 程, 模 块 过 程 这 些 宿 主 程 序 单 位 里 面 所 有 被 允 许 访 问 的 数 据 对 象 都 可 以 通 过 宿 主 关 联 而 被 其 包 含 的 过 程 访 问 到 对 于 宿 主 关 联 的 详 细 讨 论 见 第 15 章 使 用 关 联 一 个 过 程 可 以 通 过 一 个 USE 语 句 和 该 USE 语 句 所 在 的 程 序 单 位 建 立 使 用 关 联 通 过 使 用 管 关 联, 过 程 可 以 和 模 块 共 享 数 据 对 象, 也 可 以 按 照 程 序 编 写 者 的 意 愿, 通 过 ONLY 子 句 来 隐 藏 某 些 数 据 对 象 对 于 使 用 关 联 的 详 细 讨 论 见 第 12 章 共 享 存 储 关 联 有 关 存 储 关 联 的 详 细 讨 论 见 第 7 章 和 第 15 章 在 组 织 程 序 时, 除 了 在 不 同 过 程 之 间 进 行 通 讯 之 外, 过 程 自 身 还 可 以 构 成 递 归 的 结 构 即 一 个 局 部 变 量 得 到 初 始 化 之 后, 尽 管 它 出 现 在 递 归 的 每 一 层 里 面, 但 是 其 初 始 化 值 只 能 够 在 该 递 归 结 构 开 始 运 行 时 有 效 地 使 用 一 次, 因 此 实 际 上 等 价 于 对 于 变 量 使 用 了 SAVE 属 性, 使 得 每 一 层 的 递 归 都 保 留 了 它 的 变 量 值, 可 以 说 是 一 种 数 据 的 隐 式 保 留 属 性 一 个 过 程 无 论 是 进 行 直 接 的 递 归 还 是 进 行 间 接 的 递 归, 都 必 须 在 过 程 定 义 里 面 的 FUNCTION 语 句 或 SUBROUTINE 语 句 里 面 加 上 关 键 词 RECURSIVE, 这 个 关 键 词 的 功 能 就 是 能 够 实 现 编 译 器 对 于 过 程 调 用 的 优 化 过 程 的 引 用 并 不 涉 及 过 程 的 具 体 功 能, 也 就 是 对 于 过 程 的 内 部 计 算 过 程, 在 引 用 时 是 不 需 要 考 虑 的, 这 样 就 可 以 把 所 有 涉 及 到 过 程 引 用 的 信 息 集 中 在 一 起, 包 括 过 程 及 其 变 元 的 名 称 与 属 性, 这 就 构 成 了 所 谓 过 程 的 界 面 顾 名 思 义, 也 就 是 一 个 过 程 与 外 部 进 行 通 讯 的 层 面 如 果 一 个 过 程 的 这 些 信 息 对 于 一 个 引 用 它 的 程 序 单 位 来 说, 不 是 显 式 的, 那 么 该 过 程 就 被 称 为 具 有 隐 式 界 面 这 时, 引 用 它 的 程 序 单 位 就 只 能 依 据 过 程 名 称 以 及 过 程 引 用 里 面 的 实 元 的 属 性 来 确 定 过 程 的 有 关 信 息, 同 时 有 关 的 哑 元 与 实 元 的 数 据 匹 配 都 需 要 程 序 编 写 者 预 先 规 划 好 如 果 过 程 界 面 是 显 式, 那 么 相 关 的 数 据 匹 配 工 作 就 可 以 完 全 由 编 译 系 统 来 完 成 检 查 在 很 多 的 引 用 情 形 下, 都 一 定 要 求 被 引 用 的 过 程 具 有 显 式 界 面, 例 如 : 作 为 数 组 片 断 的 实 元 ; 指 针 变 元 ; 可 选 变 元 ; 关 键 词 调 用 ; 自 定 义 运 算 ;

217 自 定 义 赋 值 ; 自 定 义 过 程 的 逐 元 调 用 ; 自 定 义 类 过 程 各 种 类 型 的 过 程 的 界 面 形 式 的 显 式 或 隐 式 的 情 况 如 下 : 固 有 函 数, 内 部 过 程, 模 块 过 程 都 是 显 式 的 界 面, 自 定 义 过 程 也 可 以 具 有 显 式 界 面 所 有 固 有 函 数 的 显 式 界 面 信 息 都 包 含 在 任 何 一 个 FORTRAN 编 译 器 内 部, 在 对 固 有 函 数 进 行 任 何 引 用 时, 系 统 都 可 以 根 据 实 元 的 类 型 来 检 查 与 匹 配 相 应 的 固 有 函 数, 从 而 得 到 一 个 正 确 的 引 用 因 此 对 固 有 函 数 的 引 用 可 以 直 接 使 用 函 数 的 类 名 称 以 及 关 键 词 内 部 过 程 和 模 块 过 程 在 它 的 定 义 里 面 就 要 求 具 有 显 式 界 面, 因 此 对 这 两 种 过 程 的 引 用 同 样 是 安 全 可 靠 的 外 部 过 程 和 语 句 函 数 都 是 隐 式 的 界 面 不 过 在 引 用 外 部 过 程 时, 可 以 在 引 用 程 序 单 位 里 面 为 所 引 用 的 外 部 过 程 提 供 一 个 界 面 块, 这 样 就 等 价 于 该 外 部 过 程 具 有 了 一 个 显 式 的 界 面 有 关 界 面 的 详 细 讨 论 见 13.8 节 正 是 由 于 引 用 只 与 过 程 的 界 面 有 关, 因 此 被 引 用 的 过 程 可 以 是 使 用 其 他 语 句 编 写 的, 例 如 C, C++ 等, 不 过 使 用 非 FORTRAN 的 过 程 可 能 移 植 性 不 太 好, 因 为 在 不 同 的 系 统 之 间, 其 他 的 语 言 可 能 具 有 不 同 的 过 程 通 讯 机 制 13.2 子 例 行 程 序 的 运 用 一 个 子 例 行 程 序 就 是 一 个 完 备 的 能 够 执 行 一 定 的 计 算 任 务 的 程 序 单 位 它 由 以 下 五 个 部 分 构 成 : 初 始 的 SUBROUTINE 语 句 ; 说 明 部 分 ; 计 算 执 行 部 分 ; 某 些 内 部 过 程 ; END 语 句 当 一 个 子 例 行 程 序 被 调 用 时, 从 它 的 第 一 个 可 执 行 结 构 开 始 运 行, 它 通 过 变 元 关 联, 使 用 关 联, 宿 主 关 联 以 及 存 储 关 联 与 外 部 进 行 数 据 通 讯 下 面 分 别 讨 论 子 例 行 程 序 的 定 义 与 引 用 子 例 行 程 序 的 定 义 一 个 子 例 行 程 序, 无 论 是 内 部 的, 外 部 的, 还 是 模 块 的, 都 具 有 以 下 语 法 形 式 (R1221): [subroutine-prefix] SUBROUTINE subroutine-name & [([dummy-argument-list])] [specification-part] [execution-part] [internal-subprogram-part] END [ SUBROUTINE [subroutine-name]] 其 中 所 谓 子 例 行 程 序 的 前 缀 (subroutine-prefix) 是 如 下 的 几 个 可 选 项 :

218 RECURSIVE PURE ELEMENTAL 不 过 其 中 表 示 递 归 属 性 和 逐 元 属 性 的 RECURSIVE 与 ELEMENTAL 不 能 同 时 作 为 同 一 个 子 例 行 程 序 的 前 缀 其 中 哑 元 列 表 (dummy-argument-list) 里 面 的 哑 元 既 可 以 是 哑 元 名 称, 也 可 以 是 星 号 (*) 星 号 表 示 替 代 返 回 变 元 当 子 例 行 程 序 被 执 行 的 时 候, 这 些 哑 元 就 获 得 了 同 引 用 子 例 行 程 序 时 给 出 的 实 元 的 关 联 子 例 行 程 序 的 一 般 规 则 如 下 : 如 果 在 END 语 句 里 面 使 用 了 子 例 行 程 序 的 名 称, 那 么 这 个 名 称 就 必 须 和 SUBROUTINE 语 句 里 面 的 名 称 一 致 一 个 内 部 子 例 行 程 序 不 能 再 包 含 一 个 内 部 子 程 序 部 分 内 部 子 例 行 程 序 不 能 包 含 ENTRY 语 句 内 部 子 例 行 程 序 与 模 块 子 例 行 程 序 的 END 语 句 必 须 是 如 下 的 形 式 : END SUBROUTINE [subroutine-name] 即 必 须 在 END 语 句 里 面 使 用 关 键 词 SUBROUTINE 如 果 子 例 行 程 序 要 实 现 递 归 结 构, 那 么 在 SUBROUTINE 语 句 里 面 必 须 加 上 前 缀 RECURSIVE 在 一 个 SUBROUTINE 语 句 里 面, 不 能 重 复 使 用 某 个 前 缀 一 个 子 例 行 程 序 不 能 同 时 是 递 归 的 和 逐 元 的 参 见 13.4 节 与 13.5 节 每 个 哑 元 都 是 其 所 在 是 子 例 行 程 序 的 局 部 变 元 哑 元 可 以 在 子 例 行 程 序 里 面 获 得 显 式 说 明, 也 可 以 在 某 些 特 定 情 况 下 获 得 隐 式 声 明 子 例 行 程 序 里 面 的 哑 元 都 可 以 具 有 INTENT 属 性 或 OPTIONAL 属 性, 但 是 哑 指 针 和 哑 过 程 都 不 能 具 有 INTENT 属 性 在 子 例 行 程 序 里 面 不 能 使 用 PUBLIC 属 性 和 PRIVATE 属 性 用 于 表 示 替 代 返 回 变 元 的 星 号 * 是 一 种 过 时 的 语 言 特 征 例 13-1 下 面 是 SUBROUTINE 语 句 的 几 种 形 式 的 例 子 : ELEMENTAL SUBROUTINE BESSELL1 SUBROUTINE IMBEDDING(X) SUBROUTINE TASK() SUBROUTINE PARTICAL(CURRENT,*) SUBROUTINE COMPUT2 RECURSIVE SUBROUTINE WALLIS(X,Y) 例 13-2 下 面 是 一 个 子 例 行 程 序 的 例 子 : SUBROUTINE WAVELET(A,B) REAL A INTEGER B. END SUBROUTINE WAVELET

219 子 例 行 程 序 的 引 用 当 程 序 的 某 个 位 置 需 要 调 用 一 个 子 例 行 程 序 时, 就 在 该 位 置 使 用 CALL 语 句 或 者 是 一 个 自 定 义 赋 值 语 句 实 际 上 对 子 例 行 程 序 的 调 用, 就 是 给 出 子 例 行 程 序 的 名 称 和 实 元 下 面 首 先 讨 论 使 用 CALL 语 句 的 引 用 方 式 CALL 语 句 的 语 法 形 式 (R1211) 为 : CALL subroutine-name [([subroutine-actual-argument-list])] 其 中 的 子 例 行 程 序 的 实 元 的 语 法 形 式 (R1212) 为 : [keyword=] subroutine-actual-argument 其 中 的 的 关 键 词 是 子 例 行 程 序 的 界 面 里 面 的 某 个 哑 元 名 称, 而 子 例 行 程 序 的 实 元 则 具 有 以 下 几 种 形 式 (R1214) 之 一 : 包 含 一 个 变 量 的 表 达 式 ; 过 程 名 称 ; 作 为 替 代 返 回 的 * 标 签 以 上 子 例 行 程 序 的 引 用 实 际 上 就 是 建 立 一 个 哑 元 与 实 元 的 关 联 即 或 者 是 通 过 直 接 使 用 哑 元 名 称 作 为 关 键 词, 给 出 相 应 的 实 元, 或 者 是 省 略 了 关 键 词, 但 是 实 元 在 实 元 列 表 里 面 的 顺 序 对 应 着 相 应 的 子 例 行 程 序 界 面 里 面 的 哑 元 列 表 的 顺 序, 从 而 为 每 个 子 例 行 程 序 的 哑 元 指 定 了 相 应 的 实 元 作 为 实 元 的 表 达 式 的 一 个 特 殊 情 况 就 是 只 有 一 个 变 量 自 身, 这 时 该 变 量 作 为 实 元 可 以 与 具 有 任 意 INTENT(IN,OUT,INOUT) 属 性 的 哑 元 相 关 联, 但 一 个 表 达 式 就 只 能 和 具 有 INTENT(IN) 属 性 的 哑 元 相 关 联 CALL 语 句 的 引 用 的 一 般 规 则 如 下 : 根 据 变 元 列 表 位 置 来 进 行 实 元 与 哑 元 的 关 联 的 变 元, 必 须 放 置 在 实 元 列 表 的 前 面 部 分, 而 一 旦 在 该 列 表 当 中 出 现 了 关 键 词, 那 么 该 关 键 词 后 面 的 变 元 就 必 须 全 部 是 关 键 词 在 实 元 列 表 与 哑 元 列 表 的 对 应 当 中, 一 个 实 元 和 与 之 对 应 的 非 可 选 哑 元 相 关 联, 而 对 于 可 选 哑 元, 相 应 的 实 元 可 省 略 关 键 词 就 是 子 例 行 程 序 的 显 式 界 面 里 面 的 哑 元 名 称, 如 果 在 引 用 里 面 使 用 关 键 词, 那 么 实 元 就 与 具 有 该 名 称 的 哑 元 相 关 联 如 果 在 一 个 实 元 列 表 当 中, 与 某 个 实 元 相 关 联 的 关 键 词 被 省 略 了, 那 么 在 这 个 列 里 面 该 实 元 前 面 的 所 有 关 键 词 都 必 须 省 略 ; 一 个 没 有 关 键 词 出 现 的 实 元 列 表 里 面 的 所 有 实 元, 都 是 依 据 列 表 位 置 来 确 定 它 们 相 应 的 哑 元 的 如 果 一 个 实 元 列 表 使 用 了 多 个 关 键 词, 那 么 关 键 词 的 顺 序 是 无 关 紧 要 的, 如 果 一 个 实 元 列 表 里 面 全 是 关 键 词, 那 么 它 们 的 顺 序 可 以 是 任 意, 不 需 要 与 哑 元 列 表 里 面 的 顺 序 有 对 应 关 系 作 为 替 代 返 回 说 明 符 的 星 号 后 面 的 标 签, 必 须 是 与 CALL 语 句 同 一 个 作 用 域 单 位 的 分 支 目 标 语 句 的 标 签 实 元 不 能 是 内 部 过 程 或 语 句 函 数 的 名 称 与 一 个 哑 过 程 相 关 联 的 实 元 必 须 是 一 个 种 过 程 的 名 称, 如 果 一 个 过 程 的 类 名 称 与 种 过 程 相 同, 那 么 实 际 引 用 的 是 种 过 程 对 于 某 些 固 有 函 数 来 说, 它 们 的 种 固 有 函 数 名 称 不 能 用 来 作 为 实 元 过 程 引 用 的 另 外 一 种 形 式 就 是 使 用 自 定 义 赋 值 语 句 可 以 通 过 自 定 义 赋 值 形 式 得 到 引 用 的 子

220 例 行 程 序 必 须 具 有 一 个 ASSIGNMENT 界 面, 在 这 个 界 面 里 面 必 须 给 出 两 个 变 元 arg1 和 arg2, 其 中 arg1 具 有 INTENT(OUT) 或 INTENT(INOUT) 属 性, 而 arg2 则 具 有 INTENT(IN) 属 性 自 定 义 赋 值 引 用 的 形 式 为 : arg1 = arg2 对 于 这 种 引 用 形 式 的 详 细 讨 论 见 节 例 13-3 下 面 是 一 个 通 过 CALL 语 句 引 用 子 例 行 程 序 的 例 子 CALL SUB1( X,*25)! 引 用 SUBROUTINE SUB1 25! 替 代 返 回 的 目 标 语 句 CALL SUB2(X=5.02,N=75)! 引 用 SUBROUTINE SUB2(X,N) 例 13-4 下 面 是 一 个 通 过 自 定 义 赋 值 形 式 引 用 子 例 行 程 序 的 例 子 MODULE POLAR_COORDINATES TYPE POLAR REAL ::RHO THETA END TYPE INTERFACE ASSIGNMENT(=) MODULE PROCEDURE ASSIGN_POLAR_TO_COMPLEX END INTERFACE SUBROUTINE ASSIGN_POLAR_TO_COMPLEX (Z, P) COMPLEX INTENT ( OUT ) :: Z TYPE (POLAR) INTENT (IN) :: P Z= CMPLX (P%RHO * COS (P%THETA), & P%RHO * SIN (P%THETA)) END SUBROUTINE ASSIGN_POLAR_TO_COMPLEX USE POLAR_COORDINATES COMPLEX ::CARTESIAN CARTESIAN = POLAR(R,PI/6) 在 上 面 最 后 语 句 里 面, 使 用 了 一 个 赋 值 语 句, 实 际 上 就 等 价 于 下 面 的 CALL 语 句 : CALL ASSIGN_POLAR_TO_COMPLEX(CARTESIAN,POLAR(R,PI/6)) 13.3 函 数 函 数 与 子 例 行 程 序 的 最 大 区 别 就 是 函 数 可 以 用 来 作 为 表 达 式 的 项, 而 函 数 的 定 义 的 语 法 结

221 构 则 与 子 例 行 程 序 类 似 函 数 的 变 元 用 来 引 入 初 始 值, 然 后 经 过 函 数 的 计 算, 得 到 函 数 结 果, 作 为 表 达 式 相 应 的 项 的 输 入 值 函 数 同 样 可 以 通 过 4 种 关 联 形 式 从 函 数 外 部 获 得 数 据 函 数 的 定 义 一 个 函 数 子 程 序, 不 管 它 是 外 部 子 程 序, 内 部 子 程 序 还 是 模 块 子 程 序, 都 具 有 如 下 的 语 法 形 式 : [function-prefix] simplest-function-statement [RESULT (result-name) ] [specification-part] [execution-part] [internal-subprogram-part] END [FUNCTION [function-name]] 其 中 的 函 数 前 缀 (function-prefix) 包 括 如 下 几 种 形 式 : type-specification RECURSIVE PURE ELEMENTAL 其 中 RECURSIVE 和 ELEMENTAL 不 能 同 时 用 于 一 个 函 数 其 中 的 最 简 单 FUNCTION 语 句 (simplest-function-statement) 的 语 法 形 式 为 : FUNCTION function-name ([dummy-argument-name-list]) 其 中 的 哑 元 在 函 数 运 行 时 获 得 引 用 实 元 的 变 量 关 联 因 此 函 数 语 句 可 以 有 几 种 不 同 的 形 式, 下 面 是 一 些 例 子 例 13-5 FUNCTION LAGRANGE1 (X,Y) COMPLEX FUNCTION SHORDINGER2(X,T) FUNCTION LATTICE(X,Y) RESULT(CROSS) RECURSIVE REAL FUNCTION SUM1(N,K)RESULT(SUM2) 函 数 遵 循 如 下 规 则 : 函 数 的 类 型 既 可 以 在 函 数 语 句 当 中 予 以 说 明, 也 可 以 使 用 单 独 的 类 型 声 明 语 句 当 中 予 以 说 明, 但 是 不 能 同 时 采 用 这 两 种 说 明 方 式 如 果 这 两 种 说 明 方 式 都 没 有 出 现, 那 么 系 统 会 认 为 是 默 认 类 型 如 果 函 数 值 是 数 组 或 指 针, 那 么 函 数 声 明 必 须 给 出 其 函 数 结 果 名 称 的 相 应 属 性 函 数 结 果 名 称 可 以 是 显 形 数 组 或 哑 形 数 组 如 果 为 显 形 数 组, 那 么 它 的 非 常 数 界 可 以 是 表 达 式 形 式 哑 元 的 属 性 既 可 以 在 函 数 体 当 中 显 式 说 明, 也 可 以 隐 式 说 明 哑 元 总 是 相 应 函 数 的 局 部 变 量, 因 此 哑 元 名 称 在 函 数 内 部 必 须 是 唯 一 的 如 果 在 END 语 句 当 中 出 现 了 函 数 名 称, 那 么 该 名 称 必 须 和 FUNCTION 语 句 当 中 的 函 数 名 称 一 样 一 个 内 部 函 数 不 能 再 包 含 一 个 内 部 子 程 序

222 一 个 内 部 函 数 不 能 包 含 ENTRY 语 句 在 一 个 函 数 语 句 当 中, 函 数 前 缀 不 能 重 复 出 现 一 个 函 数 不 能 同 时 具 有 前 缀 ELEMENTAL 和 RECURSIVE 参 见 13.4 和 13.5 节 内 部 函 数 和 模 块 函 数 的 END 语 句 必 须 是 如 下 形 式 : END FUNCTION [function-name] 即 在 END 语 句 当 中 必 须 包 含 关 键 词 FUNCTION 如 果 函 数 语 句 当 中 不 出 现 结 果 子 句, 那 么 函 数 名 称 就 用 作 结 果 变 量 的 名 称, 则 对 函 数 名 称 的 引 用 实 质 上 就 是 对 函 数 结 果 变 量 的 引 用 如 果 函 数 语 句 当 中 出 现 结 果 子 句, 那 么 函 数 名 称 就 不 能 用 作 结 果 变 量 的 名 称, 则 对 函 数 名 称 的 引 用 就 是 函 数 引 用, 属 于 递 归 调 用 如 果 函 数 语 句 当 中 出 现 结 果 子 句, 那 么 函 数 名 称 就 不 能 出 现 在 任 何 说 明 语 句 当 中 如 果 函 数 的 结 果 值 不 是 一 个 指 针, 那 么 在 函 数 执 行 完 毕 之 前, 它 的 结 果 值 就 必 须 完 全 给 定 定 义 : 如 果 结 果 值 是 数 组, 那 么 数 组 的 所 有 元 素 都 必 须 给 出 定 义 ; 如 果 结 果 值 是 结 构, 那 么 结 构 的 所 有 成 员 都 必 须 给 出 定 义 如 果 函 数 结 果 值 是 一 个 数 组 或 指 向 数 组 的 指 针, 那 么 在 函 数 执 行 完 毕 之 前, 它 的 结 果 值 的 形 状 必 须 给 定 如 果 函 数 结 果 是 一 个 指 针, 那 么 在 函 数 执 行 完 毕 之 前, 指 针 的 分 配 状 态 必 须 给 定, 即 或 者 是 给 出 其 所 关 联 的 目 标, 或 者 是 显 式 说 明 它 的 去 关 联 状 态 函 数 的 哑 元 的 INTENT 属 性 和 OPTIONAL 属 性 必 须 予 以 说 明 不 过 对 于 哑 指 针 和 哑 过 程, 则 不 具 备 INTENT 属 性 在 函 数 里 面 不 能 使 用 PUBLIC 属 性 和 PRIVATE 属 性 当 函 数 采 取 直 接 递 归 形 式 的 时 候, 必 须 同 时 给 出 RECURSIVE 关 键 词 和 RESULT 选 项, 这 是 唯 一 的 必 须 给 出 RESULT 选 项 的 情 形 RESULT 选 项 RESULT 子 句 的 功 能 在 于 给 出 一 个 不 同 于 函 数 名 称 的 名 称, 用 来 赋 予 函 数 结 果 值 如 果 不 通 过 RESULT 子 句 来 给 定 单 独 的 函 数 结 果 的 名 称, 那 么 结 果 值 总 是 赋 予 函 数 名 称, 这 样 做 在 函 数 是 非 递 归 的 时 候, 不 会 带 来 什 么 不 良 后 果, 但 是 当 函 数 为 递 归 形 式 的 时 候, 就 会 导 致 歧 义, 因 为 在 递 归 引 用 时, 对 函 数 的 引 用 必 须 和 对 函 数 结 果 值 的 引 用 加 以 区 分 例 如 一 个 函 数 的 唯 一 变 量 是 实 型 的 标 量, 而 它 的 结 果 值 是 一 个 数 组, 那 么 在 对 它 进 行 递 归 引 用 时, 如 果 不 对 它 的 结 果 另 外 规 定 名 称, 就 会 和 对 数 组 结 果 的 引 用 混 淆 起 来, 在 这 种 情 况 下, 就 必 须 使 用 RESULT 子 句 对 结 果 变 量 进 行 单 独 的 命 名 因 此 当 一 个 函 数 是 直 接 或 间 接 递 归 的 时 候, 都 必 须 使 用 RESULT 子 句 由 于 函 数 的 结 果 值 在 递 归 过 程 当 中 一 直 在 发 生 变 化, 因 此 函 数 的 结 果 值 为 最 后 一 个 赋 予 结 果 名 称 的 值 下 面 是 一 个 给 出 了 RESULT 子 句 的 递 归 函 数 的 例 子 例 13-6 PROGRAM REVERSE_PHRASE PRINT *,REVERSE( The following inequalities hold for any lattice ) CONTAINS RECURSIVE FUNCTION REVERSE (PHRASE)RESULT(LATTICE)

223 CHARACTER(*) PHRASE CHARACTER(LEN(PHRASE)) LATTICE L=LEN_TRIM(PHRASE) K=INDEX(PHRASE(1:L),,BACK=.TRUE.) IF(K==0)THEN;LATTICE=PHRASE ELSE;LATTICE=PHRASE(K+1;L)// // REVERSE(PHRASE(1:K-1)) END IF END FUNCTION REVERSE END PROGRAM REVERSE_PHRASE 在 上 面 的 例 子 里 面, 函 数 结 果 的 长 度 是 动 态 的, 因 此 其 函 数 界 面 是 显 式 的 函 数 引 用 函 数 的 引 用 有 两 种 形 式 : 直 接 在 表 达 式 里 面 使 用 函 数 的 名 称 ; 通 过 自 定 义 运 算 的 形 式 第 一 种 函 数 的 引 用 是 非 常 直 接 的, 就 是 把 函 数 名 称 以 及 它 的 实 元 用 作 表 达 式 的 项 而 一 旦 函 数 通 过 这 种 方 式 得 到 引 用, 那 么 引 用 该 函 数 的 表 达 式 的 计 算, 就 意 味 着 函 数 里 面 的 实 元 已 经 得 到 计 算, 相 应 的 变 量 关 联 已 经 建 立, 而 该 函 数 的 定 义 里 面 的 所 有 语 句 都 已 经 得 到 执 行, 因 此 函 数 对 于 引 用 它 的 表 达 式 来 说, 就 是 函 数 结 果 变 量 函 数 引 用 的 一 般 语 法 形 式 (R1210) 为 : function-name([function-actual-argument-list]) 其 中 函 数 实 元 (function-actual-argument) 的 一 般 语 法 形 式 (R1212) 为 : [keyword = ] function-argument 其 中 的 函 数 变 元 (function-argument) 具 有 一 下 几 种 形 式 (R1214) 之 一 : 包 含 一 个 变 量 的 表 达 式 过 程 名 称 而 其 中 的 关 键 词 (keyword) 是 函 数 界 面 里 面 的 一 个 哑 元 名 称 函 数 引 用 里 面 的 实 元 与 函 数 界 面 里 面 的 哑 元 的 对 应 规 则 与 子 例 行 程 序 一 样, 或 者 是 根 据 哑 元 列 表 里 面 的 顺 序 与 实 元 相 应 顺 序 的 对 应, 或 者 是 利 用 关 键 词 来 指 定 对 于 引 用 函 数 的 表 达 式 来 说, 一 个 变 量 也 是 一 种 表 达 式 的 形 式, 如 果 只 是 一 个 变 量, 那 么 它 所 关 联 的 哑 元 可 以 具 有 任 意 的 INTENT(IN,OUT,INOUT) 属 性, 而 对 于 其 他 形 式 的 表 达 式, 则 其 中 的 实 元 只 能 关 联 于 具 有 INTENT(IN) 属 性 的 哑 元 注 意 表 达 式 (X) 总 是 一 个 表 达 式, 尽 管 括 号 里 面 的 X 只 是 一 个 变 量, 因 此 X 作 为 实 元, 只 能 关 联 于 一 个 具 有 INTENT(IN) 属 性 的 哑 元 这 种 形 式 的 函 数 引 用 与 子 例 行 程 序 引 用 的 唯 一 差 别, 就 是 函 数 引 用 里 面 的 变 元 列 表 里 面 不 能 包 含 替 代 返 回, 其 他 的 规 则 完 全 与 节 里 面 有 关 子 例 行 程 序 引 用 的 规 则 一 样 下 面 是 在 表 达 式 里 面 直 接 引 用 函 数 的 例 子 例 13-7 X=Y+5*LEBESGUE1(3.5)! 引 用 了 函 数 LEBESGUE1(R)

224 PRINT*,ANALOG1(5.0,6.7)! 引 用 了 函 数 ANALOG1(I,U) 函 数 引 用 的 第 二 种 形 式 就 是 通 过 自 定 义 运 算 的 形 式 除 了 固 有 运 算 之 外, 我 们 总 会 需 要 定 义 不 能 由 任 何 固 有 运 算 表 示 的 运 算, 这 时 就 可 以 使 用 函 数 来 定 义 自 定 义 运 算 以 及 给 出 运 算 符 的 界 面 块, 具 体 是 说 明 参 见 节 利 用 自 定 义 运 算 来 引 用 函 数 的 规 则 如 下 一 元 运 算 只 能 使 用 包 含 一 个 变 元 的 函 数 来 定 义 而 二 元 运 算 则 使 用 包 含 2 个 变 元 的 函 数 定 义 函 数 的 变 元 不 能 是 可 选 的, 并 且 必 须 具 有 INTENT(IN) 属 性 自 定 义 算 符 只 能 采 取 在 两 个 句 点 中 间 为 字 符 串 的 形 式, 其 中 的 字 符 串 不 能 多 于 31 个 字 符, 而 且 不 能 包 含 下 划 线, 也 不 能 与 逻 辑 型 字 面 常 量 雷 同 如 果 自 定 义 运 算 的 算 符 与 固 有 运 算 的 算 符 发 生 雷 同 的 现 象, 那 么 自 定 义 运 算 肯 定 是 对 相 应 的 固 有 运 算 进 行 了 某 些 扩 充, 例 如 对 于 算 符 所 适 用 的 算 元 的 取 值 范 围 进 行 了 扩 充 下 面 是 一 个 通 过 自 定 义 运 算 来 引 用 函 数 的 例 子 例 13-8 INTERFACE OPERATOR(.FOURIER.) FUNCTION FOURIER_OPERATOR(X,Y)! 这 些 界 面 部 分 给 出 函 数 FOURIER_OPERATOR 以 及! 它 的 变 元 X,Y 的 属 性, 并 且 需 要 说 明 X 和 Y 具 有!INTENT(IN) 属 性 END FUNCTION FOURIER_OPERATOR END INTERFACE PRINT*,X1.FOURIER. Y1 在 上 面 的 例 子 里 面,PRINT 语 句 里 面 通 过 使 用 自 定 义 运 算.FOURIER. 而 引 用 了 函 数 FOU RIER_OPERATOR, 而 实 元 X1 和 Y1 则 分 别 对 应 着 函 数 界 面 里 面 的 哑 元 X 和 Y 语 句 函 数 所 谓 语 句 函 数 语 句, 就 是 只 包 含 一 条 FORTRAN 语 句 的 函 数 定 义, 它 的 一 般 语 法 形 式 (R1228) 为 : function-name([dummy-argument-name-list])= scalar-expression 实 际 上 语 句 函 数 的 功 能 完 全 可 以 用 内 部 函 数 来 实 现, 而 通 过 内 部 函 数 形 式 来 表 示 同 样 的 功 能, 可 以 使 得 程 序 更 加 具 有 结 构 性, 因 此 语 句 函 数 已 经 过 时 与 上 面 的 语 句 函 数 等 价 的 内 部 函 数 采 用 如 下 的 形 式 : FUNCTION function-name([dummy-argument-name-list]) function-name = scalar-expression END FUNCTION 可 以 看 到, 上 面 采 用 内 部 函 数 的 形 式 更 加 具 有 结 构 性 语 句 函 数 的 一 般 规 则 如 下 通 过 语 句 函 数 给 出 的 函 数 以 及 哑 元 都 必 须 是 标 量

225 语 句 函 数 里 面 的 表 达 式 只 能 包 含 固 有 运 算, 并 且 都 只 能 取 标 量 值 表 达 式 可 以 引 用 具 有 数 组 变 元 但 是 取 值 为 标 量 的 固 有 函 数 例 如 固 有 函 数 SUM(A+B) 就 是 这 样 的 固 有 函 数, 因 为 它 的 变 元 都 是 数 组, 而 函 数 结 果 值 则 是 一 个 标 量 语 句 函 数 作 为 一 种 函 数 的 定 义 形 式, 只 能 出 现 在 一 个 程 序 单 位, 或 内 部 过 程 或 模 块 过 程 的 说 明 部 分 在 表 达 式 里 面 引 用 的 语 句 函 数 都 必 须 在 相 应 的 程 序 单 位 的 说 明 部 分 已 经 经 过 定 义, 因 此 语 句 函 数 不 能 采 取 递 归 的 形 式, 无 论 是 直 接 的 还 是 间 接 的 递 归 形 式 都 不 行 语 句 函 数 里 面 的 表 达 式 里 面 的 命 名 常 量 和 变 量 都 必 须 在 说 明 部 分 已 经 经 过 定 义, 或 者 能 够 通 过 宿 主 关 联 或 使 用 关 联 而 获 得 数 据 如 果 在 表 达 式 里 面 使 用 了 某 个 数 组 的 元 素, 那 么 该 数 组 也 必 须 预 先 在 说 明 部 分 经 过 声 明 语 句 函 数 的 表 达 式 里 面 的 任 何 数 据 对 象 或 者 是 已 经 预 先 声 明 过, 或 者 就 是 采 用 默 认 的 隐 式 类 型 声 明, 而 在 该 语 句 函 数 之 后, 如 果 存 在 对 于 这 些 数 据 对 象 的 任 何 显 式 类 型 声, 那 么 都 必 须 与 语 句 函 数 里 面 采 取 的 隐 式 类 型 声 明 相 兼 容 语 句 函 数 里 面 的 哑 元 的 作 用 域 与 该 语 句 函 数 语 句 的 作 用 域 一 样 语 句 函 数 的 哑 元 被 预 定 为 具 有 INTENT(IN) 的 属 性, 即 表 达 式 里 面 的 任 何 函 数 引 用 都 不 能 改 变 任 何 哑 元 的 值 语 句 函 数 本 身 不 能 作 为 实 元 语 句 函 数 的 引 用 形 式 与 其 他 形 式 的 函 数 的 引 用 一 致, 变 元 关 联 的 规 则 也 一 致 只 是 语 句 函 数 的 界 面 总 是 隐 式 的, 因 此 它 的 实 元 就 不 能 采 取 关 键 词 形 式 由 于 语 句 函 数 的 变 元 只 能 是 标 量, 而 显 式 界 面 只 能 适 用 于 那 些 具 有 数 组 值 结 果, 哑 形 哑 元, 指 针 变 元 以 及 关 键 词 变 元 的 过 程, 因 此 语 句 函 数 不 能 具 有 显 式 界 面 下 面 是 语 句 函 数 的 几 个 不 同 形 式 的 例 子 例 13-9 CHARACTER (10) WORD_10 CHARACTER (20) WORD_20 WORD_10 (WORD_20) = WORD_20 (11 : 20) REAL WAVE,X WAVE(X)= COS(X)+SIN(X) REAL LENS COMPLE C LENS(C)= REAL(C)**2 + AIMAG(C)** 纯 过 程 纯 过 程 这 个 概 念 完 全 是 FORTRAN 95 为 了 适 应 并 行 化 计 算 而 进 行 的 改 进 由 于 并 行 化 计 算 本 质 上 要 求 进 行 并 行 计 算 的 不 同 运 算 过 程 具 有 相 对 的 独 立 性, 也 就 是 处 于 并 行 位 置 的 不 同 计 算 单 位 的 计 算 值, 相 互 不 会 产 生 影 响 而 传 统 的 来 源 于 串 行 计 算 的 FORTRAN 的 过 程, 在 语 言 设 计 上, 一 般 允 许 过 程 在 执 行 时 具 有 后 效 例 如 当 一 个 函 数 的 引 用 的 目 的 不 是 需 要 使 用 函 数 的 结 果 值, 而 是 利 用 函 数 来 进 行 值 的 传 递, 那 么 该 函 数 的 执 行 的 后 果, 就 是 改 变 了 在 公 用 块 里 面 的 变 元 或 变 量 的 值

226 具 有 后 效 的 过 程 也 具 有 类 似 作 用, 即 改 变 公 用 块 里 面 的 数 据 对 象 的 值 实 际 上 除 了 这 种 作 用 于 作 用 域 外 部 的 后 效 之 外, 输 入 输 出 本 质 上 就 是 一 种 能 够 带 来 后 效 的 操 作 显 然 后 效 对 于 并 行 计 算 会 产 生 不 可 预 计 的 后 果 例 如 能 够 执 行 并 行 运 算 的 FORALL 结 构 或 语 句, 它 内 部 的 语 句 执 行 顺 序 是 不 加 以 规 定 的, 如 果 其 中 包 含 可 能 产 生 后 效 的 过 程, 就 会 导 致 最 终 计 算 结 果 的 不 确 定 性 因 此 要 想 顺 利 地 进 行 并 行 计 算, 就 必 须 在 进 行 并 行 计 算 的 程 序 单 位 里 面 完 全 排 除 具 有 后 效 的 过 程 而 所 谓 纯 过 程 正 是 这 种 完 全 不 会 导 致 后 效 的 纯 过 程 纯 过 程 包 括 两 类 : 所 有 的 固 有 函 数 和 固 有 子 例 行 程 序 MVBITS 都 是 纯 过 程 ; 在 FUNCTION 语 句 或 SUBROUTINE 语 句 里 面 具 有 前 缀 PURE 的 自 定 义 过 程 都 是 纯 过 程 必 须 使 用 纯 过 程 的 上 下 文 有 以 下 4 种 情 形 : 在 FORALL 语 句 或 结 构 里 面 引 用 的 函 数 ; 在 说 明 语 句 里 面 引 用 的 函 数 ; 作 为 实 元 被 调 用 到 一 个 纯 过 程 的 过 程 ; 被 纯 过 程 体 引 用 的 过 程, 包 括 被 自 定 义 运 算 或 自 定 义 赋 值 引 用 的 过 程 如 果 一 个 过 程 被 上 面 的 上 下 文 要 求 是 纯 过 程, 那 么 它 的 界 面 就 必 须 是 显 式 的, 并 且 包 含 关 键 词 PURE 纯 过 程 的 一 般 规 则 如 下 : 纯 函 数 的 哑 元 必 须 具 有 INTENT(IN) 属 性 纯 子 例 行 程 序 的 哑 元 必 须 给 出 其 INTENT 属 性, 除 非 该 哑 元 是 过 程, 或 指 针, 或 替 代 返 回 变 量 纯 过 程 的 局 部 变 量 不 能 具 有 SAVE 属 性 也 就 是 说 纯 过 程 里 面 的 局 部 变 量 不 能 在 过 程 定 义 的 说 明 部 分 获 得 初 始 化, 因 为 获 得 初 始 化 意 味 着 该 变 量 自 动 具 有 了 SAVE 属 性 在 纯 过 程 里 面 的 所 有 内 部 过 程 都 必 须 是 纯 过 程 纯 过 程 不 能 包 含 如 下 几 种 语 句 : STOP 语 句 ; PRINT 语 句 ; OPEN 语 句 ; CLOSE 语 句 ; BACKSPACE 语 句 ; ENDFILE 语 句 ; REWIND 语 句 ; INQUIRE 语 句 ; 说 明 外 部 文 件 的 READ 语 句 ; 说 明 外 部 文 件 的 WRITE 语 句 纯 过 程 里 面 的 任 意 一 个 变 量, 只 要 它 是 公 用 的, 或 者 是 具 有 宿 主 关 联, 或 者 是 具 有 使 用 关 联, 或 者 是 具 有 INTENT(IN) 属 性, 或 者 是 与 这 样 的 变 量 具 有 存 储 关 联, 那 么 它 就 不 能 用 于 以 下 的 上 下 文 情 形 : 赋 值 语 句 的 左 边 ; 指 针 赋 值 语 句 ; DO 变 量 或 隐 式 DO 变 量 ;

227 READ 语 句 来 自 内 部 文 件 的 输 入 项 ; WRITE 语 句 的 内 部 文 件 ; I/O 语 句 的 来 自 内 部 文 件 的 IOSTAT 变 量 或 SIZE 变 量 ; ALLOCATE 语 句 或 DEALLOCATE 语 句 的 STAT 变 量 或 分 配 对 象 ; NULLIFY 语 句 里 面 的 指 针 对 象 ; 赋 值 语 句 的 右 边, 而 该 赋 值 语 句 的 左 边 在 某 个 层 次 包 含 了 指 针 成 员 下 面 是 纯 过 程 的 一 个 例 子 例 PURE FUNCTION ACROSS(X,C) REAL ACROSS REA L,INTENT(IN) :: X COMPLEX C INTENT(IN)::C END FUNCTION ACROSS 13.5 逐 元 过 程 如 果 说 纯 过 程 的 概 念 是 为 了 给 程 序 运 行 的 并 行 化 排 除 障 碍, 那 么 逐 元 过 程 的 概 念 则 是 FORTRAN 95 实 现 程 序 运 行 的 并 行 化 的 强 有 力 工 具 逐 元 过 程 的 哑 元 都 是 标 量, 逐 元 函 数 的 结 果 值 也 是 标 量, 而 它 实 现 并 行 化 计 算 的 功 能 就 体 现 在 任 意 调 用 它 的 实 元 可 以 是 任 意 秩 的 数 组 一 般 说 来 任 意 形 式 的 实 元 数 组 都 是 与 逐 元 过 程 的 标 量 哑 元 相 匹 配 的, 不 过 还 是 有 如 下 两 种 例 外 情 形 : 如 果 一 个 固 有 函 数 带 有 变 元 关 键 词 KIND, 那 么 相 应 的 实 元 就 不 能 是 数 组, 而 只 能 是 一 个 标 量 整 型 初 始 化 表 达 式 如 果 一 个 自 定 义 函 数 的 哑 元 用 于 一 个 说 明 表 达 式, 那 么 与 该 哑 元 相 关 联 的 实 元 就 只 能 是 标 量 那 么 一 个 以 标 量 为 哑 元 的 逐 元 过 程 是 如 何 作 用 于 数 组 实 元 的 呢? 实 际 上 该 过 程 的 作 用 对 象 仍 然 是 标 量, 即 逐 元 过 程 作 用 于 数 组 实 元 的 每 一 个 标 量 元 素, 然 后 对 于 每 一 个 元 素 得 到 相 应 的 值, 所 有 这 些 值 构 成 一 个 集 合, 就 是 该 逐 元 过 程 作 用 于 数 组 实 元 所 得 到 的 数 组 值 至 于 该 过 程 对 数 组 实 元 的 元 素 的 作 用 顺 序, 则 是 不 加 以 规 定 的, 因 为 正 是 不 规 定 顺 序, 才 能 实 现 不 同 元 素 相 互 独 立 的 计 算 处 理 进 程 的 并 行 化, 否 则, 如 果 强 制 性 地 规 定 对 于 元 素 的 处 理 顺 序, 那 就 回 到 了 串 行 序 列 处 理 的 方 式, 无 法 发 挥 具 有 并 行 处 理 功 能 的 系 统 的 并 行 处 理 能 力 当 然 具 体 的 针 对 数 组 元 素 的 运 行 方 式, 是 由 系 统 决 定 的, 如 果 系 统 不 支 持 并 行 计 算, 那 么 系 统 会 采 取 默 认 的 顺 序 安 装 串 行 方 式 来 运 行 ; 如 果 系 统 支 持 并 行 运 算, 那 么 就 会 根 据 系 统 的 并 行 能 力, 做 到 某 些 元 素 是 同 时 加 以 计 算 处 理 的 实 际 上,FORTRAN 95 把 逐 元 过 程 的 概 念 从 固 有 过 程 扩 展 到 自 定 义 过 程 是 FORTRAN 语 言 的 一 个 显 著 进 步, 类 似 于 在 FORTRAN90 实 现 的 把 过 程 类 属 的 概 念 从 固 有 过 程 扩 展 到 自 定 义 过 程 对 于 逐 元 的 自 定 义 过 程 来 说, 在 FUNCTION 语 句 或 SUBROUTINE 语 句 里 面 必 须 加 上 前 缀 说 明 ELEMENTAL, 以 说 明 该 自 定 义 过 程 为 逐 元 过 程 由 于 逐 元 过 程 本 来 就 是 用 来 进 行 并 行 计 算 的, 因 此 任 何 逐 元 过 程 首 先 必 须 是 纯 过 程 这 样 在

228 出 现 了 ELEMENTAL 前 缀 之 后, 也 可 以 再 加 上 前 缀 PURE, 但 完 全 是 多 余 的 由 于 逐 元 过 程 同 时 也 是 纯 过 程, 使 得 纯 过 程 的 所 有 规 则 ( 参 见 13.4 节 ) 也 都 适 用 于 逐 元 过 程, 另 外 逐 元 过 程 还 遵 循 下 面 列 举 的 规 则 逐 元 过 程 不 能 是 递 归 的 逐 元 过 程 的 哑 元 不 能 是 指 针 逐 元 函 数 的 结 果 不 能 是 指 针 逐 元 子 例 行 程 序 的 哑 元 不 能 是 替 代 返 回 变 量 逐 元 过 程 的 哑 元 不 能 是 一 个 过 程 逐 元 过 程 在 任 何 引 用 它 的 程 序 单 位 里 面 都 必 须 具 有 显 式 的 界 面 例 ELEMENTAL FUNCTION QUADRIC(Z,X) REAL QUADRIC REAL,INTENT(IN)::X COMPLEX,INTENT(IN)::Z END FUNCTION QUADRIC QUADRIC((3.0,5.4),6.8)! 此 处 调 用 具 有 标 量 变 元 的 函 数 QUADRIC QUADRIC(C1,X1)! 此 处 的 C1 和 X1 分 别 为 适 当 的 复 型 数 组 和 实 型 数 组, 因 此 此 处! 调 用 的 实 元 为 数 组 变 量, 而 该 调 用 的 结 果 为 分 别 与 这 两 个 实 元 相! 匹 配 的 数 组 13.6 与 过 程 相 关 的 语 句 有 五 个 语 句 是 专 门 为 在 程 序 当 中 运 用 过 程 服 务 的, 它 们 都 是 通 用 的 语 句, 也 就 是 能 够 用 于 任 何 形 式, 任 何 种 类 的 过 程 这 些 语 句 列 举 如 下 : RETURN 语 句 ; CONTAINS 语 句 ; ENTRY 语 句 ; EXTERNAL 语 句 ; INTRINSIC 语 句 下 面 分 别 说 明 它 们 的 功 能 RETURN 语 句 RETURN 语 句 的 功 能 就 是 终 止 过 程 的 执 行, 使 得 程 序 的 运 行 返 回 到 引 用 该 过 程 的 程 序 单 位 由 于 过 程 的 结 构 当 中 本 身 含 有 END 语 句, 因 此 RETURN 语 句 的 功 能 在 大 多 数 情 况 下, 都 可 以 直 接 由 过 程 自 身 的 END 语 句 来 完 成 不 过 RETURN 语 句 还 具 有 一 个 功 能 却 是 END 语 句 无 法

229 替 代 的, 即 RETURN 语 句 能 够 放 置 在 一 个 过 程 内 部 的 执 行 部 分 的 任 意 位 置, 使 得 过 程 能 够 在 执 行 的 任 意 时 刻 中 断, 返 回 到 引 用 该 过 程 的 程 序 单 位 RE TURN 语 句 的 语 法 形 式 (R1226) 为 : RETURN [scalar-integer-expression] 其 中 的 选 项 标 量 整 型 表 达 式 (scalar-integer-expression) 只 能 用 于 子 例 行 程 序, 并 且 是 用 于 替 代 返 回 的 情 形 其 中 的 表 达 式 只 能 是 整 型 的, 取 值 范 围 为 1 到 n,n 表 示 变 元 列 表 当 中 替 代 返 回 变 元 的 位 置, 即 列 表 从 左 到 右 的 顺 序 位 置 表 达 式 的 取 值 就 表 示 所 选 择 的 从 过 程 返 回 的 位 置 这 个 替 代 返 回 的 作 用 可 以 用 GO TO 语 句 的 形 式 表 示, 例 如 : CALL SUBROUTINE22(,SELE) GO TO (label-list),sele 这 样 在 程 序 从 子 例 行 程 序 SUBROUTINE22 返 回 之 前, 与 SELE 相 应 的 哑 元 就 被 赋 予 为 整 型 表 达 式 替 代 返 回 值, 实 际 上 这 样 的 替 代 返 回 的 功 能 完 全 可 以 通 过 使 用 CASE 结 构 来 完 成, 并 且 CASE 结 构 能 够 使 得 程 序 更 加 结 构 化, 因 此 相 对 而 言, 使 用 RETURN 语 句 是 一 种 过 时 的 风 格 CONTAINS 语 句 CONTAINS 语 句 只 是 起 一 种 隔 离 标 志 的 作 用, 即 把 内 部 过 程 从 它 的 宿 主 单 位 的 说 明 部 分 或 执 行 部 分 里 面 隔 离 标 记 出 来, 或 者 是 把 模 块 过 程 从 它 所 在 模 块 说 明 部 分 隔 离 标 记 出 来 CONTAINS 语 句 的 语 法 形 式 (R1227) 为 : CONTAINS 即 在 需 要 予 以 标 记 的 过 程 前 面 一 行 使 用 CONTAINS 一 个 词 即 可 CO NTAINS 语 句 不 是 可 执 行 的, 它 只 是 起 一 个 标 记 的 作 用, 把 过 程 从 其 所 在 的 程 序 单 位 隔 离 开, 这 样 当 程 序 运 行 到 CONTAINS 语 句 时, 它 后 面 的 语 句 就 不 会 接 着 执 行, 而 是 直 接 转 移 到 该 程 序 单 位 的 END 语 句 ENTRY 语 句 ENTRY 语 句 的 功 能 是 为 过 程 与 过 程 子 程 序 之 间 提 供 数 据 共 享 即 在 一 个 过 程 子 程 序 的 说 明 部 分 或 执 行 部 分 给 出 一 条 ENTRY 语 句, 就 定 义 了 相 应 的 过 程 登 录, 该 被 登 录 的 过 程 也 就 可 以 访 问 其 所 在 子 程 序 的 数 据 环 境 ENTRY 语 句 的 语 法 形 式 (R1225) 为 : ENTRY entry-name [([dummy-argument-list])] [RESULT(result-name)] 如 果 该 登 录 出 现 在 一 个 函 数 内 部, 那 么 它 的 哑 元 (dummy-argument) 与 结 果 (result-name) 的 属 性 都 必 须 在 子 程 序 的 说 明 部 分 预 先 予 以 说 明 ENTRY 语 句 的 功 能 实 质 上 可 以 看 作 是 在 一 个 函 数 子 程 序 或 一 个 子 例 行 程 序 子 程 序 里 面, 引 入 一 条 FUNCTION 语 句, 或 SUBROUTINE 语 句 的 非 常 灵 活 的 一 种 方 法 当 然 登 录 进 来 的 名 称 不 能 与 子 程 序 里 面 已 有 的 任 何 名 称 以 及 子 程 序 本 身 的 名 称 相 冲 突

230 为 了 更 加 清 晰 地 说 明 ENTRY 语 句 的 功 能, 下 面 给 出 一 个 例 子 例 SUBROUTINE COUNT1(dummy-argument-list1) RETURN ENTRY OP1(dummy-argument-list2) ENTRY OP2(dummy-argument-list3) RETURN END SUBROUTINE COUNT1 在 上 面 的 子 例 行 程 序 COUNT1 里 面, 至 少 登 录 了 两 个 过 程 OP1 和 OP2,ENTRY 语 句 之 间 是 一 系 列 的 可 执 行 语 句, 它 们 构 成 了 被 登 录 过 程 一 旦 某 个 登 录 过 程 被 其 所 在 子 程 序 单 位 所 调 用, 那 么 整 个 子 程 序 单 位 的 运 行 就 转 到 该 ENTRY 语 句, 按 照 通 常 的 方 式 执 行 该 过 程, 然 后 忽 略 后 续 的 任 何 ENTRY 语 句, 一 直 到 遇 到 RETURN 语 句, 或 者 是 到 达 了 子 程 序 单 位 的 END 语 句 在 很 多 的 实 际 情 况 下, 一 个 子 程 序 里 面 登 录 的 过 程 都 是 非 常 类 似 的 计 算 过 程, 可 能 具 有 相 同 的 数 据 对 象 以 及 代 码, 那 么 就 不 需 要 在 多 个 ENTRY 语 句 体 里 面 进 行 重 复, 完 全 可 以 只 在 最 后 一 个 ENTRY 语 句 里 面 出 现, 然 后 运 用 适 当 的 分 支 来 访 问 该 ENTRY 体 如 果 不 希 望 使 用 分 支 方 式 的 话, 也 可 以 把 这 个 公 共 的 数 据 与 代 码 封 装 为 一 个 内 部 过 程, 随 时 供 整 个 子 程 序 单 位 访 问 这 样 一 个 函 数 子 程 序 里 面 的 所 有 ENTRY 语 句 就 定 义 了 相 应 的 函 数 子 过 程, 而 一 个 子 例 行 程 序 子 程 序 里 面 的 所 有 ENTRY 语 句 也 定 义 了 相 应 的 子 例 行 程 序 子 过 程 对 于 函 数 子 程 序 里 面 的 ENTRY 语 句 来 说, 它 的 RESULT 选 项 与 FUNCTION 语 句 里 面 的 RESULT 选 项 的 涵 义 与 形 式 都 是 一 样 的 ENTRY 语 句 的 一 般 规 则 如 下 : 如 果 ENTRY 语 句 是 出 现 在 一 个 函 数 子 程 序 里 面, 那 么 ENTRY 语 句 里 面 用 来 隔 离 可 选 哑 元 列 表 的 括 号 必 须 出 现 只 有 外 部 子 程 序 与 模 块 子 程 序 可 以 使 用 ENTRY 语 句, 内 部 子 程 序 不 能 使 用 ENTRY 语 句 在 外 部 子 程 序 与 模 块 子 程 序 里 面 可 以 使 用 任 意 有 限 数 目 的 ENTRY 语 句 在 可 执 行 结 构, 例 如 IF,DO,CASE,FORALL,WHERE 这 些 结 构 里 面, 或 者 是 非 块 DO 循 环 里 面, 都 不 能 使 用 ENTRY 语 句 登 录 名 称 不 能 与 其 所 在 子 程 序 的 任 何 哑 元 名 称 相 冲 突 登 录 名 称 不 能 出 现 在 子 程 序 的 EXTERNAL 语 句,INTRINSIC 语 句, 以 及 过 程 界 面 块 里 面 ENTRY 语 句 里 面 的 RESULT 选 项 只 能 用 于 函 数 登 录, 因 此 只 能 出 现 在 函 数 子 程 序 里 面 如 果 在 一 个 函 数 登 录 里 面 指 定 了 一 个 RESULT 名 称, 那 么 该 名 称 不 能 与 子 程 序 里 面 的 其 他 RESULT 名 称, 以 及 登 录 名 称 和 函 数 名 称 相 冲 突 ; 而 且 相 应 的 登 录 函 数 名 称 不 能 出 现 在 子 程 序 的 任 何 说 明 语 句 当 中, 函 数 名 称 的 属 性 与 其 结 果 名 称 的 属 性 保 持 一 致 ENTRY 语 句 当 中 不 能 使 用 关 键 词 RECURSIVE 实 际 上 在 子 程 序 里 面 的 初 始 SUBROUTINE 语 句 或 FUNCTION 语 句 里 面 使 用 或 不 使 用 RECURSIVE 关 键 词, 就 表 示 了 该 子 程 序 里 面 的 所 有 ENTRY 过 程 都 具 有 或 不 具 有 RECURSIVE 属 性

231 如 果 在 一 个 函 数 子 程 序 里 面 的 所 有 ENTRY 函 数 的 结 果, 都 具 有 相 同 的 类 型, 种 别 参 数, 以 及 形 状, 那 么 它 们 可 以 看 成 是 同 一 个 结 果 变 量 而 对 于 该 结 果 变 量 的 性 质 没 有 任 何 限 制 如 果 一 个 函 数 子 程 序 里 面 的 所 有 ENTRY 函 数 以 及 它 们 的 函 数 结 果, 并 不 具 有 完 全 相 同 的 数 据 属 性, 即 不 具 有 完 全 相 同 的 类 型, 种 别 参 数, 以 及 形 状, 那 么 它 们 都 必 须 是 标 量, 并 且 不 能 具 有 指 针 属 性, 必 须 属 于 默 认 整 型, 或 默 认 实 型, 或 默 认 复 型, 或 双 精 度 实 型, 或 者 默 认 逻 辑 型 因 为 一 个 子 程 序 里 面 的 所 有 ENTRY 结 果 与 函 数 结 果 都 是 相 互 之 间 具 有 存 储 关 联 关 系 的 ENTRY 语 句 所 给 出 的 哑 元 不 能 出 现 在 该 ENTRY 语 句 之 前 的 可 执 行 语 句 里 面, 也 不 能 出 现 在 该 ENTRY 语 句 之 前 的 语 句 函 数 的 标 量 表 达 式 里 面, 除 非 该 哑 元 同 时 也 是 其 所 在 语 句 函 数 的 哑 元 如 果 一 个 可 执 行 语 句 或 语 句 函 数 依 赖 于 某 个 登 录 过 程 的 哑 元, 或 者 通 过 一 个 局 部 数 据 对 象 而 间 接 依 赖 于 某 个 登 录 过 程 的 哑 元, 例 如 尺 度 依 赖 某 个 登 录 过 程 的 哑 元 的 局 部 动 态 数 组, 那 么 只 有 在 该 哑 元 出 现 在 引 用 过 程 的 ENTRY 语 句 的 可 选 哑 元 列 表 里 面 的 情 形 下, 该 可 执 行 语 句 或 语 句 函 数 才 能 够 得 到 执 行 而 在 该 哑 元 可 选 的 情 况 下, 其 所 关 联 的 实 元 也 必 须 存 在 在 ENTRY 语 句 里 面 的 哑 元 的 名 称, 顺 序, 数 目, 类 型, 种 别 参 数 都 可 以 不 同 于 其 所 在 子 程 序 的 FUNCTION 语 句, 或 SUBROUTINE 语 句, 以 及 任 何 其 他 ENTRY 语 句 里 面 的 哑 元 对 于 外 部 子 程 序 来 说, 由 ENTRY 语 句 定 义 的 过 程 的 界 面 可 以 在 另 外 的 作 用 域 单 位 里 面, 通 过 在 过 程 界 面 块 里 面 给 出 界 面 体, 而 显 式 地 表 示 出 来, 这 时 ENTRY 语 句 必 须 作 为 界 面 体 的 第 一 条 语 句, 而 且 关 键 词 ENTRY 必 须 用 关 键 词 FUNCTION 或 SUBROUTINE 替 代 如 果 子 程 序 是 递 归 的 话, 那 么 界 面 体 当 中 必 须 包 括 关 键 词 RECURSIVE, 并 且 必 须 给 出 哑 元 的 属 性 ; 如 果 过 程 为 函 数 的 话, 则 还 需 给 出 函 数 结 果 的 属 性 对 于 模 块 过 程 里 面 的 ENTRY 过 程 来 说, 其 界 面 已 经 在 引 用 该 模 块 的 程 序 单 位 里 面 显 式 地 给 出 下 面 是 不 同 形 式 的 ENTRY 语 句 的 例 子 例 ENTRY SUB_WAVELET (X)! 登 录 子 例 行 程 序 ENTRY FUN_FACTOR(A,B) RESULT(CO_FACTOR)! 登 录 函 数, 必 须 具 有 RESULT 选 项 EXTERNAL 语 句 EXTERNAL 语 句 用 于 说 明 某 个 程 序 单 位 里 面 没 有 加 以 说 明 的 名 称 为 过 程 名 称 其 具 体 用 法 参 见 节 考 虑 如 下 的 程 序 单 位 的 片 断 : X=SIN(A)* COS(B) CALL SUB1(A,B) CALL SUB2(X,SUB1,C)

232 单 纯 从 上 面 的 片 断 里 面, 就 可 以 判 断 里 面 的 X,A 和 B 为 变 量 名 称, 而 SUB1,SUB2 为 过 程 名 称, 但 是 无 法 判 断 C 属 于 变 量 名 称 还 是 过 程 名 称, 因 此 在 程 序 单 位 的 其 他 位 置 必 须 说 明 C 的 性 质, 如 果 没 有 说 明, 则 系 统 默 认 该 变 元 为 变 量 而 如 果 希 望 指 定 该 变 元 为 过 程, 就 需 要 使 用 EXTERNAL 语 句 EXTERNAL 语 句 的 一 般 规 则 如 下 : 通 过 EXTERNAL 语 句 给 出 的 过 程 名 称 必 须 是 其 所 在 程 序 单 位 的 实 元, 相 应 的 过 程 则 必 须 是 外 部 过 程 或 哑 过 程, 而 不 能 是 内 部 过 程, 语 句 函 数 或 类 属 过 程, 因 为 这 几 种 过 程 的 名 称 不 能 作 为 实 元 EXTERNAL 给 出 的 名 称 不 能 作 为 过 程 名 称 出 现 在 其 所 在 的 作 用 域 单 位 的 界 面 块 里 面 由 于 在 一 个 程 序 单 位 里 面 给 出 外 部 过 程 的 界 面 块 也 能 够 实 现 EXTERNAL 语 句 的 类 似 功 能, 因 此 从 结 构 化 编 程 的 角 度 出 发,EXTERNAL 语 句 属 于 过 时 的 语 言 成 分 不 过 EXTERNAL 还 具 有 关 联 数 据 块 程 序 单 位 的 功 能, 因 此 还 不 能 说 EXTERNAL 语 句 完 全 可 以 废 弃 INTRINSIC 语 句 INTRINSIC 语 句 的 功 能 与 EXTERNAL 语 句 的 功 能 类 似, 只 是 INTRINSIC 语 句 用 来 指 示 固 有 过 程, 而 EXTERNAL 语 句 用 来 指 示 外 部 过 程 INTRINSIC 语 句 的 具 体 用 法 参 见 节 考 虑 下 面 的 例 CALL SUB1(X,Y,LOG) 如 果 在 上 面 的 子 例 行 程 序 的 引 用 里 面 出 现 的 名 称 LOG 没 有 被 其 所 在 的 程 序 单 位 额 外 指 定 为 某 个 特 定 的 过 程 名 称, 那 么 LOG 就 表 示 FORTRAN 的 固 有 过 程, 这 时 就 需 要 使 用 INTRINSIC 语 句 来 说 明 这 点 由 于 固 有 过 程 已 经 被 系 统 内 在 地 加 以 定 义, 所 以 不 需 要 具 有 界 面 块, 因 此 界 面 块 无 法 替 代 INTRINSIC 语 句 的 功 能, 这 点 与 EXTERNAL 语 句 是 不 同 的 过 程 通 讯 的 途 径 -- 变 量 关 联 本 章 后 面 的 变 量 关 联 与 过 程 界 面 这 两 节 围 绕 着 一 个 主 题, 即 过 程 之 间 的 通 讯 一 个 过 程 是 一 个 完 整 的 FORTRAN 计 算 结 构, 而 一 个 实 际 的 计 算 任 务 常 常 需 要 多 个 不 同 的 过 程 组 合 起 来, 这 样 就 存 在 一 个 程 序 如 何 一 个 过 程 通 讯 的 问 题, 即 如 何 与 过 程 传 递 数 据 的 问 题 归 根 结 底, 如 果 把 数 据 看 成 内 容 物 的 话, 那 么 装 载 数 据 的 容 器 就 是 变 元 而 数 据 通 讯 就 可 以 归 结 为 如 何 在 不 同 的 变 元 之 间 交 换 它 们 的 内 容 物, 也 就 是 数 据 把 一 个 过 程 纳 入 一 个 程 序 的 运 行 顺 序, 在 FORTRN 里 面 称 为 引 用, 即 如 果 一 个 程 序 单 位 引 用 了 一 个 过 程, 那 么 该 程 序 单 位 的 数 据 流 就 从 属 于 该 程 序 单 位 的 变 元 传 递 到 属 于 被 引 用 过 程 的 变 元, 使 得 数 据 流 在 被 引 用 过 程 里 面 得 到 过 程 对 其 进 行 的 计 算 处 理, 然 后 该 过 程 再 把 数 据 结 果 输 出 到 程 序 单 位 里 面 的 用 来 装 载 过 程 数 据 结 果 的 变 元, 这 样 就 完 成 了 对 过 程 的 引 用, 也 完 成 了 与 过 程 的 数 据 通 讯 可 以 看 到 在 上 面 的 程 序 单 位 对 过 程 的 通 讯 之 中, 涉 及 到 两 种 类 型 的 变 元 : 一 类 是 属 于 程 序 单 位 的 变 元, 用 于 装 载 程 序 单 位 对 过 程 的 输 入 数 据 与 输 出 数 据 ;

233 一 类 是 属 于 过 程 的 变 元, 作 为 过 程 的 处 理 对 象, 用 于 表 示 相 应 数 据 在 过 程 执 行 当 中 的 涵 义 这 两 种 变 元 的 定 义 是 完 全 独 立 的, 属 于 程 序 单 位 的 变 元 在 其 所 在 的 程 序 单 位 里 面 得 到 定 义, 而 完 全 不 用 考 虑 它 将 需 要 把 数 据 传 递 到 什 么 过 程 里 面 去 ; 同 样 属 于 过 程 的 变 元 完 全 在 过 程 里 面 得 到 定 义, 而 完 全 不 需 要 考 虑 它 将 接 受 来 自 什 么 样 的 程 序 单 位 的 数 据 输 入 正 是 基 于 这 种 相 对 性, 属 于 引 用 过 程 的 程 序 单 位 的 变 元 称 为 实 元, 而 属 于 被 引 用 的 过 程 的 变 元 称 为 哑 元, 所 谓 与 过 程 的 通 讯, 正 是 实 元 与 哑 元 之 间 的 数 据 交 换,FORTRAN 称 之 为 实 元 与 哑 元 的 关 联, 更 一 般 地 则 称 为 变 元 关 联 那 么 如 何 指 定 需 要 相 互 进 行 数 据 交 换 的 实 元 与 哑 元 呢?FORTRAN 的 表 述 方 式 非 常 自 然, 我 们 回 顾 一 下 在 定 义 过 程 的 时 候, 例 如 在 定 义 子 例 行 程 序 的 SUBROUTINE 语 句, 和 定 义 函 数 的 FUNCTION 语 句 里 面, 都 在 过 程 名 称 后 面 给 出 了 一 个 哑 元 列 表, 即 该 过 程 所 使 用 的 所 有 哑 元 的 一 个 序 列, 而 我 们 在 引 用 过 程 时, 使 用 了 CALL 语 句, 在 引 用 函 数 时, 则 直 接 引 用 函 数 名 称, 这 两 种 方 式 都 在 过 程 名 称 后 面 给 出 了 实 元 列 表, 即 在 程 序 单 位 里 面 需 要 经 过 引 用 过 程 的 处 理 的 所 有 变 元 的 一 个 序 列 那 么 在 实 元 与 哑 元 之 间 建 立 一 一 对 应 的 关 联 的 自 然 方 法, 就 是 利 用 这 两 个 列 表 的 变 元 顺 序, 约 定 两 个 变 元 列 表 按 照 从 左 到 右 的 顺 序 是 一 一 对 应, 即 处 于 两 个 列 表 的 相 同 的 位 置 变 元, 意 味 着 它 们 是 相 互 关 联 的 下 面 以 SUBROUTINE 语 句 和 对 子 例 行 程 序 的 CALL 引 用 语 句 为 例, 对 这 种 序 列 的 按 照 位 置 的 对 应 约 定 进 行 了 图 示 SUBROUTINE name(dummy-argument1,dummy-argument2,dummy-argument3, ) 第 一 对 实 哑 对 应 第 二 对 实 哑 对 应 第 三 对 实 哑 对 应... CALL name(actual-argument1,actual -argument2,actual -argument3, ) 图 13-1 实 元 与 哑 元 之 间 的 按 照 顺 序 约 定 的 关 联 因 此 在 这 种 基 本 的 实 元 与 哑 元 的 关 联 表 示 当 中, 两 个 变 元 列 表 的 变 元 位 置 是 基 本 的 表 达 方 式 本 节 我 们 将 更 加 仔 细 地 分 小 节 说 明 建 立 这 种 关 联 关 系 的 各 种 规 则 与 变 化 形 式 变 元 关 联 时 数 据 属 性 的 匹 配 变 元 关 联 的 本 质 就 是 变 元 之 间 交 换 数 据 值, 而 变 元 本 身 在 各 自 的 程 序 单 位, 或 过 程 内 部 肯 定 是 经 过 定 义 的, 或 者 是 显 式 地 定 义, 或 者 是 存 在 默 认 定 义, 这 就 对 变 元 之 间 的 数 据 交 换 构 成 了 前 提, 即 一 个 变 元 通 过 交 换 数 据 而 获 得 的 数 据 的 属 性 不 能 与 变 元 本 身 被 定 义 的 属 性 相 冲 突, 这 就 是 变 元 关 联 时 的 数 据 属 性 匹 配 问 题 对 于 所 谓 实 元, 具 有 明 确 的 数 据 内 容, 并 且 属 于 所 在 程 序 单 位 的 实 际 执 行 对 象, 因 此 它 的 数 据 属 性 必 然 是 明 确 的 对 于 所 谓 哑 元, 它 并 不 具 有 实 际 的 数 据 内 容, 也 不 是 程 序 单 位 实 际 执 行 过 程 中 需 要 处 理 的 对 象, 表 面 上 实 元 和 哑 元 交 换 了 数 据 内 容, 但 是 哑 元 本 身 在 任 何 时 候 都 没 有 参 与 程 序 的 执 行, 在 哑 元 与 实 元 建 立 关 联 后, 哑 元 所 在 过 程 的 运 行, 实 际 上 仍 然 是 实 元 携 带 其 数 据 内 容 在 参 与 程 序 的 运 行, 尽 管 这 时 的 实 元 在 该 过 程 里 面 扮 演 的 正 是 相 关 哑 元 的 角 色 但 是, 哑 元 作 为 其 所 在 过 程 里 面 的 变 元, 却 是 具 有 明 确 的 数 据 属 性 的, 这 个 属 性 是 由 过 程 本 身 决 定 的, 实 元 要 扮 演 哑 元 在 过 程 里 面 的 角 色, 就 不 能 与 哑 元 的 数 据 属 性 有 冲 突, 否 则 该 过 程 本 身 是 否 还 有 意 义, 都 会 很 成 问 题

234 例 如 只 对 实 型 数 据 有 意 义 的 一 个 函 数, 如 果 它 被 引 用 之 后, 与 其 中 哑 元 对 应 的 实 元 可 以 取 复 型 数 据, 那 么 肯 定 会 发 生 该 函 数 无 法 计 算 的 后 果 因 此 数 据 属 性 的 匹 配 问 题, 是 实 元 与 哑 元 双 方 面 的 问 题, 不 能 只 对 其 中 一 方 面 进 行 检 查 那 么 变 元 之 间 的 数 据 属 性 匹 配 要 达 到 什 么 程 度 呢? 首 先 我 们 必 须 在 对 数 据 对 象 进 行 分 类 的 基 础 上 来 讨 论 这 个 问 题, 因 为 可 以 作 为 过 程 变 元 的 数 据 对 象 除 了 可 以 是 固 有 数 据 类 型, 派 生 数 据 类 型, 表 达 式, 数 组, 指 针 等 常 见 数 据 对 象 之 外, 还 可 以 是 过 程 以 及 替 代 返 回 变 元, 对 于 数 组, 指 针, 替 代 返 回, 以 及 过 程, 后 面 都 将 分 小 节 专 门 进 行 讨 论, 因 此 在 本 节 只 讨 论 标 量 直 观 地 看, 变 元 之 间 的 数 据 属 性 匹 配 所 需 要 达 到 的 一 个 基 本 目 的 就 是 能 够 使 得 过 程 得 到 合 理 的 运 行 结 果, 在 这 个 前 提 下, 所 谓 数 据 属 性 的 匹 配 包 含 如 下 三 个 方 面 的 要 素 : 数 据 类 型 ; 种 别 参 数 ; 秩 一 个 数 据 对 象 的 这 三 个 方 面 的 属 性 组 合 起 来, 简 称 为 TKR 模 式 变 元 关 联 的 基 本 原 则, 或 者 说 实 元 与 哑 元 获 得 关 联 的 基 本 前 提, 就 是 它 们 的 TKR 模 式 相 同 如 果 我 们 目 前 只 考 虑 标 量 的 话, 在 秩 都 是 1 的 前 提 下, 这 个 基 本 原 则 包 含 如 下 内 容 : 要 求 与 一 个 标 量 实 元 相 关 联 的 哑 元, 同 样 必 须 是 标 量, 并 且 必 须 与 该 实 元 标 量 具 有 相 同 的 数 据 类 型 与 相 同 的 种 别 参 数 值 数 组 的 元 素, 结 构 的 标 量 成 员, 字 符 子 串 都 可 以 作 为 有 效 的 标 量 实 元 由 于 字 符 型 标 量 的 变 元 还 包 括 字 符 长 度 这 个 数 据 属 性, 而 只 有 在 保 证 所 有 字 符 型 变 元 的 长 度 都 得 到 显 式 地 说 明 前 提 下, 才 能 做 到 有 效 检 测 匹 配 条 件, 但 这 样 就 会 限 制 过 程 的 使 用 范 围, 为 了 解 决 这 个 问 题,FORTRAN 给 出 哑 长 度 哑 元 的 概 念, 使 得 在 不 给 出 显 式 长 度 说 明 的 情 况 下, 也 能 够 做 到 变 元 匹 配, 从 而 适 当 地 放 松 了 字 符 型 变 元 匹 配 的 条 件 : 字 符 型 哑 元 如 果 不 能 做 到 显 式 地 说 明 长 度, 那 么 就 必 须 具 有 哑 长 度 属 性 哑 长 度 属 性 只 适 用 于 哑 元, 其 表 示 方 式 为 (*), 即 用 星 号 代 替 长 度 值 该 哑 元 的 长 度 只 有 在 获 得 实 元 的 关 联 之 后, 才 能 被 确 定, 也 就 是 实 元 在 把 自 己 的 值 传 递 给 哑 元 的 同 时, 也 把 自 己 的 长 度 属 性 值 传 递 给 了 哑 元 如 果 不 使 用 哑 长 度 哑 元 的 形 式, 而 是 给 出 变 元 长 度 的 显 式 说 明, 那 么 对 于 非 默 认 字 符 型 变 元, 哑 元 与 实 元 的 长 度 必 须 是 一 样 的 ; 而 对 于 默 认 字 符 型 变 元, 则 从 语 法 上 可 以 允 许 不 一 样, 并 且 针 对 如 下 的 不 同 情 形 进 行 不 同 的 处 理 : 如 果 实 元 的 长 度 大 于 哑 元 的 长 度, 那 么 被 调 用 过 程 在 使 用 该 实 元 值 时, 只 取 该 字 符 型 标 量 实 元 值 的 左 端 的 字 符 子 串, 该 子 串 的 长 度 与 哑 元 的 长 度 一 致 因 此 在 实 元 的 右 端 所 有 超 过 了 哑 元 长 度 值 的 字 符 都 被 该 过 程 忽 略 掉 了 如 果 实 元 的 长 度 小 于 哑 元 的 长 度, 则 是 不 允 许 的 为 了 安 全 与 简 便 起 见, 在 涉 及 到 字 符 型 变 元 的 匹 配 时, 还 是 把 哑 元 设 置 为 哑 长 度 哑 元 为 宜 注 意 除 非 哑 元 属 性 是 在 宿 主 单 位 里 面 定 义 的, 语 句 函 数 引 用 是 满 足 这 个 基 本 条 件 的 由 于 外 部 过 程 与 引 用 它 的 程 序 单 位 一 般 都 是 分 别 进 行 编 译 的, 因 此 系 统 在 编 译 时, 无 法 对 它 们 进 行 变 元 匹 配 性 质 的 检 查, 这 常 常 导 致 FORTRAN 程 序 产 生 匹 配 错 误, 因 此 FORTRAN 提 供 了 显 式 过 程 界 面 的 机 制, 来 解 决 这 种 匹 配 问 题

235 数 组 的 匹 配 由 于 数 组 具 有 形 状 属 性, 所 以 和 标 量 的 匹 配 相 比, 数 组 的 匹 配 还 需 要 考 虑 形 状 的 因 素 数 组 变 元 的 匹 配 的 基 本 原 则 就 是 实 元 与 哑 元 必 须 具 有 相 同 的 形 状, 这 意 味 着 实 元 与 哑 元 必 须 具 有 相 同 的 维 数, 每 个 相 应 的 维 度 都 必 须 具 有 相 同 的 元 素 数 目, 它 们 的 尺 度 必 须 相 同 当 然 上 述 原 则 的 前 提 是 数 组 哑 元 与 数 组 实 元 都 经 过 了 显 式 的 形 状 说 明, 才 能 完 成 匹 配 检 查, 这 个 前 提 实 际 上 限 制 了 过 程 应 用 的 灵 活 性, 因 此 与 字 符 型 变 元 类 似, 对 于 数 组 FORTRAN 也 提 供 了 哑 形 数 组 的 概 念, 使 得 具 有 哑 形 数 组 属 性 的 哑 元 的 过 程, 能 够 更 加 具 有 通 用 性 一 旦 对 哑 元 赋 予 哑 形 数 组 的 属 性, 就 简 化 了 匹 配 条 件, 即 只 需 要 实 元 与 哑 元 的 秩 相 同, 就 保 证 了 实 元 与 哑 元 的 匹 配, 因 为 对 于 哑 形 哑 元 来 说, 它 的 形 状 只 有 在 获 得 实 元 的 关 联 之 后, 才 能 完 全 确 定 下 来, 这 样 在 秩 相 同 的 前 提 下, 就 不 再 存 在 匹 配 方 面 的 冲 突 哑 形 哑 元 与 实 元 的 匹 配 在 通 过 秩 相 同 的 检 查 之 后, 就 按 照 两 个 数 组 变 元 的 元 素 与 元 素 之 间 的 匹 配 条 件 进 行 检 查, 即 按 照 标 量 的 要 求 来 进 行 匹 配 检 查 这 可 以 说 是 一 个 完 整 的 TKR 模 式 匹 配 的 检 查 过 程 因 此 尽 管 数 组 比 标 量 在 结 构 上 要 复 杂, 但 是 通 过 引 入 哑 形 数 组 的 概 念, 就 大 大 简 化 了 数 组 变 元 的 匹 配 问 题, 我 们 在 实 际 编 程 当 中, 也 应 该 尽 量 运 用 哑 形 哑 元 来 进 行 变 元 关 联 哑 形 数 组 是 FORTRAN 新 近 引 入 的 概 念, 在 FORTRAN 的 老 版 本 里 面, 数 组 变 元 的 匹 配 问 题 就 显 得 要 复 杂 得 多 一 方 面 由 于 存 在 丰 富 的 老 版 本 FORTRAN 源 码 值 得 我 们 加 以 利 用, 另 一 方 面 由 于 数 组 变 元 的 老 式 的 通 过 数 组 元 素 序 列 建 立 的 关 联 具 有 特 别 的 功 能, 所 以 下 面 我 们 分 别 详 细 说 明 这 种 数 组 变 元 关 联 方 式, 以 及 数 组 元 素 序 列 关 联 在 存 储 层 面 的 有 关 内 容 另 外 由 于 结 构 与 数 组 的 相 似 形, 最 后 也 将 说 明 结 构 对 象 的 关 联 方 式 1. 数 组 元 素 序 列 关 联 如 果 按 照 元 素 序 列 关 联 的 观 点 来 建 立 数 组 变 元 之 间 的 关 联, 那 么 在 哑 元 为 显 形 数 组 或 哑 形 数 组 的 情 形 下, 就 不 需 要 要 求 哑 元 的 秩 和 与 之 相 关 联 的 实 元 的 秩 一 样 了 所 谓 建 立 数 组 元 素 序 列 (AES) 关 联, 就 是 把 数 组 看 成 是 一 个 由 数 组 元 素 构 成 的 序 列, 这 个 序 列 的 元 素 是 按 照 数 组 元 素 序 进 行 排 列 的, 而 所 谓 数 组 元 素 序 在 第 6 章 已 经 给 出 定 义, 扼 要 地 说, 就 是 在 该 序 列 里 面, 从 左 往 右 看, 第 一 个 下 标 变 化 最 快, 而 第 二 个 下 标 次 之, 顺 次 类 推, 最 后 一 个 下 标 的 变 化 最 慢 这 样 就 把 数 组 元 素 排 成 了 一 个 1 维 的 线 性 序 列 把 哑 元 和 实 元 都 变 换 成 序 列 之 后, 它 们 之 间 的 所 谓 序 列 关 联 的 机 制 与 非 默 认 字 符 型 数 据 的 字 符 串 的 关 联 方 式 (13.7.1) 类 似, 即 从 两 个 变 元 的 左 边 第 一 个 元 素 开 始, 按 照 序 列 的 顺 序 进 行 元 素 与 元 素 之 间 的 关 联 匹 配 与 字 符 串 匹 配 类 似 的 是, 实 元 的 序 列 长 度 不 能 小 于 哑 元 的 序 列 长 度, 而 可 以 大 于 哑 元 的 长 度 在 这 种 情 况 下, 需 要 采 取 截 断 方 式, 来 保 证 元 素 的 一 一 对 应 的 关 联, 截 断 的 规 则 是 从 最 左 端 开 始 对 齐, 按 照 元 素 序 进 行 序 列 关 联, 一 直 到 哑 元 序 列 结 束 的 地 方, 实 元 所 有 不 能 与 哑 元 元 素 对 应 的 元 素 都 被 截 除 数 组 元 素 序 列 关 联 的 一 般 规 则 如 下 : 如 果 哑 元 为 哑 形 数 组, 那 么 哑 元 的 元 素 组 成 的 序 列 的 长 度 会 是 未 定 的, 一 直 到 该 哑 元 被 某 个 实 元 建 立 关 联, 那 么 该 哑 元 的 元 素 序 列 长 度 就 取 为 实 元 的 元 素 序 列 长 度 如 果 哑 元 的 元 素 为 字 符, 那 么 元 素 逐 一 地 进 行 关 联 的 时 候, 还 存 在 一 个 字 符 串 长 度 匹 配 的 问 题, 这 时 出 现 如 下 两 种 情 形 : 对 于 非 默 认 字 符 型 元 素, 实 元 数 组 元 素 的 字 符 长 度 必 须 和 哑 元 数 组 元 素 的 字 符 长 度, 这 样 实 元 与 哑 元 之 间 的 元 素 之 间 的 一 一 对 应 的 关 联 就 可 以 按 照 上 面 的 规 则 建 立 起 来

236 对 于 默 认 字 符 型 元 素, 任 何 实 元 数 组 元 素 的 字 符 长 度 都 可 以 和 哑 元 数 组 的 字 符 长 度 不 同, 不 过 这 时 不 需 要 在 按 照 元 素 序 的 元 素 之 间 进 行 长 度 的 对 比, 而 是 把 数 组 的 所 有 元 素 都 按 照 元 素 序 串 接 起 来, 这 样 整 个 数 组 构 成 一 个 大 的 字 符 串, 而 每 个 字 符 元 素 都 是 该 字 符 串 的 一 个 子 串, 然 后 把 实 元 与 哑 元 的 两 个 大 的 字 符 串 从 最 左 端 开 始 对 齐, 按 照 字 符 对 字 符 的 方 式, 在 字 符 之 间 建 立 一 一 对 应 的 关 联, 而 不 是 以 元 素 为 单 位 建 立 关 联, 因 为 显 然 按 照 这 种 方 式 建 立 起 来 的 关 联 有 可 能 把 元 素 之 间 的 对 应 关 系 打 乱, 从 而 出 现 一 个 元 素 的 字 符 与 多 个 元 素 的 字 符 具 有 关 联 关 系 的 情 形 这 时, 实 元 与 哑 元 之 间 的 长 度 匹 配 规 则 是 整 个 实 元 数 组 元 素 组 成 的 字 符 串 的 字 符 数 目, 不 能 少 于 整 个 哑 元 数 组 元 素 组 成 的 字 符 串 的 字 符 数 目 而 实 元 比 哑 元 在 右 端 多 出 来 的 字 符 全 部 被 截 断 按 照 上 面 的 数 组 元 素 序 列 关 联 规 则, 实 元 数 组 与 哑 元 数 组 的 秩 是 可 以 不 同 的, 但 是 由 于 实 元 和 哑 元 在 进 行 序 列 关 联 时, 总 是 要 求 实 元 数 组 元 素 序 列 大 于 或 等 于 哑 元 数 组 元 素 序 列, 因 此 有 如 下 两 个 特 殊 情 况 需 要 注 意 : 如 果 哑 元 是 标 量, 即 秩 为 0 的 数 组, 那 么 实 元 可 以 具 有 任 意 的 非 0 秩, 这 时 相 当 于 把 逐 元 过 程 应 用 于 数 组 对 象 如 果 哑 元 是 数 组, 那 么 只 有 在 哑 元 为 显 形 或 哑 形 数 组, 并 且 实 元 只 有 在 是 一 个 单 独 的 数 组 元 素 或 元 素 的 子 串 的 情 况 下, 才 能 建 立 元 素 序 列 关 联 构 成 序 列 关 联 的 数 组 元 素 必 须 都 是 实 元 哑 形 数 组 或 指 针 数 组 的 元 素 不 能 与 哑 元 元 素 建 立 关 联 对 于 默 认 字 符 型 变 元, 实 元 甚 至 可 以 是 数 组 元 素 的 子 串, 而 该 子 串 不 能 是 来 自 哑 形 数 组 或 指 针 数 组 的 元 素 至 此, 我 们 可 以 看 到 数 组 变 元 的 关 联 匹 配, 在 不 同 的 情 形 下 可 以 在 三 个 层 次 上 进 行, 即 : 数 组 层 次 ; 数 组 元 素 层 次 ; 元 素 字 符 串 的 字 符 层 次 在 数 组 层 次 上 建 立 关 联, 必 须 要 求 变 元 数 组 的 形 状 一 样, 在 形 状 相 同 的 基 础 上, 就 可 以 进 行 元 素 与 元 素 之 间 的 一 一 对 应 的 关 联 在 数 组 元 素 层 次 上 建 立 关 联, 则 是 把 数 组 看 成 一 个 线 性 序 列, 在 序 列 的 基 础 上 进 行 元 素 与 元 素 之 间 的 一 一 对 应 的 关 联 这 时 要 求 实 元 序 列 的 元 素 不 能 少 于 哑 元 序 列 的 元 素 在 元 素 字 符 串 的 字 符 层 次 上 建 立 关 联, 只 是 针 对 默 认 字 符 型 数 组 元 素 而 言, 因 为 字 符 型 标 量 的 关 联 可 以 建 立 在 字 符 的 层 次 上, 所 以 由 字 符 型 元 素 组 成 的 数 组 可 以 以 字 符 为 单 位 构 成 序 列, 对 这 种 序 列 建 立 关 联, 就 同 样 是 以 字 符 为 单 位, 在 字 符 与 字 符 之 间 建 立 一 一 对 应 的 关 联 这 时 要 求 实 元 序 列 的 字 符 数 目 不 能 小 于 哑 元 序 列 的 字 符 数 目 显 然 序 列 关 联 方 式 远 比 TKR 关 联 方 式 要 繁 复, 而 且 容 易 隐 藏 错 误, 所 以 最 好 的 选 择, 还 是 赋 予 数 组 哑 元 以 哑 形 以 及 哑 长 度 的 属 性, 然 后 以 TKR 关 联 方 式 建 立 数 组 变 元 的 关 联 尽 管 通 过 序 列 关 联 能 够 在 哑 元 与 实 元 的 秩 不 一 样 的 情 形 下 建 立 关 联, 而 这 个 功 能 是 TKR 方 式 所 不 具 有 的, 但 是 实 际 上 我 们 可 以 通 过 调 用 数 组 片 断 来 达 到 同 样 的 效 果 2. 数 组 片 断 的 调 用 在 引 用 过 程 时, 能 够 调 用 数 组 的 片 断 是 数 组 的 一 个 非 常 强 有 力 的 功 能 为 了 实 现 这 个 功 能, 运 用 数 组 元 素 序 列 关 联 显 然 是 不 够 的, 因 为 在 大 多 数 情 况 下, 数 组 片 断 在 数 组 元 素 序 里 面 都 不 是 连 续 的, 这 样 要 引 用 数 组 片 断 就 会 很 麻 烦 相 反 如 果 使 用 哑 形 哑 元 的 概 念, 则 可 以 很 自 然 地 做 到 调 用 数 组 片 断 数 组 片 断 调 用 的 一 般 规 则 如 下 :

237 数 组 片 断 的 引 用 可 以 通 过 以 下 三 种 方 式 来 构 造 : 运 用 下 标 三 元 组 的 数 组 引 用 ; 运 用 向 量 下 标 的 数 组 引 用 ; 非 最 右 端 部 分 为 数 组 值 的 结 构 成 员 引 用 这 样 就 可 以 很 自 然 地 应 用 TKR 模 式 匹 配 来 得 到 正 确 地 引 用 了 数 组 片 断 还 可 以 调 用 为 显 形 哑 元 和 哑 尺 度 哑 元, 这 时 如 果 过 程 的 数 组 变 元 为 隐 式 界 面 的 话, 为 了 与 FORTRAN 早 期 版 本 兼 容, 则 必 须 认 为 其 与 哑 元 的 关 联 为 序 列 关 联, 因 此 这 时 数 组 片 断 的 引 用 就 必 须 使 用 数 组 元 素 序 列 关 联 的 形 式 在 使 用 数 组 片 断 作 为 实 元 的 时 候, 运 用 向 量 下 标 构 造 的 数 组 片 断 不 能 是 可 定 义 的, 也 就 是 说 该 变 元 不 能 在 过 程 运 行 时 赋 予 新 值 同 时 相 应 的 哑 元 不 能 具 有 INTENT(OUT) 或 INTENT(INOUT) 属 性 因 为 在 使 用 向 量 下 标 时, 同 一 个 实 元 数 组 元 素 可 能 是 多 个 数 组 片 断 的 一 部 分, 这 样 就 使 得 该 实 元 数 组 元 素 同 时 与 多 个 哑 元 元 素 相 关 联 因 此 如 果 数 组 片 断 是 可 定 义 的 话, 同 一 个 实 元 数 组 元 素 就 可 能 被 赋 予 相 冲 突 的 不 同 的 值 与 上 面 的 规 则 类 似, 通 过 多 个 变 元 引 入 同 一 个 过 程 的 同 一 个 数 据 对 象 不 能 是 有 定 义 的 例 如 假 设 两 个 数 组 片 断 X(1:10) 和 X(5: 15) 都 是 同 一 个 过 程 的 实 元, 那 么 相 同 的 元 素 X(5: 10) 就 通 过 两 个 实 元 被 引 入 了 该 过 程, 这 时 在 该 过 程 里 面, 这 些 元 素 都 不 能 获 得 定 义 这 个 限 制 对 于 任 意 数 据 对 象 都 是 成 立 的, 再 例 如 X 是 一 个 标 量, 那 么 X 可 以 多 次 出 现 在 实 元 列 表 当 中, 但 这 样 一 来 X 就 不 能 作 为 引 用 的 结 果 而 得 到 定 义 如 果 哑 元 是 哑 形 的, 那 么 相 应 的 实 元 就 不 能 是 哑 尺 度 数 组 因 为 哑 形 哑 元 自 身 不 具 有 一 个 完 整 的 数 组 结 构 方 面 的 信 息, 它 必 须 从 与 实 元 的 关 联 当 中 来 获 得 形 状 信 息, 而 如 果 实 元 本 身 也 是 哑 尺 度 的 话, 那 么 就 得 不 到 完 整 的 形 状 信 息 不 过, 一 个 哑 尺 度 数 组 的 片 断 则 是 有 可 能 作 为 一 个 实 元 的, 因 为 该 片 断 的 形 状 信 息 可 以 是 完 整 的 如 果 在 一 个 过 程 里 面 通 过 变 元 关 联 来 引 入 数 据 对 象, 那 么 该 数 据 对 象 在 本 过 程 里 面 只 能 作 为 哑 元 被 定 义 与 被 引 用 例 如 下 例 里 面 的 变 元 X 在 子 例 行 程 序 里 面 获 得 赋 值 就 是 非 法 的 例 CALL SUBROUTINE1(X) CONTAINS SUBROUTINE SUBROUTINE1(A) A = 1000 如 果 哑 元 是 一 个 具 有 指 针 属 性 的 数 组, 那 么 实 元 也 必 须 具 有 指 针 属 性 对 于 一 个 类 过 程, 或 自 定 义 运 算, 或 自 定 义 赋 值 的 引 用,TKR 模 式 匹 配 规 则 必 须 应 用 到 它 的 所 有 变 元 与 算 元, 除 非 该 引 用 为 逐 元 引 用 因 此 在 任 何 情 形 下, 一 个 数 组 元 素 都 不 能 被 传 递 给 一 个 数 组 哑 元 例 如, 如 果 函 数 SQUIRT 被 作 为 一 个 类 过 程 名 称 引 用, 那 么 SQUIRT(X(10)) 的 实 元 为 标 量, 而 相 应 的 哑 元 也 必 须 是 标 量, 而 如 果 一 个 类 过 程 既 允 许 使 用 标 量 哑 元, 也 允 许 使 用 数 组 哑 元, 那 么 就 选 择 使 用 标 量 哑 元 的 相 应 种 过 程 如 果 一 个 固 有 过 程 的 实 元 是 一 个 数 组 元 素, 那 么 数 组 就 不 能 被 传 递 到 该 固 有 过 程, 而 只 有 数 组 元 素 才 能 够 传 递 到 该 固 有 过 程

238 3. 结 构 的 序 列 关 联 由 于 结 构 与 数 组 类 似, 因 此 结 构 变 元 之 间 也 可 以 建 立 按 照 成 员 顺 序 排 列 的 序 列 关 联 的 关 系 如 果 一 个 结 构 是 一 个 外 部 过 程 的 哑 元, 那 么 该 结 构 的 派 生 类 型 必 须 予 以 说 明, 使 得 它 具 有 与 相 应 实 元 的 完 全 相 同 的 派 生 类 型 要 实 现 这 个 结 构 的 匹 配 要 求, 最 好 的 方 式 是 把 派 生 类 型 的 定 义 放 在 一 个 模 块 里 面, 使 得 外 部 过 程 和 引 用 该 派 生 类 型 结 构 的 程 序 单 位 都 可 以 通 过 使 用 关 联 来 访 问 该 模 块, 从 而 获 得 该 结 构 的 类 型 定 义 此 外, 一 个 比 较 容 易 出 错 的 实 现 方 式 是 建 立 结 构 之 间 的 序 列 关 联, 这 种 方 式 使 得 编 译 器 很 难 查 错, 因 此 应 该 尽 量 避 免 使 用 具 有 序 列 关 联 关 系 的 实 元 结 构 与 哑 元 结 构 的 派 生 类 型 不 需 要 是 完 全 相 同 的, 但 必 须 是 等 价 的, 所 谓 两 个 派 生 类 型 数 据 对 象 的 等 价, 是 指 它 们 具 有 相 同 的 类 型 名 称, 相 同 的 序 列 类 型, 按 照 顺 序 排 列 的 成 员 的 名 称 与 属 性 都 相 同, 并 且 都 不 能 包 含 私 有 成 员 如 果 通 过 序 列 关 联 来 引 用 结 构, 那 么 该 关 联 的 存 储 模 式 由 编 译 器 来 设 置 由 于 结 构 的 序 列 关 联 要 求 成 员 的 名 称, 数 目, 顺 序 和 属 性 都 相 同, 因 此 引 用 程 序 单 位 和 被 引 用 程 序 单 位 都 可 以 为 相 关 联 的 结 构 设 置 兼 容 的 存 储 模 式, 从 而 在 过 程 与 引 用 程 序 单 位 之 间 进 行 正 确 的 通 讯 指 针 的 匹 配 所 谓 指 针 本 质 上 就 是 变 元 之 间 建 立 关 联 的 一 种 形 式 任 何 一 个 数 据 对 象 都 可 以 或 者 具 有 POINTER 属 性, 或 者 具 有 TARGET 属 性, 或 者 这 两 种 属 性 都 不 具 有, 但 不 能 同 时 具 有 这 两 种 属 性 这 样 作 为 哑 元 的 数 据 对 象 和 作 为 实 元 的 数 据 对 象 就 分 别 具 有 三 种 情 形, 它 们 的 组 合 则 一 共 有 九 种 情 形, 下 面 的 表 13-1 列 出 了 全 部 的 可 能 性 表 13-1 指 针 关 联 的 组 合 情 形 实 元 哑 元 POINTER 属 性 TARGET 属 性 都 不 具 有 的 情 形 POINTER 属 性 A TKR 不 允 许 出 现 的 情 形 不 允 许 出 现 的 情 形 TARGET 属 性 都 不 具 有 的 情 形 F, 与 B 相 同 B C TKR 或 AES TKR 或 AES TKR 或 AES G, 与 D 相 同 D E TKR 或 AES TKR 或 AES TKR 或 AES 其 中 包 含 两 个 不 允 许 出 现 的 情 形, 即 哑 元 具 有 POINTER 属 性, 而 相 应 的 实 元 或 者 具 有 TARGET 属 性, 或 这 两 种 属 性 都 不 具 有 还 包 括 两 个 重 复 的 情 形, 因 此 还 剩 下 5 种 情 形 需 要 讨 论 对 于 情 形 E, 实 元 与 哑 元 都 不 具 有 POINTER 属 性 与 TARGET 属 性, 因 此 属 于 前 面 讨 论 的 一 般 变 元 关 联 的 情 形 对 于 情 形 B,C,D, 它 们 的 实 元 和 哑 元 都 至 少 有 一 个 具 有 TARGET 属 性, 或 者 是 都 具 有 TARGET 属 性, 而 没 有 POINTER 属 性, 这 时 与 情 形 E 是 非 常 类 似 的, 它 们 都 可 以 通 过 TKR 模 式 匹 配 或 序 列 关 联 模 式 来 进 行 关 联 匹 配, 因 此 也 就 遵 循 相 应 的 匹 配 规 则 在 情 形 B,C,D 里 面 至 少 有 一 个 变 元 具 有 TARGET 属 性, 这 意 味 着 可 以 存 在 指 针 是 以 它 们 为 目 标 的, 这 里 存 在 如 下 两 种 类 型 : 在 情 形 B 和 D 里 面, 实 元 都 具 有 TARGET 属 性, 因 此 在 引 用 程 序 单 位 里 面 就 可 以 存 在 指 针 以 该 实 元 为 目 标

239 在 情 形 B 和 C 里 面, 哑 元 都 具 有 TARGET 属 性, 因 此 在 过 程 的 执 行 的 时 候, 过 程 里 面 局 部 的 指 针 或 可 访 问 指 针, 或 具 有 指 针 属 性 的 其 他 哑 元, 都 可 以 以 该 哑 元 为 目 标 一 旦 建 立 了 变 元 关 联 关 系, 任 何 与 具 有 TARGET 属 性 的 实 元 相 关 联 的 指 针 就 一 直 保 持 与 该 数 据 对 象 相 关 联 的 PO INTER 属 性 如 果 相 应 哑 元 是 哑 形 数 组 或 标 量, 则 成 为 与 该 哑 元 相 关 联 的 指 针 ; 如 果 相 应 哑 元 是 显 形 数 组 或 哑 尺 度 数 组, 则 是 否 与 指 针 建 立 关 联 由 编 译 系 统 决 定 在 引 用 之 前 与 实 元 建 立 了 关 联 的 指 针 将 保 持 指 针 关 联 关 系, 一 直 到 过 程 运 行 完 毕, 并 且 实 元 与 哑 元 的 关 联 关 系 被 解 除 为 止 对 于 情 形 B 和 C, 在 哑 元 目 标 与 引 用 程 序 单 位 可 访 问 指 针 之 间 建 立 的 指 针 关 联 关 系 一 直 到 被 引 用 程 序 运 行 完 毕 才 被 解 除 如 果 一 个 引 用 程 序 调 用 了 具 有 相 同 TKR 模 式 的 一 个 指 针 和 一 个 目 标 来 作 为 两 个 不 同 的 实 元, 那 么 被 引 用 程 序 单 位 可 以 在 引 用 程 序 作 用 域 范 围 内, 建 立 或 解 除 此 两 者 的 指 针 关 联 关 系 情 形 A 表 明 实 元 与 哑 元 都 可 以 具 有 POINTER 属 性 当 哑 元 为 指 针 的 时 候, 那 么 在 引 用 程 序 里 面 过 程 界 面 必 须 是 显 式 的, 而 相 应 的 实 元 也 必 须 是 具 有 POINTER 属 性 情 形 A 所 遵 循 的 规 则 如 下 : 适 用 于 TKR 模 式 的 匹 配 规 则 建 立 变 元 关 联 之 后, 哑 元 必 须 和 实 元 具 有 相 同 的 指 针 关 联 状 态, 而 如 果 实 元 与 一 个 目 标 建 立 了 指 针 关 联, 那 么 哑 元 也 必 须 与 同 一 个 目 标 建 立 指 针 关 联 关 系 在 过 程 执 行 的 时 候, 哑 元 的 指 针 关 联 状 态 可 以 发 生 变 化, 而 任 何 的 这 种 变 化 都 导 致 实 元 的 指 针 关 联 状 态 的 相 应 变 化 情 形 F 和 G 的 实 元 都 是 指 针, 而 哑 元 都 不 是 指 针 在 这 两 种 情 形 下, 实 元 都 必 须 与 一 个 目 标 相 关 联, 而 正 是 这 个 目 标 与 哑 元 具 有 变 元 关 联 关 系, 因 此 这 两 种 情 形 分 别 与 情 形 B 和 D 等 价 从 效 果 上 来 讲, 当 实 元 具 有 POINTER 属 性, 而 哑 元 不 具 有 POINTER 属 性 的 时 候, 实 际 上 可 以 看 成 是 一 个 指 针 引 用, 也 就 是 引 用 到 一 个 目 标 数 据 对 象 至 于 表 中 不 允 许 出 现 的 情 形 都 是 非 法 的, 因 为 实 元 与 哑 元 的 指 针 运 算 有 冲 突 在 情 形 D, 过 程 界 面 在 引 用 程 序 单 位 里 面 可 以 是, 也 可 以 不 是 显 式 的, 而 在 情 形 A,B 和 C 则 过 程 界 面 必 须 是 显 式 的 因 此 引 用 程 序 单 位 可 以 把 具 有 目 标 关 联 的 指 针 传 递 给 具 有 隐 式 界 面 的 外 部 过 程 运 用 变 元 关 键 词 建 立 关 联 在 实 元 与 哑 元 之 间 建 立 关 联 的 基 本 方 式 就 是 变 元 列 表 的 依 据 位 置 的 配 对 不 过 在 某 些 情 形 下, 为 了 更 加 灵 活 地 建 立 变 元 关 联, 还 需 要 有 不 依 赖 于 位 置 的 配 对 方 式, 因 此 FORTRAN 引 入 了 通 过 关 键 词 来 指 定 关 联 的 方 式 所 谓 关 键 词 就 是 在 实 元 列 表 当 中 引 用 的 哑 元 的 名 称, 该 哑 元 被 直 接 地 显 式 说 明 与 其 关 联 的 实 元 这 种 说 明 变 元 关 联 的 形 式 为 : dummy-argument-name = actual-argument 即 直 接 使 用 等 号 来 表 示 哑 元 名 称 与 实 元 的 关 联 例 CALL SUBBATA(X,Y,Z,CORE=30,SHELL=PI**2) CALL UNIT(A,B,MINI=0.23)

240 运 用 变 元 关 键 词 建 立 关 联 的 一 般 规 则 如 下 : 这 种 直 接 的 表 示 方 法 可 以 应 用 于 任 意 的 实 元, 而 且 由 于 这 种 方 式 已 经 不 需 要 依 赖 变 元 的 列 表 位 置, 所 以 在 实 元 列 表 当 中 使 用 这 种 方 式 的 实 元 可 以 用 任 意 的 顺 序 这 种 方 式 还 可 以 与 依 赖 位 置 的 配 对 方 式 混 合 使 用, 这 时 为 了 便 于 分 辨 通 过 位 置 配 对 的 实 元, 约 定 使 用 关 键 词 表 示 方 法 的 实 元 必 须 集 中 在 实 元 列 表 的 右 端, 使 用 位 置 配 对 方 式 的 实 元 则 必 须 集 中 在 实 元 列 表 的 左 端, 因 此 只 要 在 实 元 列 表 里 面 出 现 了 一 个 关 键 词, 那 么 该 关 键 词 后 面 的 所 有 实 元 都 必 须 使 用 关 键 词 在 两 种 方 式 混 用 时, 必 须 注 意 在 一 次 引 用 当 中, 同 一 个 哑 元 不 能 使 用 不 同 的 方 式 进 行 关 联, 因 为 要 保 证 每 个 哑 元 至 多 只 能 与 一 个 实 元 关 联 使 用 关 键 词 方 式 的 最 大 好 处 就 是 不 需 要 记 忆 哑 元 列 表 的 顺 序, 因 此 不 容 易 出 错 如 果 出 现 在 变 元 列 表 当 中 某 个 非 列 表 最 右 端 的 可 选 变 元 被 省 略 了 的 情 形, 则 只 有 使 用 关 键 词 方 式 才 能 恰 当 表 示 变 元 关 联 如 果 在 过 程 的 实 元 列 表 当 中 使 用 了 关 键 词, 那 么 在 包 含 该 引 用 的 程 序 单 位 的 作 用 域 当 中, 过 程 的 界 面 必 须 是 显 式 的 由 于 固 有 过 程, 内 部 过 程, 和 模 块 过 程 的 界 面 都 是 显 式 的, 因 此 在 这 些 过 程 里 面 都 可 以 使 用 关 键 词 引 用 方 式 而 对 于 外 部 过 程 来 说, 要 使 用 关 键 词 方 式, 则 需 要 在 引 用 程 序 当 中 给 出 界 面 块, 这 时 关 键 词 可 以 与 过 程 定 义 里 面 的 哑 元 名 称 不 一 样, 这 是 自 动 具 有 显 式 界 面 的 固 有 过 程, 内 部 过 程, 和 模 块 过 程 所 不 具 有 的 功 能, 因 此 也 是 外 部 过 程 引 用 的 一 个 特 点 哑 元 的 OPTIONAL 属 性 一 个 具 有 OPTIONAL 属 性 的 哑 元 意 味 着 该 哑 元 在 某 个 特 定 的 过 程 引 用 当 中, 不 需 要 获 得 实 元 的 关 联 任 何 过 程 的 任 何 哑 元 原 则 上 都 可 以 被 赋 予 OPTIONAL 的 属 性, 也 就 是 说 没 有 哪 个 哑 元 是 注 定 了 要 在 一 切 引 用 当 中 都 需 要 获 得 实 元 关 联 的 赋 予 一 个 哑 元 以 OPTIONAL 属 性 的 方 式 有 两 种, 即 在 过 程 定 义 当 中 使 用 OPTIONAL 语 句, 或 在 面 向 对 象 的 声 明 语 句 当 中 使 用 OPTIONAL 属 性 说 明 具 体 说 明 参 见 第 7 章 在 一 个 使 用 了 位 置 方 式 表 示 变 元 关 联 的 变 元 列 表 当 中, 如 果 可 选 变 元 是 处 于 列 表 的 最 右 端, 那 么 在 引 用 时 就 可 以 直 接 省 略, 因 为 其 被 省 略 并 不 影 响 其 他 非 可 选 变 元 的 位 置 变 化 而 如 果 该 可 选 变 元 不 是 处 于 列 表 的 最 右 端, 那 么 要 省 略 它, 在 引 用 时 就 必 须 使 用 关 键 词 方 式, 除 非 该 可 选 变 元 的 右 边 的 所 有 变 元 都 可 以 被 省 略, 因 此 一 个 具 有 可 选 变 元 的 过 程 要 求 该 过 程 具 有 显 式 的 过 程 界 面 下 面 是 一 个 例 子 例 CALL UNIT(0.85,X=FUN1(I)) SUBROUTINE UNIT(A,B,X,Y) OPTIONAL B,X,Y END SUBROUTINE UNIT 对 于 过 程 的 可 选 变 元 来 说, 由 于 它 在 不 同 的 引 用 环 境 里 面, 常 常 可 能 是 被 省 略 了, 或 获 得 了 实 元 的 关 联, 因 此 在 一 个 特 定 的 引 用 当 中, 需 要 在 运 行 过 程 的 时 候, 检 查 该 过 程 引 用 的 可 选 哑 元 是 否 获 得 实 元 的 关 联, 即 与 该 哑 元 相 关 联 的 实 元 是 否 实 际 存 在, 实 现 这 个 检 查 功 能 的 固 有 函 数 即

241 PRESENT 该 固 有 函 数 包 含 一 个 变 元, 即 需 要 检 查 的 过 程 的 可 选 变 元 的 名 称 通 过 运 行 这 个 固 有 函 数, 返 回 一 个 默 认 逻 辑 值, 从 而 可 以 确 定 被 检 查 的 可 选 哑 元 是 否 究 竟 在 该 过 程 引 用 当 中 获 得 了 实 元 的 关 联 下 面 是 使 用 该 固 有 函 数 的 一 个 例 子 例 IF(PRESENT(A)) THEN! 运 行 条 件 就 是 哑 元 A 具 有 关 联 实 元 FUN1=FUN2(A)**2 ELSE! 运 行 条 件 就 是 哑 元 A 不 具 有 关 联 实 元 FUN1=FUN2(B)**2 END IF 在 这 个 例 子 里 面,PRESENT 被 用 来 作 为 条 件 控 制 的 条 件 表 达 式 当 一 个 可 选 哑 元 不 出 现 的 时 候, 有 以 下 规 则, 这 里 的 不 出 现 的 实 际 含 义 就 是 说 该 可 选 哑 元 不 具 有 关 联 实 元 需 要 注 意 如 下 几 点 : 没 有 出 现 的 哑 元 不 能 获 得 引 用 没 有 出 现 的 哑 过 程 不 能 获 得 调 用 没 有 出 现 的 哑 元 不 能 又 作 为 一 个 与 非 可 选 哑 元 关 联 的 实 元 出 现, 除 非 是 被 固 有 函 数 PRESENT 引 用 没 有 出 现 的 哑 元 可 以 作 为 一 个 与 可 选 哑 元 关 联 的 实 元 出 现, 这 时 后 面 的 可 选 哑 元 不 能 出 现 一 个 不 出 现 的 指 针 哑 元 可 以 被 调 用 为 一 个 实 元, 但 是 该 实 元 必 须 与 一 个 同 样 是 指 针 的 哑 元 相 关 联, 除 非 该 指 针 哑 元 是 被 固 有 函 数 PRESENT 引 用 哑 元 的 INTENT 属 性 除 了 哑 过 程, 哑 指 针 之 外 的 任 意 哑 元, 都 可 以 赋 予 INTENT 属 性 而 且 只 有 哑 元 可 以 赋 予 INTENT 属 性 具 有 一 定 的 INTENT 属 性 的 哑 元 表 示 该 哑 元 在 过 程 里 面 的 特 定 的 使 用 方 式, 那 么 编 译 器 就 可 以 依 据 该 属 性 来 检 查 是 否 出 现 违 背 这 种 特 定 使 用 方 式 的 情 形 出 现 INTENT 属 性 用 来 说 明 3 种 不 同 的 变 元 使 用 方 式, 它 们 的 不 同 形 式 与 具 体 含 义 如 下 : INTENT(IN) 这 个 属 性 用 来 表 示 该 哑 元 只 能 用 来 给 过 程 输 入 数 据, 而 不 能 用 来 给 引 用 程 序 返 回 过 程 的 结 果, 并 且 在 过 程 的 运 行 过 程 当 中, 该 属 性 不 能 改 变, 如 果 试 图 改 变 哑 元 的 这 个 属 性, 将 被 视 为 出 错 INTENT(OUT) 与 INTENT(IN) 的 含 义 相 反, 这 个 属 性 用 来 表 示 该 哑 元 只 能 用 来 给 引 用 程 序 返 回 过 程 的 结 果, 而 不 能 用 来 给 过 程 输 入 数 据 具 有 INTENT(OUT) 属 性 的 哑 元 在 过 程 里 面 获 得 定 义 之 前, 不 能 被 引 用 与 具 有 INTENT(OUT) 属 性 的 哑 元 关 联 的 实 元 必 须 是 一 个 可 定 义 的 数 据 对 象, 即 一 个 变 量 INTENT(INOUT) 具 有 INTENT(INOUT) 属 性 表 示 变 元 在 进 入 过 程 时 定 义 了 值, 并 且 在 过 程 运 行 过 程 当 中 随 时 可 以 改 变 取 值 这 样 如 果 要 求 一 个 变 元 在 过 程 里 面 能 够 随 时 被 过 程 更 新 取 值, 就 必 须 赋 予 其 INTENT(INOUT) 的 属 性 与 具 有 INTENT(INOUT) 属 性 的 哑 元 相 关 联 的 实 元 必 须 是 一 个 可 定 义 的

242 数 据 对 象, 即 一 个 变 量 注 意 取 值 为 向 量 值 下 标 的 数 组 片 断 的 实 元, 不 能 与 具 有 INTENT(OUT) 或 INTENT(INOUT) 属 性 的 哑 元 相 关 联, 因 为 它 的 取 值 是 不 可 变 的 赋 予 哑 元 INTENT 属 性 并 不 要 求 过 程 具 有 显 式 界 面, 因 为 这 个 属 性 只 是 规 定 变 元 在 过 程 内 部 的 用 法 不 过 如 果 在 过 程 的 界 面 里 面 显 式 地 给 出 哑 元 的 INTENT(OUT) 或 INTENT (INOUT) 属 性, 那 么 就 可 以 防 止 该 哑 元 被 不 可 定 义 的 数 据 对 象 关 联 逐 元 过 程 引 用 当 中 的 变 元 关 联 FORTRAN 引 入 逐 元 过 程 这 个 概 念 的 基 本 目 的, 就 是 要 使 得 以 标 量 为 变 元 的 过 程 能 够 具 有 并 行 计 算 的 能 力, 也 就 是 能 够 作 用 于 数 组 这 时, 由 于 引 用 过 程 存 在 一 个 变 元 关 联 的 匹 配 问 题, 即 过 程 的 标 量 哑 元 如 何 能 够 与 数 组 实 元 匹 配 呢? 解 决 的 方 式 就 是 引 入 逐 元 过 程 的 概 念, 来 扩 展 变 元 匹 配 的 要 求 即 凡 是 逐 元 过 程, 都 可 以 以 标 量 哑 元 和 数 组 实 元 建 立 关 联 关 系 而 以 标 量 作 为 变 元 的 逐 元 过 程 的 结 果 必 定 也 是 标 量, 那 么 当 逐 元 过 程 的 变 元 与 数 组 实 元 建 立 关 联 之 后, 该 逐 元 过 程 的 结 果 如 何 决 定 呢? 基 本 的 约 定 就 是 把 该 逐 元 过 程 分 别 作 用 于 实 元 数 组 的 每 个 标 量 元 素, 从 而 得 到 相 应 的 结 果 标 量, 并 返 回 给 引 用 该 过 程 的 程 序 单 位, 然 后 所 有 这 些 结 果 标 量 构 成 一 个 集 合, 显 然 这 个 集 合 是 一 个 具 有 与 实 元 数 组 相 同 形 状 的 数 组, 那 么 就 可 以 把 该 数 组 看 成 是 逐 元 过 程 作 用 于 数 组 实 元 的 结 果 因 此 逐 元 过 程 名 称 的 由 来 就 是 对 数 组 实 元 的 元 素 的 逐 个 的 作 用, 至 于 对 于 实 元 数 组 的 元 素 的 作 用 顺 序 则 不 予 规 定, 而 这 点 正 好 在 语 言 层 次 上 赋 予 了 系 统 进 行 并 行 计 算 的 能 力 逐 元 过 程 可 以 具 有 2 个 以 及 2 个 以 上 的 变 元, 因 为 标 量 可 以 与 任 意 形 状 的 数 组 匹 配, 所 以 一 个 逐 元 引 用 当 中 的 实 元 列 表 可 以 是 任 意 的 数 组 变 元 与 标 量 变 元 的 组 合 实 际 上 很 多 的 固 有 逐 元 函 数 都 包 含 了 作 为 标 量 的 KIND 哑 元, 它 的 作 用 在 于 规 定 相 应 实 元 的 种 别 参 数 值 一 个 标 量 在 一 个 逐 元 引 用 当 中 用 作 实 元 的 效 果, 等 价 于 该 标 量 被 扩 充 为 具 有 相 同 元 素 的 与 数 组 变 元 具 有 相 同 形 状 的 数 组 所 有 的 逐 元 固 有 过 程 的 详 细 说 明 参 见 附 录 B 类 过 程 引 用 当 中 的 变 元 关 联 所 谓 类 过 程, 就 是 同 一 个 过 程 名 称 表 示 了 2 个 或 多 于 2 个 的 不 同 过 程, 当 然 这 些 具 有 相 同 名 称 的 过 程 属 于 同 一 个 计 算 过 程, 只 是 它 们 的 变 元 具 有 类 型 参 数 方 面 的 差 异 由 于 引 用 的 实 质 是 依 赖 过 程 名 称 而 进 行 的, 那 么 在 引 用 类 过 程 名 称 的 时 候, 如 何 具 体 选 择 某 个 种 过 程 呢? 显 然 只 有 依 靠 能 够 对 它 们 进 行 区 分 的 信 息, 而 它 们 的 区 别 只 是 在 于 变 元 的 TKR 模 式 里 面 的 各 种 参 数 值, 因 此 实 元 的 TKR 模 式 序 列 就 可 以 提 供 足 够 的 用 来 选 择 种 过 程 的 信 息 这 样 在 引 用 这 种 类 过 程 的 时 候, 除 了 名 称 之 外, 还 需 要 给 出 实 元 的 TKR 模 式 序 列, 就 能 够 选 择 出 唯 一 的 与 具 有 给 定 实 元 的 TKR 模 式 序 列 相 匹 配 的 哑 元 列 表 的 种 过 程 例 如 下 的 3 种 形 式 的 固 有 函 数 SIN 的 引 用 就 分 别 代 表 了 SIN 的 3 个 种 过 程 形 式 : SIN(9.9) SIN((0.1,6.4)) SIN(9D+10) 为 了 使 得 能 够 通 过 利 用 实 元 的 TKR 模 式 序 列 来 唯 一 地 选 择 类 过 程 集 合 里 面 的 某 个 种 过 程, 在 一 个 类 过 程 集 合 里 面 的 任 何 两 个 种 过 程 的 哑 元 列 表 必 须 符 合 一 定 的 要 求 这 个 要 求 就 是 这 两 个

243 任 意 的 哑 元 列 表 必 须 在 其 中 的 一 个 列 表 当 中 包 含 一 个 非 可 选 哑 元, 该 非 可 选 哑 元 满 足 以 下 两 个 条 件 之 一 : 如 果 把 两 个 哑 元 列 表 进 行 位 置 对 应, 那 么 该 哑 元 不 存 在 与 之 对 应 的 哑 元 ; 或 者 存 在 与 之 对 应 的 哑 元, 但 两 个 哑 元 的 TKR 模 式 不 同 该 哑 元 的 名 称 与 另 外 的 哑 元 列 表 里 面 的 所 有 哑 元 名 称 都 不 相 同 ; 或 者 存 在 相 同 名 称 的 哑 元, 但 它 们 的 TKR 模 式 不 同 前 一 个 条 件 是 针 对 按 照 位 置 匹 配 变 元 的 方 式 而 言, 后 一 个 条 件 则 是 针 对 关 键 词 匹 配 变 元 的 的 方 式 而 言 一 个 逐 元 过 程 也 可 能 具 有 一 个 类 过 程 名 称, 而 共 享 该 类 过 程 名 称 的 其 他 某 个 种 过 程 可 能 不 是 逐 元 的, 那 么 在 引 用 这 样 一 个 逐 元 过 程 的 时 候, 就 可 能 与 对 那 个 非 逐 元 种 过 程 的 引 用 无 法 区 分 开, 这 时 的 约 定 是 引 用 那 个 非 逐 元 种 过 程, 而 如 果 该 类 过 程 集 合 里 面 不 存 在 这 样 的 非 逐 元 过 程, 那 么 就 引 用 该 逐 元 种 过 程 例 INTERFACE SUB1 ELEMENTAL SUBROUTINE SUB2(X) REAL X END SUBROUTINE SUBROUTINE SUB3(Z) REAL Z(:) END SUBROUTINE END INTERFACE REAL A(99), B(25,50) CALL SUB1(A)! 引 用 了 SUB2 CALL SUB1(B)! 引 用 了 SUB3 由 于 在 引 用 类 过 程 时, 涉 及 到 实 元 列 表 与 哑 元 列 表 的 匹 配, 所 以 在 引 用 所 处 的 作 用 域 单 位 里 面, 类 过 程 集 合 里 面 的 过 程 的 界 面 都 必 须 是 显 式 的, 有 关 过 程 界 面 的 描 述 参 见 下 面 的 13.8 节 两 种 非 数 据 对 象 的 过 程 变 元 的 关 联 : 替 代 返 回 变 元 与 哑 过 程 过 程 的 变 元 除 了 是 数 据 对 象 之 外, 还 可 以 是 两 种 非 数 据 对 象 之 一, 即 替 代 返 回 变 元 与 哑 过 程 下 面 分 别 说 明 它 们 的 关 联 表 达 形 式 所 谓 替 代 返 回 是 子 例 行 程 序 当 中 的 一 种 非 正 常 的 返 回 ( 或 者 说 退 出 ), 它 只 能 在 子 例 行 程 序 里 面 使 用, 由 于 它 的 功 能 完 全 可 以 通 过 RETURN 语 句 的 方 式 获 得, 因 此 它 属 于 过 时 的 语 言 成 分, 不 提 倡 使 用 它, 但 还 是 需 要 了 解, 以 便 于 阅 读 过 去 的 FORTRAN 代 码 在 一 个 子 例 行 程 序 的 变 元 列 表 当 中 可 以 使 用 多 个 替 代 返 回, 而 且 它 们 在 列 表 当 中 的 位 置 也 可 以 是 任 意 的 在 哑 元 列 表 当 中, 直 接 使 用 星 号 表 示 替 代 返 回 变 元, 作 为 替 代 返 回 的 哑 元 不 能 是 可 选 的, 而 相 关 联 的 实 元 也 不 能 具 有 关 键 词 与 替 代 返 回 哑 元 相 关 联 的 实 元 必 须 使 用 一 个 星 号 后 接 一 个 语 句 标 签 来 表 示, 该 语 句 标 签 即 在 引 用 程 序 单 位 所 属 的 作 用 域 单 位 里 面 的 返 回 分 支 目 标 语 句 的 标 签 例 下 面 例 子 给 出 了 一 个 包 含 替 代 返 回 的 子 例 行 程 序 以 及 对 它 的 引 用 SUBROUTINE SUB1(X,Y,*,Z,*)

244 . END SUBROUTINE SUB1 CALLSUB1(A,B,*99,C,*999) 运 用 RETURN 语 句 完 全 可 以 获 得 同 样 的 功 能, 这 里 RETURN 语 句 的 形 式 为 : RETURN scalar-integer-expression 其 中 的 整 型 标 量 表 达 式 (scalar-integer-expression) 的 取 值 为 从 1 到 哑 元 列 表 当 中 的 星 号 的 个 数 n, 表 示 子 例 行 程 序 运 行 到 该 RETURN 语 句 时, 应 该 返 回 到 该 数 字 k 所 指 示 的 实 元 列 表 当 中 第 k 个 星 号 后 接 标 签 所 表 示 的 语 句 继 续 使 用 上 面 的 例 子, 就 是 : RETURN 1 RETURN (2) RETURN! 返 回 到 引 用 程 序 的 标 签 为 99 的 语 句! 返 回 到 引 用 程 序 的 标 签 为 99* 的 语 句! 从 该 引 用 里 面 正 常 返 回 所 谓 哑 过 程 就 是 一 个 过 程 名 称, 它 可 以 出 现 在 界 面 块 里 面, 可 以 出 现 在 EXTERNAL 语 句 里 面, 或 者 作 为 一 个 过 程 的 名 称 被 引 用 在 一 个 函 数 或 子 例 行 程 序 引 用 里 面 与 作 为 哑 元 的 哑 过 程 相 关 联 的 实 元 必 须 是 一 个 外 部 过 程, 或 模 块 过 程, 或 固 有 过 程, 或 哑 过 程 的 名 称 哑 过 程 的 一 般 规 则 如 下 : 实 元 不 能 是 内 部 过 程 或 语 句 函 数 的 名 称 实 元 不 能 是 类 过 程 的 名 称, 除 非 该 类 过 程 名 称 同 时 也 是 一 个 种 过 程 的 名 称 如 果 哑 过 程 的 界 面 是 显 式 的, 那 么 其 相 关 联 的 实 元 过 程 必 须 与 该 界 面 相 匹 配 如 果 哑 过 程 被 明 确 引 用 为 一 个 函 数, 那 么 相 应 的 实 元 过 程 也 必 须 是 一 个 函 数 如 果 哑 过 程 被 明 确 引 用 为 一 个 子 例 行 程 序, 或 具 有 一 个 显 式 的 子 例 行 程 序 的 界 面, 那 么 相 应 的 实 元 过 程 也 必 须 是 一 个 子 例 行 程 序 哑 过 程 可 以 是 可 选 的, 但 不 能 具 有 INTENT 属 性 哑 过 程 可 以 出 现 在 函 数 子 程 序 或 子 例 行 程 序 子 程 序 里 面 实 元 过 程 可 以 使 用 关 键 词 说 明 13.8 过 程 界 面 所 谓 一 个 过 程 的 界 面, 顾 名 思 义 就 是 过 程 与 过 程 外 部 进 行 数 据 交 流 所 必 须 提 供 的 信 息 集 合 它 包 括 过 程 及 其 哑 元 的 名 称, 过 程 的 属 性, 哑 元 列 表 的 顺 序 及 其 属 性 如 果 上 面 所 列 举 的 信 息 对 于 引 用 该 过 程 的 程 序 单 位 来 说 是 已 知 的, 或 者 说 是 可 访 问 的, 那 么 该 过 程 的 界 面 就 称 为 在 引 用 程 序 的 作 用 域 单 位 里 面 为 显 式 的, 否 则 称 为 隐 式 的 固 有 过 程, 内 部 过 程, 和 模 块 过 程 的 界 面 总 是 显 式 的 ; 而 外 部 过 程 和 语 句 函 数 的 界 面 为 隐 式 的 要 使 得 外 部 过 程 的 界 面 成 为 显 式 的, 可 以 在 引 用 程 序 的 作 用 域 单 位 的 说 明 部 分 使 用 界 面 块

245 界 面 块 的 功 能 包 括 : 给 出 过 程 的 类 属 性 质 定 义 新 的 自 定 义 算 符, 并 且 扩 展 固 有 算 符 的 类 属 性 质 重 定 义 派 生 类 型 的 固 有 赋 值, 或 对 新 的 数 据 组 合 形 式 扩 展 赋 值 运 算 说 明 一 个 过 程 为 外 部 过 程 鉴 于 显 式 界 面 在 FORTRAN 里 面 的 重 要 性, 下 面 我 们 分 节 说 明 有 关 显 式 界 面 的 各 种 问 题 显 式 界 面 显 式 界 面 是 FROTRAN 的 最 为 重 要 的 一 个 语 言 特 性 之 一, 因 为 它 能 够 有 效 地 根 除 FROTRAN 编 程 最 大 的 错 误 来 源, 即 过 程 引 用 当 中 出 现 的 数 据 匹 配 错 误 在 出 现 以 下 变 元 数 据 对 象 与 过 程 对 象 的 情 形 下 必 须 给 出 显 式 界 面 : 1. 可 选 变 元 ; 2. 数 组 值 函 数 ; 3. 长 度 动 态 决 定 的 字 符 值 函 数 ; 4. 指 针 值 函 数 ; 5. 用 于 数 组 片 断 调 用 的 哑 形 哑 元 ; 6. 具 有 POINTER 属 性 与 TARGET 属 性 的 哑 元 ; 7. 关 键 词 实 元 ; 8. 类 过 程 ; 9. 自 定 义 算 符, 实 际 上 是 调 用 某 些 函 数 的 替 代 形 式 ; 10. 自 定 义 赋 值, 实 际 上 是 调 用 某 些 子 例 行 程 序 的 替 代 形 式 ; 11. 逐 元 过 程 ; 12. 要 求 纯 过 程 的 上 下 文 里 面 的 过 程 引 用 下 面 分 别 说 明 这 些 不 同 情 形 之 所 以 需 要 使 用 显 式 界 面 的 原 因 在 情 形 1 和 情 形 7 的 时 候 需 要 使 用 显 式 界 面 的 原 因, 可 以 从 下 面 的 例 子 里 面 看 到 例 SUBROUTINE SUB1(A,B,C,D,E);OPTIONAL A,B,C END SUBROUTINE CALL S UB1(F,G,H,I,J)! 基 本 的 引 用 CALL SUB1(F,H,I,J)! 省 略 了 第 二 个 变 元 CALL SUB1(A=F,B=G,C=H,D=I,E=J)! 与 第 一 个 引 用 等 价 CALL SUB1(A=F, C=H,D=I,E=J)! 与 第 二 个 引 用 等 价 CALL SUB1(D=I,E=J)! 省 略 了 全 部 可 选 变 元 CALL SUB1(E=J,D=I)! 与 上 面 的 引 用 等 价 CALL SUB1(C=H,B=G, D=I,E=J)! 省 略 了 一 个 可 选 变 元 CALL SUB1( D=I,A=F,B=G, E=J)! 省 略 了 一 个 可 选 变 元 上 面 例 子 里 面 的 引 用 都 是 有 效 的 引 用, 从 上 面 例 子 的 最 后 4 个 引 用 可 以 看 到, 当 存 在 可 选 变 元 与 关 键 词 的 时 候, 都 必 须 使 用 显 式 界 面, 使 得 引 用 程 序 能 够 建 立 正 确 的 变 元 关 联, 否 则 由 于 在 哑 元 列 表 里 面 的 任 意 哑 元 都 可 以 被 设 置 为 可 选 变 元, 而 可 选 变 元 又 原 则 上 可 以 被 省 略 ; 关 键 词 方

246 式 又 完 全 不 依 赖 于 列 表 位 置, 因 此 要 建 立 不 会 产 生 歧 义 的 变 元 关 联, 就 必 须 使 用 显 式 界 面 在 情 形 2 和 情 形 3 里 面 的 数 据 对 象 都 具 有 尺 度 概 念, 即 数 组 的 尺 度 和 字 符 串 的 长 度, 这 些 参 数 值 都 是 由 过 程 的 运 行 来 决 定 的, 因 此 在 引 用 过 程 当 中 会 发 生 变 化, 这 时 就 需 要 显 式 界 面 来 提 供 明 确 的 信 息 在 情 形 4 里 面, 引 用 过 程 需 要 为 指 针 对 关 联 的 实 元 数 据 对 象 建 立 缓 存, 因 此 也 需 要 显 式 界 面 情 形 5 实 际 上 是 实 现 了 FORTRAN 的 一 个 重 要 功 能, 即 能 够 非 常 灵 活 地 引 用 数 组 的 任 意 片 断, 哪 怕 是 按 照 数 组 元 素 序 为 不 连 续 的 片 断 而 要 做 到 引 用 任 意 的 数 组 片 断, 就 需 要 给 引 用 程 序 提 供 除 了 一 般 数 组 引 用 之 外 的 额 外 信 息, 例 如 数 组 片 断 的 具 体 组 成 等 为 了 能 够 说 明 数 组 的 任 意 片 断, 在 很 多 时 候 就 需 要 非 常 复 杂 的 描 述 片 断 的 组 成, 这 都 要 求 通 过 显 式 界 面 来 完 成 这 个 描 述 任 务 在 原 则 上, 任 何 数 组 都 可 以 传 递 给 任 何 形 式 的 哑 元, 对 于 具 有 隐 式 界 面 的 数 组 来 说, 默 认 情 况 下 是 传 递 给 显 形 数 组 和 哑 尺 度 数 组, 而 哑 形 哑 元 则 需 要 具 有 显 式 界 面 的 数 组 对 于 任 意 形 式 的 数 组 片 断 来 说, 尽 管 也 可 是 传 递 给 显 形 数 组 和 哑 尺 度 数 组, 但 这 样 一 来 系 统 就 需 要 把 可 能 非 常 零 散 的 数 组 片 断 包 装 成 一 个 完 整 的 数 组, 再 输 入 过 程, 然 后 从 过 程 返 回 的 结 果 又 需 要 拆 散 为 原 来 的 片 断 形 状, 这 显 然 是 一 个 多 余 而 繁 重 的 任 务 所 以 自 然 的 解 决 之 道 就 是 运 用 哑 元 哑 元 来 引 用 数 组 片 断, 同 时 给 出 显 式 界 面 在 情 形 6 时, 由 于 实 元 本 身 有 可 能 就 是 一 个 指 针, 那 么 在 引 用 该 实 元 时, 就 会 发 生 究 竟 是 引 用 该 指 针 还 是 引 用 该 指 针 的 目 标 的 歧 义, 这 时 就 需 要 知 道 哑 元 是 否 具 有 POINTER 属 性, 而 显 式 界 面 即 可 提 供 这 个 信 息 在 隐 式 界 面 的 情 形 下, 默 认 的 选 择 是 引 用 目 标 数 据 对 象 在 情 形 7 里 面 的 关 键 词 本 身 为 哑 元 的 名 称 或 这 些 名 称 的 别 名, 这 些 都 需 要 通 过 显 式 界 面 来 给 出 在 情 形 8 里 面 的 类 过 程 的 名 称 本 身 意 味 着 多 个 不 同 的 种 过 程, 因 此 在 引 用 时 如 果 使 用 了 类 过 程 名 称, 就 需 要 给 出 额 外 的 信 息 来 决 定 究 竟 引 用 的 是 那 个 种 过 程, 这 同 样 需 要 通 过 显 式 界 面 来 提 供 信 息, 即 在 显 式 界 面 里 面 给 出 哑 元 的 属 性 模 式, 例 如 TKR 模 式, 通 过 哑 元 的 属 性 模 式 的 匹 配 机 制 来 选 择 恰 当 的 种 过 程 具 体 的 说 明 参 见 节 对 于 传 统 的 二 元 运 算 的 函 数 符 号, 可 以 使 用 自 定 义 算 符 的 形 式 代 替, 因 此 引 用 这 种 函 数 时, 就 可 以 采 用 引 用 自 定 义 算 符 的 形 式 而 这 种 自 定 义 算 符 常 常 按 照 习 惯 采 用 一 些 存 在 既 有 定 义 的 算 符 符 号, 以 便 于 阅 读, 这 样 就 发 生 了 和 类 过 程 类 似 的 情 况, 即 同 一 个 算 符 符 号 可 能 代 表 了 不 同 的 运 算, 这 时 同 样 地 需 要 显 式 界 面 来 给 予 明 确 的 说 明 有 关 自 定 义 算 符 的 具 体 说 明 参 见 节 情 形 10 实 际 上 仍 然 还 是 要 解 决 在 引 用 类 名 称 时 如 何 选 择 种 对 象 的 问 题, 只 是 这 里 涉 及 的 是 不 同 数 据 类 型 之 间 的 区 分 与 转 换, 即 在 把 一 个 数 值 赋 值 给 某 个 数 据 对 象 之 前, 可 能 需 要 对 该 数 据 值 进 行 类 型 或 种 别 的 转 换, 使 得 自 定 义 赋 值 能 够 合 法 进 行 有 关 的 说 明 参 见 节 在 情 形 11 里 面, 逐 元 过 程 的 引 用 实 际 上 就 是 一 种 类 过 程 引 用 的 形 式, 这 时 需 要 靠 秩 的 信 息 来 选 择 恰 当 匹 配 的 种 过 程, 因 此 同 样 需 要 通 过 显 式 界 面 来 提 供 这 个 信 息 在 情 形 12 里 面, 之 所 以 要 求 显 式 界 面, 是 因 为 在 有 可 能 涉 及 到 并 行 运 算 的 情 况 下, 例 如 FORALL 结 构 或 语 句, 或 在 一 个 说 明 表 达 式 里 面, 都 要 求 纯 过 程, 因 此 只 有 通 过 显 式 界 面 来 说 明 所 引 用 的 过 程 为 纯 过 程, 才 能 保 证 该 引 用 是 有 效 的

247 界 面 块 所 谓 界 面 块 是 一 个 在 语 法 上 特 别 标 示 出 来 的 程 序 单 位, 特 别 强 调 了 其 作 为 界 面 的 功 能, 即 当 一 个 程 序 需 要 引 用 过 程 时, 界 面 块 能 够 提 供 所 有 有 关 该 过 程 的 信 息, 从 而 能 够 保 障 引 用 的 正 常 工 作 由 于 界 面 块 的 基 本 功 能 是 面 向 需 要 引 用 过 程 的 程 序, 因 此 它 必 须 放 置 在 该 程 序 的 说 明 部 分, 或 由 该 程 序 使 用 的 模 块 里 面 应 用 界 面 块 的 场 合 基 本 上 是 如 下 4 类 : 1. 为 外 部 过 程 和 哑 过 程 提 供 显 式 界 面 ; 2. 为 类 过 程 提 供 完 备 的 信 息, 即 : 类 过 程 名 称, 共 享 该 名 称 的 所 有 种 过 程, 其 中 所 有 外 部 过 程 的 显 式 界 面 ; 3. 定 义 新 的 运 算 符, 或 者 是 对 已 有 的 固 有 运 算 符 或 已 知 算 符 进 行 扩 展, 然 后 说 明 它 们 所 对 应 的 函 数, 并 且 为 其 中 的 所 有 外 部 函 数 提 供 显 式 界 面 ; 4. 定 义 新 的 强 制 转 换 赋 值, 对 固 有 的 派 生 类 型 赋 值 进 行 扩 展, 给 出 相 关 的 子 例 行 程 序, 并 且 为 其 中 的 所 有 外 部 子 例 行 程 序 提 供 显 式 界 面 因 此 界 面 块 除 了 它 的 最 为 基 本 的 为 外 部 过 程 提 供 显 式 界 面 的 功 能 之 外, 其 他 的 三 种 功 能 实 际 上 都 是 要 解 决 在 引 用 一 个 集 合 的 名 称 的 前 提 下, 如 何 通 过 界 面 块 所 给 出 的 信 息 来 决 定 唯 一 的 集 合 的 某 个 元 素 的 名 称 后 面 的 3 种 情 形 将 分 别 在 ,13.8.4, 节 讨 论, 下 面 我 们 主 要 说 明 界 面 块 的 一 般 形 式 和 上 面 的 第 一 种 情 形 界 面 块 的 的 语 法 形 式 (R1201) 为 : INTERFACE [generic-specification] [interface-body] [MODULE PROCEDURE procedure-name-list] END INTERFACE 其 中 类 说 明 (generic-specification) 的 一 般 形 式 (R1207) 为 : generic-name OPERATOR ASSIGNMENT(=) 其 中 界 面 体 (interface-body) 给 出 函 数 或 子 例 行 程 序 的 界 面, 语 法 形 式 (R1205) 为 : function-statement [specification-part] END [FUNCTION [function-name]] subroutine-statement [specification-part] END [SUBROUTINE [subroutine-name]] 界 面 块 的 一 般 规 则 如 下 : 如 果 类 说 明 选 项 省 略, 则 MODULE PROCEDURE 选 项 也 必 须 省 略, 省 略 类 说 明 的 界 面 块 形 式 只 适 用 于 外 部 过 程 和 哑 过 程 情 形

248 在 情 形 2 是 在 类 说 明 里 面 给 出 类 过 程 名 称 ; 在 情 形 3 是 给 出 OPERATOR; 在 情 形 4 是 给 出 ASSIGNMENT 在 所 有 的 情 形 里 面, 界 面 体 都 是 用 于 外 部 过 程 和 哑 过 程 的 界 面 体 的 说 明 部 分 只 能 包 含 对 于 哑 元 以 及 函 数 结 果 的 说 明, 不 能 包 含 ENTRY 语 句, DATA 语 句,FORMAT 语 句, 或 语 句 函 数 语 句 在 界 面 体 的 说 明 部 分 里 面 必 须 给 出 哑 元 以 及 函 数 结 果 的 属 性 的 完 备 说 明, 即 所 有 在 相 应 的 过 程 定 义 里 面 给 出 的 属 性 说 明 不 过 哑 元 的 名 称 可 以 改 变, 但 属 性 绝 对 不 能 改 变 由 于 界 面 体 是 用 来 提 供 定 义 在 外 部 作 用 域 的 过 程 的 信 息, 而 不 是 来 自 界 面 体 自 身 所 在 宿 主 作 用 域 的 信 息, 因 此 界 面 体 是 一 个 相 对 独 立 的 作 用 域 单 位, 它 不 从 其 宿 主 通 过 宿 主 关 联 继 承 任 何 数 据 及 其 属 性 与 规 则, 例 如 命 名 常 量, 隐 式 类 型 规 则 等 但 是 界 面 体 可 以 包 含 USE 语 句, 因 此 可 以 通 过 使 用 关 联 访 问 相 应 的 数 据 对 象, 例 如 派 生 类 型 定 义 等 在 MODULE PROCEDURE 语 句 里 面 的 过 程 名 称 是 一 个 模 块 过 程 的 名 称, 该 模 块 过 程 或 者 是 属 于 界 面 块 的 宿 主 模 块, 或 者 是 可 以 通 过 使 用 关 联 访 问 到 该 模 块 过 程 在 与 该 界 面 块 相 同 的 作 用 域 单 位 里 面, 或 某 个 可 访 问 的 作 用 域 单 位 里 面, 该 名 称 不 能 同 时 以 同 样 的 类 说 明 符 出 现 在 另 外 的 界 面 里 面 界 面 块 不 能 包 含 ENTRY 语 句, 但 是 在 界 面 体 里 面 可 以 使 用 作 为 函 数 名 称 或 子 例 行 程 序 名 称 的 登 录 名 称 来 说 明 登 录 界 面 在 一 个 作 用 域 单 位 里 面, 一 个 过 程 只 能 具 有 一 个 显 式 界 面 界 面 块 不 能 出 现 在 数 据 块 程 序 单 位 里 面 在 界 面 体 的 END 语 句 里 面, 关 键 词 FUNCTION 和 SUBROUTINE 都 是 可 选 的, 这 意 味 着 一 个 外 部 程 序 的 说 明 与 END 语 句 可 以 用 来 构 成 有 效 的 界 面 体 具 有 相 同 的 类 说 明 符 的 两 个 或 多 个 类 界 面, 可 以 在 同 一 个 作 用 域 单 位 里 面 同 时 被 直 接 地 访 问, 或 通 过 宿 主 关 联, 或 通 过 使 用 关 联 被 访 问 这 时, 它 们 可 以 被 看 成 是 一 个 界 面 块 如 果 过 程 定 义 里 面 出 现 了 PURE,ELEMENTAL,RECURSIVE 这 样 的 关 键 词, 那 么 相 应 的 界 面 块 里 面 必 须 给 出 同 样 的 关 键 词, 绝 对 不 能 省 略 界 面 块 最 基 本 的 应 用 就 是 给 出 外 部 过 程 与 哑 过 程 的 显 式 界 面 这 时 界 面 块 的 形 式 更 加 简 单 : INTERFACE [interface-body] END INTERFACE 在 上 面 的 一 般 规 则 里 面, 需 要 特 别 注 意 如 下 几 点 : 界 面 块 的 宿 主 里 面 的 IMPLICIT 语 句, 类 型 声 明 语 句, 以 及 派 生 类 型 定 义 都 不 影 响 界 面 块 内 部 在 一 个 宿 主 程 序 单 位 里 面, 一 个 外 部 过 程 的 界 面 体 只 能 出 现 一 次 界 面 体 不 能 用 来 说 明 固 有 过 程, 内 部 过 程, 以 及 模 块 过 程, 因 为 这 些 种 类 的 过 程 本 来 就 具 有 显 式 界 面 类 过 程 的 界 面 之 所 以 提 出 类 过 程 的 概 念 是 因 为, 当 一 个 过 程 的 变 元 采 用 多 种 不 同 的 数 据 类 型 值 时, 变 元 取 一 种 数 据 类 型 值, 就 对 应 着 一 种 种 过 程, 其 变 元 有 可 能 取 多 少 种 类 的 数 据 类 型 模 式, 就 存 在 多 少 个 不 同 的 种 过 程, 而 这 些 种 过 程 尽 管 表 明 上 是 不 同 的, 但 是 过 程 的 运 算 实 质 是 相 同 的, 并 且 通 过 变 元 的 模 式 匹 配, 就 足 够 区 分 不 同 的 种 过 程, 因 此 这 些 种 过 程 可 以 拥 有 相 同 的 作 为 一 个 过 程 种 类

249 的 名 称, 即 类 过 程 名 称, 而 对 它 们 的 引 用 也 可 以 使 用 同 一 个 类 过 程 名 称 例 如 固 有 过 程 LOG, 根 据 它 的 变 元 的 不 同 数 据 类 型, 实 际 上 它 包 含 3 个 种 过 程 :ALOG, CLOG,DLOG, 它 们 的 变 元 分 别 是 默 认 实 型, 默 认 复 型 和 双 精 度 实 型 要 引 用 该 过 程, 完 全 可 以 只 使 用 它 们 的 类 名 称 LOG, 在 进 行 数 据 通 讯 时, 可 以 通 过 变 元 之 间 的 数 据 类 型 匹 配 而 自 动 选 择 相 应 的 种 过 程 在 引 用 类 过 程 时, 常 常 需 要 定 义 额 外 的 类 过 程 性 质, 这 时 就 需 要 构 造 类 过 程 的 界 面 块, 具 有 这 种 功 能 的 界 面 块 的 形 式 为 : INTERFACE generic-name [interface-body] [MODULE PROCEDURE procedure-name-list] END INTERFACE 其 中 的 类 名 称 (generic-name) 就 是 在 该 界 面 块 的 宿 主 单 位 里 面 引 用 的 类 过 程 的 名 称 这 个 界 面 块 里 面 给 出 了 所 有 共 享 该 类 名 称 的 种 过 程, 其 中 可 能 包 括 外 部 过 程 与 模 块 过 程 这 两 种 类 型 的 过 程 具 有 如 下 的 差 别 : 对 于 外 部 过 程 来 说, 除 了 给 出 相 应 种 过 程 名 称 之 外, 还 给 出 其 显 式 界 面 ; 而 对 于 模 块 过 程 来 说, 只 需 要 给 出 名 称 即 可, 因 为 其 界 面 本 来 就 是 显 式 的 在 一 个 给 定 的 宿 主 单 位 里 面, 一 个 外 部 过 程 只 能 出 现 在 一 个 类 过 程 集 合 里 面 ; 而 由 于 MODULE PROCEDURE 语 句 里 面 不 需 要 给 出 显 式 界 面, 所 有 模 块 过 程 可 以 同 时 出 现 在 一 个 宿 主 单 位 里 面 的 多 个 类 过 程 集 合 里 面 固 然 类 过 程 都 必 须 借 助 界 面 块 而 得 到 引 用, 而 同 时 内 部 过 程, 固 有 过 程 以 及 语 句 函 数 都 不 能 出 现 在 界 面 块 里 面, 那 么 当 类 过 程 名 称 同 时 也 是 某 个 内 部 过 程, 固 有 过 程 或 语 句 函 数 的 名 称 的 时 候, 就 必 须 把 该 名 称 看 成 类 名 称, 或 者 还 可 以 对 过 程 类 进 行 扩 展 例 INTERFACE SQRT MODULE PROCEDURE NORMAL_SQRT END INTERFACE 在 这 个 例 子 里 面, 作 为 类 名 称 的 SQRT 被 增 加 了 一 个 自 定 义 的 过 程 NORMAL_SQRT 实 际 上 类 过 程 名 称 是 没 有 任 何 限 制 的, 它 可 以 取 类 过 程 自 身 所 包 含 的 种 过 程 的 名 称, 也 可 以 取 其 他 某 个 类 过 程 的 名 称, 或 完 全 自 定 义 的 命 名, 对 于 类 过 程 引 用 来 说, 正 确 的 引 用 不 在 于 它 的 名 称 本 身, 而 是 必 须 做 到 能 够 通 过 界 面 块 确 切 地 选 择 唯 一 的 种 过 程 因 此 只 要 能 够 保 证 一 个 过 程 引 用 总 是 能 够 明 确 地 说 明 是 对 某 个 种 过 程 的 引 用, 那 么 在 一 个 作 用 域 单 位 里 面 可 以 同 时 存 在 多 个 类 名 称, 例 如 通 过 USE 语 句 来 引 入 多 个 类 过 程 名 称 从 类 过 程 名 称 而 确 定 唯 一 的 种 过 程 的 基 本 方 法, 就 是 在 变 元 位 置 关 联 或 关 键 词 关 联 方 式 之 下, 运 用 TKR 模 式 进 行 匹 配 也 只 有 通 过 这 种 方 法, 才 能 做 到 任 何 的 过 程 引 用 都 肯 定 是 对 唯 一 的 种 过 程 的 引 用 例 给 定 一 个 2 变 元 的 子 例 行 程 序 SUB(A,B), 设 SUB 是 一 个 类 过 程 名 称, 并 且 它 的 两 个 哑 元 A,B 都 不 是 可 选 哑 元, 那 么 实 元 X,Y 对 SUB 的 引 用 有 如 下 几 种 形 式 : CALL SUB(X,Y)! 合 法 的 引 用 CALL SUB(X,B=Y)! 合 法 的 引 用 CALL SUB(B=Y,X)! 不 合 法 的 引 用

250 CALL SUB(A=X,B=Y)! 合 法 的 引 用 CALL SUB(B=Y,A=X)! 合 法 的 引 用 如 果 类 过 程 SUB 包 含 了 一 个 种 过 程 ESUB, 那 么 上 面 的 各 种 不 同 引 用 方 式 对 不 同 情 形 下 的 种 过 程 ESUB 的 影 响 是 不 同 的 : 第 一 种 引 用 方 式 一 定 排 除 了 对 ESUB 的 引 用, 如 果 ESUB 的 两 个 变 元 分 别 与 SUB 的 A 和 B 都 具 有 完 全 相 同 的 TKR 模 式 ; 第 四 种 和 第 五 种 引 用 方 式 一 定 排 除 了 对 ESUB(B,A) 的 引 用, 如 果 ESUB 的 第 一 个 变 元 名 称 为 B, 并 且 该 变 元 与 SUB 的 变 元 B 具 有 相 同 的 TKR 模 式 ; 同 时 ESUB 的 第 二 个 变 元 名 称 为 A, 并 且 该 变 元 与 SUB 的 变 元 A 具 有 相 同 的 TKR 模 式 ESUB 的 其 他 情 形 都 包 含 在 对 SUB 的 引 用 当 中 有 关 引 用 的 TKR 模 式 匹 配 问 题 的 详 细 说 明 参 见 第 15 章 自 定 义 算 符 的 界 面 通 过 运 用 界 面 块 可 以 提 供 一 种 直 观 的 引 用 函 数 的 方 式, 其 基 本 的 原 则 与 借 助 界 面 块 来 引 用 类 过 程 一 样, 即 扩 展 运 算 符 的 含 义, 使 得 算 符 能 够 用 来 表 示 函 数, 这 时 算 符 就 相 当 于 一 个 类 过 程, 可 以 同 时 表 示 多 个 含 义, 再 通 过 界 面 块 所 提 供 的 信 息, 就 可 以 选 择 出 算 符 的 唯 一 义 项 作 为 实 际 引 用 的 对 象 之 所 以 要 采 用 算 符 的 形 式 来 引 用 函 数, 主 要 的 意 图 是 希 望 FORTRAN 源 码 能 够 具 有 更 加 自 然 的 数 学 形 式, 因 为 按 照 数 学 的 习 惯 表 示 方 式, 对 1 个 或 2 个 算 元 的 计 算 一 般 直 接 采 用 算 符 的 形 式, 而 FORTRAN 的 函 数 也 大 多 是 执 行 计 算 任 务, 因 此 对 于 包 含 1 个 或 2 个 变 元 的 函 数, 一 般 倾 向 于 除 了 直 接 使 用 函 数 的 定 义 名 称 作 为 引 用 名 称, 还 采 用 一 个 算 符 作 为 函 数 的 别 名 加 以 引 用 当 然 这 个 算 符 既 可 以 是 对 固 有 算 符 的 扩 展, 也 可 以 是 自 定 义 的 算 符, 无 论 何 种 情 形, 都 有 可 能 导 致 同 一 个 算 符 实 际 代 表 了 几 种 函 数 或 运 算 的 含 义, 这 时 就 需 要 使 用 界 面 块 来 获 得 引 用 的 唯 一 性 无 论 是 扩 展 既 有 算 符 的 含 义, 还 是 给 出 自 定 义 算 符, 界 面 块 的 形 式 都 是 : INTERFACE OPERATOR(defined-operator) [interface-body] [MODULE PROCEDURE procedure-name-list] END INTERFACE 应 用 于 自 定 义 算 符 的 规 则 与 类 过 程 的 规 则 是 一 致 的 不 过 需 要 特 别 注 意 以 下 几 点 : 每 个 界 面 体 都 是 用 于 一 个 具 有 1 个 或 2 个 变 元 的 函 数, 而 在 MODULE PROCEDURE 语 句 里 面 的 过 程 名 称 都 是 一 个 具 有 1 个 或 2 个 变 元 的 函 数 的 名 称 所 有 的 变 元 都 不 是 可 选 变 元, 并 且 都 具 有 INTENT(IN) 属 性 在 INTERFACE 语 句 里 面 给 出 的 算 符, 表 示 了 在 界 面 块 里 面 给 出 的 函 数 的 运 算 引 用 形 式 对 于 1 个 变 元 的 函 数 就 是 采 用 前 缀 算 符 的 形 式 ; 对 于 2 个 变 元 的 函 数 就 是 采 用 中 缀 算 符 的 形 式 函 数 除 了 采 用 算 符 的 形 式 加 以 引 用 之 外, 当 然 还 可 以 采 用 直 接 引 用 函 数 名 称 的 方 式 经 过 定 义 的 算 符 具 有 以 下 2 种 形 式 之 一 : intrinsic-operator. letter [letter].

251 其 中 在 字 符 串 左 右 两 端 加 句 点 的 形 式 不 能 取 逻 辑 值 形 式, 而 如 果 采 用 固 有 算 符, 那 么 就 必 须 遵 循 该 固 有 算 符 对 于 其 所 作 用 的 算 元 的 数 目 的 约 定, 即 算 符 的 计 算 含 义 可 以 扩 展, 但 是 作 用 的 算 元 数 目 不 能 变 更 一 个 自 定 义 算 符 界 面 实 际 上 可 以 看 成 是 定 义 了 一 个 类 过 程, 该 算 符 可 以 看 成 是 类 过 程 的 名 称 因 此 一 个 自 定 义 算 符 实 际 上 意 味 着 代 表 了 多 个 函 数, 如 果 把 固 有 算 符 也 理 解 为 某 种 函 数 的 话 显 然, 引 用 一 个 自 定 义 算 符 同 样 面 临 着 如 何 通 过 界 面 块 来 确 定 唯 一 的 选 择 的 问 题, 解 决 的 方 案 与 类 过 程 相 同, 也 是 利 用 TKR 模 式 的 匹 配, 甚 至 更 加 简 单, 因 为 算 符 的 那 种 语 法 形 式 不 允 许 使 用 关 键 词 形 式 来 表 达 变 元 关 联, 而 只 能 使 用 变 元 的 位 置 匹 配 形 式 通 过 TKR 模 式 来 自 动 地 获 得 算 符 含 义 的 唯 一 性 基 本 约 定 是 : 针 对 一 个 算 符 的 扩 展 只 是 扩 展 它 的 算 元 的 类 型 与 属 性 范 畴, 因 此 一 个 算 符 的 具 体 含 义 完 全 通 过 它 所 作 用 的 算 元 的 类 型 属 性 模 式 来 决 定 ; 如 果 要 针 对 相 同 的 算 元 对 象 构 造 与 既 有 算 符 具 有 完 全 不 同 的 计 算 含 义 的 算 符, 就 不 能 通 过 对 既 有 算 符 的 扩 展 来 得 到, 而 需 要 采 用 完 全 新 的 算 符 符 号, 这 时 就 不 存 在 如 何 与 固 有 算 符 区 分 的 问 题 了 例 如 对 于 固 有 算 符 +, 可 以 把 它 扩 展 为 不 同 种 别 参 数 的 整 型 与 实 型 的 加 法, 而 如 果 要 针 对 这 个 不 同 种 别 参 数 的 整 型 与 实 型 定 义 一 个 与 该 既 有 加 法 不 同 的 运 算, 就 不 能 采 用 + 这 个 算 符 了 下 面 的 两 个 例 子 分 别 表 示 了 这 两 种 情 形, 即 一 种 是 属 于 对 固 有 算 符 进 行 扩 展 的 自 定 义 运 算, 另 一 种 是 属 于 停 工 一 个 函 数 来 全 新 地 定 义 一 种 新 的 运 算, 具 有 自 身 的 独 特 的 算 符 例 在 这 个 例 子 里 面 对 固 有 算 符 + 进 行 了 扩 展, 使 得 + 能 够 作 用 于 一 个 整 型 数 值 和 一 个 属 于 派 生 类 型 的 区 间 值, 这 种 算 元 模 式 显 然 扩 展 了 固 有 算 符 + INTERFACE OPERATOR(+) FUNCTION INTEGER_PLUS_INTERVAL (A, B) USE INTERVAL_ARITHMETIC TYPE (INTERVAL) :: INTEGER_PLUS_INTERVAL INTEGER, INTENT (IN) :: A TYPE (INTERVAL), INTENT (IN) :: B END FUNCTION INTEGER_PLUS_INTERVAL MODULE PROCEDURE RATIONAL_ADD END INTERFACE 例 在 这 个 例 子 里 面 通 过 模 块 过 程 VERTEX_VALENCE 定 义 了 一 个 全 新 的 符.VALENCE., 它 不 属 于 任 何 固 有 算 符 的 扩 展 INTERFACE OPERATOR(.VALENCE.) MODULE PROCEDURE VERTEX_VALENCE END INTERFACE 自 定 义 赋 值 的 界 面 所 谓 赋 值 子 例 行 程 序 本 质 上 还 是 一 种 类 过 程, 而 这 里 的 赋 值 只 是 一 种 采 用 了 赋 值 语 法 形 式 的 具 有 数 据 类 型 转 换 功 能 的 子 例 行 程 序, 即 它 的 主 要 功 能 就 是 把 数 据 值 从 一 种 TKR 模 式 强 制 转 换 为 另 外 一 种 TKR 模 式 本 来 这 种 功 能 是 需 要 通 过 子 例 行 程 序 来 完 成 的, 但 纯 粹 为 了 使 得 FORTRAN 源 码 具 有 更 加 自 然 的 形 式, 就 把 这 种 特 别 的 转 换 子 例 行 程 序 表 述 为 一 种 赋 值 的 形 式,

252 即 等 号 两 边 各 有 一 个 变 元 的 形 式 同 时, 也 可 以 把 这 种 特 定 功 能 的 自 定 义 赋 值 过 程 看 成 是 一 个 作 用 于 两 个 变 元 的 子 例 行 程 序, 该 子 例 行 程 序 类 似 于 上 节 说 明 的 函 数, 具 有 一 个 唯 一 形 式 的 算 符 =, 即 把 = 理 解 为 一 种 运 算, 而 形 式 上 它 的 两 边 分 别 出 现 一 个 变 元 因 此 类 似 于 自 定 义 算 符 的 扩 展, 自 定 义 赋 值 过 同 样 存 在 一 个 扩 展 的 问 题, 这 就 使 得 自 定 义 赋 值 具 有 了 类 过 程 的 属 性, 而 对 自 定 义 赋 值 的 引 用 同 样 是 通 过 界 面 块 来 给 出 唯 一 性 信 息 的 用 来 定 义 新 的 赋 值 运 算 的 界 面 块 采 用 如 下 的 语 法 形 式 : INTERFACE ASSIGNMENT(=) [interface-body] [MODULE PROCEDURE procedure-name-list] END INTERFACE 这 种 界 面 块 形 式 当 然 满 足 界 面 块 的 一 般 规 则, 此 外 还 必 须 注 意 如 下 的 一 些 特 定 规 则 : 每 一 个 界 面 体 都 必 须 给 出 一 个 具 有 两 个 变 元 的 外 部 子 例 行 程 序 在 MODULE PROCEDURE 语 句 里 面 的 所 有 过 程 都 必 须 是 具 有 两 个 变 元 的 可 访 问 的 模 块 子 例 行 程 序 界 面 块 里 面 的 变 元 都 不 能 是 可 选 的 第 一 个 变 元 必 须 具 有 INTENT(OUT) 属 性 或 INTENT(INOUT) 属 性, 它 将 出 现 在 赋 值 语 句 的 等 号 的 左 边, 用 来 表 示 经 过 转 换 而 得 到 的 数 据 值 ; 第 二 个 变 元 必 须 具 有 INTENT(IN) 属 性, 它 将 出 现 在 赋 值 语 句 的 等 号 的 右 边, 用 来 表 示 需 要 转 换 的 数 据 值 构 造 了 赋 值 界 面 之 后, 就 可 以 使 用 赋 值 语 句 的 形 式 来 表 示 对 界 面 块 里 面 给 出 的 子 例 行 程 序 的 引 用 该 赋 值 的 形 式 为 : variable=expression 其 中 等 号 左 边 的 变 量 (variable) 就 是 子 例 行 程 序 引 用 里 面 的 第 一 个 实 元, 而 等 号 右 边 的 表 达 式 (express ion) 则 是 子 例 行 程 序 引 用 当 中 的 第 二 个 实 元, 因 此 这 个 赋 值 语 句 形 式 实 际 上 表 示 了 一 个 子 例 行 程 序 引 用, 当 然 这 种 引 用 方 式 需 要 配 合 该 自 定 义 赋 值 的 界 面 块 既 然 是 采 用 了 赋 值 语 句 的 形 式, 那 么 其 中 作 为 实 元 的 变 量 必 须 满 足 赋 值 语 句 里 面 对 于 等 号 左 边 变 元 的 语 法 要 求 赋 值 符 号 可 以 理 解 为 一 个 类 子 例 行 程 序 集 合 的 类 名 称, 而 自 定 义 赋 值 界 面 块 的 功 能 正 是 给 该 类 子 例 行 程 序 集 合 添 加 自 定 义 的 外 部 子 例 行 程 序 或 模 块 子 例 行 程 序 如 果 把 = 理 解 为 算 符, 那 么 与 自 定 义 算 符 一 样, 自 定 义 赋 值 的 界 面 块 还 必 须 提 供 保 证 种 子 例 行 程 序 引 用 唯 一 性 的 信 息, 其 唯 一 性 的 获 得 同 样 是 依 靠 TKR 模 式 的 匹 配 规 则 如 果 在 等 号 两 边 的 变 元 具 有 不 同 的 数 据 类 型 模 式, 那 么 该 赋 值 等 价 一 定 于 某 个 固 有 转 换 子 例 行 程 序, 因 此 这 种 类 型 的 赋 值 ( 或 者 说 子 例 行 程 序 ) 不 能 通 过 使 用 界 面 块 的 形 式 来 给 出, 因 为 会 导 致 无 法 唯 一 确 定 种 子 例 行 程 序 的 情 况 显 然 TKR 模 式 匹 配 规 则 保 证 了 这 种 情 况 不 会 出 现, 相 应 的 编 译 系 统 依 据 这 个 规 则 就 能 够 检 查 出 可 能 的 错 误 不 过 在 涉 及 到 派 生 类 似 数 据 的 转 换 赋 值 时, 可 以 根 据 具 体 计 算 的 需 要 改 变 固 有 赋 值 的 常 规 含 义 例 如 对 于 以 分 数 表 示 的 有 理 数, 常 常 在 赋 值 之 前 需 要 进 行 化 简, 即 约 去 分 子 分 母 的 公 共 因 子, 这 种 添 加 了 化 简 步 骤 的 赋 值 就 改 变 了 固 有 赋 值 的 含 义 例 在 下 面 的 赋 值 界 面 块 的 里 面 实 际 上 给 出 了 两 个 自 定 义 子 例 行 程 序 INTERFACE ASSIGNMENT(=)

253 SUBROUTINE ASSIGN_STRING_TO_CHARACTER (CH, ST) USE STRING_DATA CHARACTER (*), INTENT (OUT) :: CH TYPE (STRING), INTENT (IN) :: ST END SUBROUTINE ASSIGN_STRING_TO_CHARACTER MODULE PROCEDURE REAL _TO_ COMPLE END INTERFACE 然 后 基 于 这 个 界 面 块, 就 可 以 采 用 赋 值 形 式 来 引 用 其 中 的 自 定 义 转 换 子 例 行 程 序 ASSIGN_STRING_TO_ CHARACTER 和 ASSIGN_REAL_TO_COMPLEX, 即 : CH = ST CO = RE 这 两 个 被 引 用 的 自 定 义 子 例 行 程 序 分 别 表 示 把 字 符 串 变 元 ST 转 换 为 字 符 变 元 CH, 把 实 型 变 元 RE 转 换 为 复 型 变 元 CO 13.9 过 程 的 性 质 如 果 把 过 程 分 为 外 部 过 程, 内 部 过 程, 固 有 过 程, 模 块 过 程 以 及 语 句 函 数 这 五 种 的 话, 那 么 它 们 的 各 方 面 的 性 质 并 不 是 完 全 一 致 的 下 面 的 表 13-1 为 此 进 行 了 归 纳 表 13-2 五 种 过 程 的 不 同 性 质 过 程 的 性 质 外 部 过 程 内 部 过 程 固 有 过 程 模 块 过 程 语 句 函 数 哑 元 是 可 选 的 是 是 是 是 否 可 以 通 过 关 键 词 引 用 是 是 是 是 否 可 以 递 归 引 用 是 是 N/A 是 否 定 义 里 面 可 以 包 含 CONTAINS 语 句 是 否 是 是 否 可 以 传 递 是 否 是 是 否 可 以 出 现 在 界 面 体 是 否 否 否 否 界 面 自 动 为 显 式 的 否 是 是 是 否 可 以 逐 元 引 用 是 是 是 是 否 可 以 用 于 定 义 运 算 是 否 否 是 否 可 以 作 为 种 过 程 是 否 是 是 否 可 以 包 含 ENTRY 语 句 是 否 N/A 是 N/A 注 :N/A 表 示 该 项 内 容 不 存 在

254 第 14 章 固 有 过 程 固 然, 我 们 已 经 能 够 做 到 运 用 FORTRAN 95 来 描 述 任 何 的 计 算 任 务, 因 为 FORTRAN 95 所 提 供 的 数 据 类 型, 固 有 运 算, 派 生 类 型, 自 定 义 运 算, 以 及 构 造 函 数 与 子 例 行 程 序 的 方 法, 都 足 以 使 得 我 们 应 付 任 何 的 计 算 问 题 不 过 FORTRAN 95 标 准 还 提 供 了 大 量 的 科 学 计 算 的 常 规 计 算 与 函 数, 都 可 以 作 为 固 有 过 程 直 接 使 用, 而 不 需 要 我 们 自 己 来 编 写 源 码 这 就 好 像 对 于 一 个 汽 车 装 配 师, 除 了 给 他 提 供 螺 栓, 轴 承 之 类 的 标 准 零 件, 还 给 他 提 供 更 高 层 次 的 标 准 配 件, 例 如 各 种 型 号 的 发 动 机, 电 机 之 类 因 此 熟 练 掌 握 固 有 过 程, 将 给 我 们 带 来 如 虎 添 翼 的 感 觉 FORTRAN 95 把 固 有 过 程 作 为 标 准 来 提 出, 就 意 味 着 任 何 的 FORTRAN 95 的 编 译 器 实 现 版 本, 都 必 须 能 够 提 供 它 们 :115 个 固 有 过 程, 其 中 包 括 109 个 固 有 函 数 和 6 个 固 有 子 例 行 程 序 当 然 不 排 除 很 多 的 编 译 器 还 提 供 额 外 的 固 有 过 程 正 是 由 于 固 有 过 程 是 属 于 FORTRAN 95 的 标 准 内 容, 因 此 和 固 有 运 算, 例 如 +, 一 样, 总 是 随 叫 随 到, 无 论 在 哪 个 程 序 单 位 内 部, 只 要 使 用 某 个 固 有 过 程 的 名 称, 就 等 于 调 用 了 该 固 有 过 程 不 过, 如 果 它 的 名 称 被 用 户 定 义 的 函 数 或 子 例 行 程 序 所 侵 占, 那 么 在 下 面 的 情 况 下, 被 调 用 的 将 是 用 户 自 定 义 的 函 数 或 子 例 行 程 序 而 不 是 固 有 过 程 : 该 自 定 义 函 数 或 子 例 行 程 序 的 界 面 是 显 式 的 ; 该 自 定 义 函 数 或 子 例 行 程 序 出 现 在 EXTERNAL 语 句 当 中 ; 该 自 定 义 函 数 属 于 语 句 函 数 当 然 上 述 的 名 称 被 侵 权 的 有 效 范 围 只 是 该 自 定 义 函 数 或 子 例 行 程 序 的 作 用 域 相 应 的, 固 有 过 程 也 就 只 能 在 下 面 的 情 形 下 夺 回 被 侵 占 的 名 称 : 不 存 在 使 用 该 名 称 的 语 句 函 数 ; 它 的 名 称 出 现 在 INTRINSIC 语 句 当 中 ; 相 应 的 用 户 定 义 的 过 程 的 界 面 是 隐 式 的 例 如 在 一 个 模 块 或 一 个 内 部 过 程 里 面, 由 于 它 的 界 面 是 显 式 的, 那 么 固 有 过 程 的 名 称 就 能 够 被 侵 占, 除 非 固 有 过 程 的 名 称 出 现 在 一 个 有 效 的 INTRINSIC 语 句 当 中 下 面 我 们 主 要 讨 论 固 有 过 程 的 按 照 功 能 的 分 类, 以 及 每 个 种 类 的 固 有 过 程 所 能 够 完 成 的 计 算 任 务 FORTRAN 95 的 固 有 过 程 主 要 分 为 如 下 5 类 : 查 询 与 数 字 操 作 函 数 ; 转 换, 置 空 以 及 传 递 函 数 ; 计 算 函 数 ; 数 组 函 数 ; 固 有 子 例 行 程 序 在 分 别 讨 论 上 面 5 种 固 有 过 程 之 前, 我 们 首 先 讨 论 13 章 所 没 有 仔 细 讨 论 的 固 有 过 程 的 一 些 特 点 14.1 固 有 过 程 的 分 类 与 性 质 固 有 过 程 可 以 从 形 式 和 功 能 两 个 方 面 来 进 行 分 类

255 从 形 式 的 角 度 来 看, 固 有 过 程 分 为 如 下 两 类 : 类 过 程 ; 种 过 程 所 谓 类 过 程 是 一 个 集 合 名 称, 类 过 程 与 种 过 程 是 一 个 集 合 与 其 元 素 的 关 系 一 个 类 过 程 由 两 个 或 多 个 种 过 程 组 成 在 固 有 过 程 中 间 之 所 以 会 出 现 这 种 关 系, 是 因 为 过 程 所 具 体 针 对 的 变 元 的 作 为 数 据 对 象 的 类 型 与 种 别, 是 具 有 不 同 分 类 的, 这 样 就 导 致 同 一 个 函 数, 当 它 的 变 元 取 不 同 类 型 或 种 别 的 数 据 值 时, 就 需 要 对 固 有 过 程 按 照 情 形 进 行 分 类, 甚 至 采 用 不 同 的 过 程 名 称, 来 应 对 相 应 的 变 元 情 况 例 如 同 样 是 求 一 个 变 量 的 绝 对 值, 当 该 变 量 分 别 取 实 型 和 复 型 数 值 时, 就 对 应 了 完 全 不 同 的 计 算 过 程, 因 此 有 必 要 给 予 不 同 的 函 数 名 称, 尽 管 在 数 学 的 意 义 上, 都 是 成 为 取 绝 对 值 在 所 有 的 115 个 固 有 过 程 当 中, 除 了 如 下 4 个 固 有 函 数 外, 其 他 都 是 类 过 程 : LGE; LGT; LLE; LLT 对 于 每 个 类 过 程 属 下 的 种 过 程, 显 然 都 必 定 具 有 相 应 的 类 型, 种 别, 甚 至 秩 的 属 性 许 多 的 种 过 程 具 有 专 门 的 过 程 名 称, 在 下 面 的 表 14-1 当 中 列 出 了 它 们 的 全 部 名 称 以 及 相 应 的 变 元 属 性 这 些 种 过 程 的 名 称 也 可 以 直 接 用 作 过 程 引 用, 但 并 不 提 倡 这 些 名 称 的 主 要 用 途 是 作 为 实 元 来 传 递, 这 时 就 必 须 使 用 种 过 程 名 称 注 意, 在 表 中 注 明 了 少 数 种 过 程 不 能 作 为 实 元 如 果 从 功 能 的 角 度 来 对 固 有 过 程 分 类, 那 么 除 了 上 面 的 比 较 具 体 的 5 类 之 外, 还 可 以 从 固 有 过 程 对 数 组 的 作 用 方 式 的 角 度, 把 固 有 过 程 分 为 两 大 类 : 逐 元 过 程 和 变 换 过 程 逐 元 过 程 从 数 学 的 观 点 来 看, 这 种 过 程 的 计 算 对 象 并 不 是 数 组, 但 是 可 以 运 用 一 种 自 然 的 方 式 使 得 这 种 过 程 能 够 作 用 于 数 组 对 象, 并 且 得 到 相 同 形 状 的 数 组 结 果 也 就 是 使 得 该 过 程 分 别 作 用 于 数 组 的 每 个 元 素, 把 所 有 的 过 程 结 果 再 集 合 起 来 作 为 结 果 数 组 固 有 过 程 当 中 的 大 部 分 都 属 于 逐 元 过 程, 包 括 : 转 换 函 数 ; 计 算 函 数 ( 除 了 REPEAT, TRIM,DOT_PRODUCT,MATMUL 之 外 ); 子 例 行 程 序 MVBITS 其 他 的 所 有 固 有 过 程 就 都 不 是 逐 元 过 程 了 变 换 过 程 固 有 过 程 里 面 逐 元 过 程 之 外 的 所 有 过 程 都 称 为 变 换 过 程, 因 为 从 它 们 的 定 义 的 实 质 上 看, 就 是 作 用 于 一 个 数 组 数 据 对 象, 得 到 一 个 标 量 或 者 数 组 结 果, 也 就 是 一 个 变 换 的 过 程, 而 不 是 单 独 地 作 用 于 每 个 元 素 因 此 除 了 函 数 NULL 之 外, 所 有 的 变 换 过 程 或 者 是 具 有 一 个 取 数 组 值 的 哑 元, 或 者 是 具 有 一 个 取 数 组 值 的 实 元, 它 们 对 数 组 的 作 用 都 是 某 种 整 体 变 换 作 用 例 如 对 于 向 量 的 乘 积, 就 不 能 逐 个 元 素 地 进 行 固 有 过 程 的 引 用 正 如 一 般 过 程 的 引 用 一 样, 可 以 使 用 关 键 词 变 元 由 于 某 些 固 有 过 程 的 变 元 是 可 选 项, 因 此 使 用 关 键 词 能 够 省 略 相 应 的 实 元 关 键 词 变 元 也 就 是 固 有 过 程 的 哑 元 名 称, 在 少 数 情 况 下, 同 一 个 名 称 会 出 现 在 不 同 的 固 有 过 程, 不 过 这 些 名 称 基 本 上 表 示 了 相 似 的 功 能, 因 此 不 会 带 来 什 么 实 质 问 题 这 几 个 名 称 列 举 如 下 DIM; DIM 主 要 用 于 数 组 简 化 函 数 以 及 其 他 一 些 数 组 函 数, 表 示 在 函 数 的 作 用 对 象 不 是 整 个 数 组 的

256 情 况 下, 数 组 的 哪 个 维 度 被 过 程 作 用 DIM 取 值 为 标 量 整 型 值, 并 且 常 常 是 可 选 变 元 MASK; MASK 总 是 表 示 一 种 过 滤 器 的 作 用, 即 把 数 组 里 面 与 过 程 作 用 无 关 的 元 素 过 滤 掉, 以 免 耗 费 资 源 MASK 的 是 通 过 一 个 与 被 过 滤 数 组 相 同 形 状 的 逻 辑 型 数 组 来 行 使 过 滤 功 能 的 一 般 MASK 为 可 选 变 元 KIND; KI ND 一 般 用 于 转 换 函 数, 说 明 转 换 结 果 的 种 别 参 数 KIND 实 元 必 须 是 一 个 标 量 整 型 初 始 化 表 达 式, 一 般 是 可 选 的 BACK BACK 作 为 一 个 可 选 的 逻 辑 型 变 元 用 来 表 示 逆 序 过 程, 即 它 所 出 现 的 固 有 过 程 的 对 于 数 据 对 象 的 反 方 向 操 作 例 如 如 果 在 固 有 过 程 INDEX 当 中 出 现 了 BACK=.TRUE., 那 么 INDEX 的 搜 索 操 作 就 必 须 与 正 常 方 向 相 反, 即 从 字 符 串 的 右 端 开 始 注 意 固 有 函 数 的 非 指 针 哑 元 都 具 有 INTENT(IN) 的 属 性, 而 指 针 哑 元 则 不 能 改 变 其 关 联 的 实 元 或 目 标 表 14-1 种 过 程 的 过 程 名 称 以 及 相 应 的 变 元 属 性 类 过 程 名 称 种 过 程 名 称 及 其 变 元 种 过 程 变 元 类 型 ABS ABS(A) 默 认 实 型 CABS(A) 默 认 复 型 DABS(A) 双 精 度 实 型 IABS(A) 默 认 整 型 ACOS ACOS(X) 默 认 实 型 DACOS(X) 双 精 度 实 型 AIMAG AIMAG(Z) 默 认 复 型 AINT AINT(A) 默 认 实 型 DINT(A) 双 精 度 实 型 ANINT ANINT(A) 默 认 实 型 DNINT(A) 双 精 度 实 型 ASIN ASIN(X) 默 认 实 型 DSIN(X) 双 精 度 实 型 ATAN ATAN(A) 默 认 实 型 DTAN(A) 双 精 度 实 型 ATAN2 ATAN2(A) 默 认 实 型 DTAN2(A) 双 精 度 实 型 CHAR *CHAR(I) 默 认 整 型 COS COS(X) 默 认 实 型 CCOS(X) 默 认 复 型 DCOS(X) 双 精 度 实 型 CONJG CONJG(X) 默 认 复 型 COSH COSH(X) 默 认 实 型

257 DCOSH(X) 双 精 度 实 型 DIM DIM(X,Y) 默 认 实 型 IDIM(X,Y) 默 认 整 型 DPROD DPROD(X,Y) 默 认 实 型 EXP EXP(X) CEXP(X) DEXP(X) 默 认 实 型 默 认 复 型 双 精 度 实 型 ICHAR *ICHAR(C) 默 认 字 符 型 INDEX INDEX(STRING,SUBSTRING) 默 认 字 符 型 INT *INT(A) *IFIX(A) *IDINT(A) 默 认 实 型 默 认 实 型 双 精 度 实 型 LEN LEN(STRING) 默 认 字 符 型 LGE *LGE(STRING_A,STRING_B) 默 认 字 符 型 LGT *LGT(STRING_A,STRING_B) 默 认 字 符 型 LLE *LLE(STRING_A,STRING_B) 默 认 字 符 型 LLT *LLT(STRING_A,STRING_B) 默 认 字 符 型 LOG LOG10 MAX 注 1 ALOG(X) CLOG(X) DLOG(X) ALOG10(X) DLOG10(X) *MAX0(A1,A2,A3, ) *AMAX1(A1,A2,A3, ) *DMAX1(A1,A2,A3, ) *MAX1(A1,A2,A3, ) 注 2 *AMAX0(A1,A2,A3, ) 默 认 实 型 默 认 复 型 双 精 度 实 型 默 认 实 型 双 精 度 实 型 默 认 整 型 默 认 实 型 双 精 度 实 型 默 认 实 型 默 认 整 型 MIN *MIN0(A1,A2,A3, ) 默 认 整 型 *AMIN1(A1,A2,A3, ) 默 认 实 型 注 1 *DMIN1(A1,A2,A3, ) *MIN1(A1,A2,A3, ) 双 精 度 实 型 默 认 实 型 注 2 *AMIN0(A1,A2,A3, ) 默 认 整 型 MOD NINT REAL MOD(A,P) AMOD(A,P) DMOD(A,P) NINT(A) IDNINT(A) *REAL(A) *FLOAT(A) *SNGL(A) 默 认 整 型 默 认 实 型 双 精 度 实 型 默 认 实 型 双 精 度 实 型 默 认 整 型 默 认 整 型 双 精 度 实 型 SIGN SIGN(A,B) 默 认 实 型

258 DSIGN(A,B) ISIGN(A,B) 双 精 度 实 型 默 认 整 型 SIN SIN(X) 默 认 实 型 CSIN(X) 默 认 复 型 DSIN(X) 双 精 度 实 型 SINH SINH(X) 默 认 实 型 DSINH(X) 双 精 度 实 型 SQRT SQRT(X) 默 认 实 型 CSQRT(X) SDQRT(X) 默 认 复 型 双 精 度 实 型 TAN TAN(X) DTAN(X) 默 认 实 型 双 精 度 实 型 TANH TANH(X) 默 认 实 型 DTANH(X) 双 精 度 实 型 注 1: 该 函 数 没 有 相 应 的 类 过 程 名 称, 它 的 结 果 为 默 认 整 型 注 2: 该 函 数 没 有 相 应 的 类 过 程 名 称, 它 的 结 果 为 默 认 实 型 注 3: 标 注 星 号 * 的 函 数 不 能 用 作 实 元 注 4 : 某 些 种 过 程 名 称 与 其 类 过 程 名 称 一 样 14.2 数 据 的 表 示 模 式 一 些 固 有 函 数 的 计 算 结 果 是 与 数 据 的 表 示 模 式 有 关 的, 因 此 在 这 里 我 们 首 先 给 出 数 据 的 3 种 表 示 模 式 一 个 数 据 值 的 表 示 模 式, 决 定 了 它 的 存 储 空 间 以 及 表 示 精 度, 包 括 如 下 3 种 模 式 : 位 模 式 ; 整 数 模 式 ; 实 数 模 式 有 关 数 值 的 表 示 模 式 的 信 息 对 于 很 多 的 计 算 都 是 非 常 重 要 的, 因 为 计 算 机 的 数 据 表 示 的 离 散 性 本 质, 使 得 我 们 不 能 期 望 很 多 的 数 学 计 算 能 够 在 计 算 机 上 面 具 有 通 常 的 行 为, 例 如 级 数 的 收 敛 问 题 涉 及 到 几 乎 所 有 的 微 积 分 数 值 计 算, 由 于 实 数 在 计 算 机 里 面 并 不 是 可 以 无 限 位 地 表 示, 所 以 必 须 知 道 某 个 具 体 的 系 统 所 能 够 达 到 的 精 度, 才 能 够 判 断 相 应 的 计 算 能 够 做 到 什 么 程 度 所 谓 位 模 式 就 是 把 一 个 整 型 标 量 非 负 的 数 据 对 象 B 表 示 为 一 个 2 进 制 的 数 字 序 列 : bbb... b n 1, 其 中 的 每 个 数 字 取 0 或 1 把 这 样 一 个 数 字 序 列 转 换 为 10 进 制 数 值, 采 用 如 下 的 公 式 : n 1 B= b k 2 所 谓 整 数 模 式 的 数 值 表 示 形 式 是 一 个 任 意 进 制 的 数 字 序 列, 但 可 以 具 有 正 负 号, 不 能 带 有 小 数 点, 转 换 为 19 进 制 的 公 式 为 : k k= 0

259 n 1 I = s b r k= 0 k k 其 中 : s 为 +1 或 -1; r 为 大 于 1 的 整 数 ; bk 0 b 为 整 数 并 且 k < r 所 谓 实 数 模 式 采 用 如 下 的 公 式 : n e k R= sr bk r k= 1 其 中 : s 为 +1 或 -1; r 为 大 于 1 的 整 数 ; n 为 尾 数 部 分 数 字 的 数 目, 是 一 个 大 于 1 的 整 数 ;, bk 0 b 为 整 数 并 且 k < r ; e 是 某 个 最 大 值 与 最 小 值 之 间 的 整 数, 表 示 某 种 实 现 所 能 够 表 示 的 数 值 范 围 实 数 的 一 般 实 现 方 式 是 按 照 IEEE 2 进 制 浮 点 标 准, 在 单 精 度 模 式 时, 取 : r=2 n= e 128 这 样 一 个 实 数 的 尾 数 部 分 包 括 符 号 一 起 就 占 据 了 24 位, 而 它 的 指 数 部 分 包 括 符 号 一 起 占 据 了 8 位, 因 此 一 个 单 精 度 实 数 表 示 要 占 据 32 位 注 意 e 不 能 取 -126,-127,-128 这 些 数 值, 因 为 还 需 要 额 外 地 表 示 溢 出,0, 以 及 NaNs, 即 非 法 值 14.3 查 询 函 数 和 数 字 操 作 函 数 本 节 所 讨 论 的 函 数 并 不 是 一 般 概 念 下 对 变 元 进 行 某 种 计 算 的 函 数, 它 的 返 回 值 是 用 来 反 映 有 关 变 元 的 状 态 与 性 质 的 各 种 信 息 所 谓 查 询 函 数 返 回 的 是 有 关 变 元 的 数 据 类 型 的 信 息, 因 此 返 回 值 与 变 元 的 具 体 取 值 无 关, 而 引 用 这 种 函 数 的 实 元 也 不 需 要 预 先 定 义 所 谓 数 字 操 作 函 数 返 回 的 是 与 实 元 取 值 相 关 的 数 值 环 境 信 息, 因 此 引 用 这 种 函 数 的 实 元 就 需 要 给 出 定 义 根 据 所 查 询 信 息 的 不 同 种 类, 查 询 函 数 还 可 以 分 为 7 类, 分 别 说 明 如 下 字 符 查 询 函 数 这 类 函 数 只 包 含 一 个 固 有 函 数 LEN 它 返 回 作 为 字 符 串 的 变 元 的 字 符 长 度 值 该 长 度 值 是 在 变 元 数 据 类 型 声 明 里 面 给 出 的, 因 此 变 元 不 需 要 给 出 具 体 的 取 值, 就 能 够 使 用 该 查 询 函 数

260 对 于 哑 长 度 的 哑 元,LEN 返 回 的 是 其 实 元 的 长 度 值 位 查 询 函 数 这 类 函 数 只 包 含 一 个 固 有 函 数 BIT_SIZE 如 果 一 个 整 型 标 量 数 据 对 象 采 用 了 位 模 式 的 表 示 模 式, 那 么 使 用 该 函 数, 就 能 够 返 回 其 变 元 的 位 模 式 表 示 公 式 里 面 的 n 的 值 其 变 元 只 需 要 是 一 个 整 数 即 可, 不 需 要 给 出 定 义 种 别 查 询 函 数 这 类 函 数 包 含 3 个 固 有 函 数 KIND,SELECTED_INT_KIND, 和 SELECTED_REAL_KIND 这 3 个 固 有 函 数 都 返 回 变 元 的 种 别 参 数, 而 变 元 的 具 体 取 值 都 不 需 要 预 先 给 出 但 它 们 的 变 元 的 取 值 范 围 是 不 同 的 KIND 的 变 元 可 以 是 任 意 的 固 有 数 据 类 型 ; SELECTED_INT_KIND 的 变 元 是 整 型 变 量, 它 返 回 的 是 表 示 10 进 制 幂 次 范 围 的 种 别 参 数 ; SELECTED_REAL_KIND 的 变 元 是 实 型 变 量, 它 返 回 的 是 表 示 10 进 制 精 度 与 10 进 制 幂 次 范 围 的 种 别 参 数 数 组 查 询 函 数 这 类 函 数 包 含 5 个 固 有 函 数, 它 们 返 回 的 都 是 变 元 数 组 的 各 种 属 性 参 数 它 们 的 名 称 以 及 返 回 值 列 举 在 下 表 14-2 表 14-2 数 组 查 询 函 数 的 名 称 以 及 返 回 值 函 数 名 称 ALLOCATED LBOUND SHAPE SIZE UBOUND 返 回 值 变 元 数 组 的 分 配 状 态 一 个 数 组 或 数 组 的 一 个 维 度 的 下 界 数 组 在 每 个 维 度 上 的 元 素 的 数 目 数 组 的 尺 度, 即 其 全 部 元 素 的 数 目 一 个 数 组 或 数 组 的 一 个 维 度 的 上 界 这 5 个 函 数 的 变 元 的 取 值 都 不 需 要 给 出, 但 如 果 在 SIZE,LBOUND,UBOUND 这 些 函 数 里 面 使 用 可 选 变 元 DIM, 则 DIM 的 值 需 要 预 先 定 义 指 针 关 联 状 态 查 询 函 数 这 类 函 数 只 包 含 一 个 固 有 函 数 ASSOCIATED, 该 函 数 的 返 回 值 为 逻 辑 型 值, 根 据 该 函 数 所 带 有 的 可 选 变 元 的 不 同 情 况, 其 返 回 值 也 分 为 以 下 3 种 情 况 : 如 果 不 出 现 可 选 变 元, 那 么 当 变 元 具 有 指 针 属 性, 并 且 关 联 到 一 个 目 标 时, 返 回 值 为 真 如 果 出 现 非 指 针 的 可 选 变 元, 那 么 当 变 元 具 有 指 针 属 性, 并 且 关 联 到 该 可 选 变 元 时, 返 回 值 为 真 如 果 出 现 可 选 变 元, 并 且 该 可 选 变 元 也 是 指 针, 那 么 当 变 元 具 有 指 针 属 性, 并 且 与 可 选 变 元 都 关 联 到 同 一 个 目 标 时, 返 回 值 为 真 变 元 存 在 查 询 函 数 这 类 函 数 只 包 含 一 个 固 有 函 数 PRESENT 它 的 变 元 必 须 是 一 个 可 选 哑 元 的 名 称 函 数 的 返 回 值 为 逻 辑 型 值 当 作 为 变 元 的 哑 元 具 有 相 应 的 实 元 时, 函 数 返 回 值 为 真, 否 则 为 假 数 值 模 式 查 询 函 数 这 类 函 数 包 含 9 个 固 有 函 数, 它 们 返 回 的 都 是 变 元 在 整 数 模 式 和 实 数 模 式 表 示 下 的 各 种 参 数 它 们 的 名 称 以 及 返 回 值 列 举 在 下 表 14-3 表 14-3 数 值 模 式 查 询 函 数 的 名 称 以 及 返 回 值 函 数 名 称 返 回 值

261 DIGITS EPSILON HUGE 整 数 模 式 和 实 数 模 式 公 式 里 面 的 n 值 实 变 元 的 1 n r 的 值 按 照 整 数 模 式 和 实 数 模 式 所 能 够 表 示 的 最 大 数 值 MINEXPONENT MAXEXPONENT 实 变 元 所 能 够 取 得 的 最 小 的 e 值 实 变 元 所 能 够 取 得 的 最 大 的 e 值 PRECISION 实 数 或 复 数 的 10 进 制 精 度 RADIX 整 数 模 式 和 实 数 模 式 公 式 里 面 的 基 数 值 RANGE 整 数, 实 数 或 复 数 的 10 进 制 幂 次 范 围 TINY 注 意 : 这 些 函 数 的 变 元 都 不 需 要 预 先 定 义 实 变 元 所 能 够 取 得 的 最 小 的 正 数 值 它 们 都 是 类 过 程, 因 为 它 们 都 能 够 用 于 任 意 类 型 的 实 变 元 除 了 EPSILON,MINEXPONE NT,MAXEXPONENT 这 3 个 函 数 之 外, 它 们 都 能 够 用 于 任 意 类 型 的 整 型 变 元 与 数 值 模 式 查 询 函 数 类 似, 数 字 操 作 函 数 同 样 是 基 于 数 值 的 表 示 模 式 得 到 返 回 值 的, 但 是 它 们 最 大 的 差 别 在 于, 数 值 模 式 查 询 函 数 所 作 用 的 变 元 代 表 了 整 个 数 值 类 型, 返 回 的 是 有 关 整 个 数 值 类 型 的 表 示 模 式 参 数, 而 数 字 操 作 函 数 所 作 用 的 变 元 只 是 在 某 种 特 定 表 示 模 式 下 的 单 个 的 具 体 的 数 值, 因 此 它 的 变 元 需 要 在 函 数 引 用 之 前 予 以 定 义 数 字 操 作 函 数 包 括 7 种, 它 们 的 名 称 以 及 返 回 值 列 举 在 下 表 14-4 函 数 名 称 EXPONENT FRACTION NEAREST RRSPACING SCAL E SET_EXPONENT SPACING 表 14-4 数 字 操 作 函 数 的 名 称 以 及 返 回 值 返 回 值 实 数 值 的 实 数 模 式 表 示 公 式 里 面 的 e 值 实 数 值 的 小 数 部 分 系 统 所 能 够 表 示 的 在 给 定 方 向 上 最 接 近 第 一 个 变 元 的 数 值 变 元 附 近 的 最 小 间 距 的 倒 数 用 给 定 的 值 替 换 e 值 把 e 值 设 置 为 给 定 的 值 变 元 附 近 的 最 小 绝 对 间 距 这 7 个 函 数 只 能 应 用 于 实 数 环 境, 变 元 可 以 是 任 意 类 型 的 实 数 值, 而 且 都 是 逐 元 函 数 14.4 转 换 函 数, 置 空 函 数 NULL 以 及 传 递 函 数 1. 转 换 函 数 所 谓 转 换 函 数 就 是 能 够 把 某 种 数 据 对 象 的 类 型 与 种 别 的 某 种 组 合 转 换 为 另 外 一 种 类 型 与 种 别 的 组 合 所 有 这 些 函 数 都 是 类 函 数, 因 为 它 们 需 要 处 理 可 能 的 各 种 类 型 与 种 别 的 组 合, 同 时, 它 们 也 都 是 逐 元 的

262 转 换 函 数 包 括 15 个 固 有 函 数, 它 们 的 名 称 以 及 返 回 值 列 举 在 下 表 14-5 表 14-5 转 换 函 数 的 名 称 以 及 返 回 值 函 数 名 称 返 回 值 ACHAR AIMAG AINT A NINT C HAR C MPLX C ONJG D BLE IACHAR IBI TS ICHAR INT LOGICAL NINT REAL 在 ASCII 字 符 集 的 指 定 位 置 的 字 符 复 数 的 虚 部 把 一 个 实 数 截 断 为 实 型 整 数 把 一 个 实 数 截 断 为 最 接 近 的 实 型 整 数 在 系 统 字 符 集 的 指 定 位 置 的 字 符 与 变 元 相 应 的 复 数 值 复 数 变 元 的 共 轭 复 数 与 变 元 相 应 的 双 精 度 值 指 定 字 符 在 ASCII 字 符 集 里 面 的 位 置 以 位 表 示 的 整 型 变 元 的 指 定 子 串 指 定 字 符 在 系 统 字 符 集 里 面 的 位 置 变 元 被 截 断 得 到 的 整 型 值 与 变 元 相 应 的 逻 辑 型 值 把 一 个 实 数 截 断 为 最 接 近 的 整 型 值 与 变 元 相 应 的 实 型 值 2. 置 空 函 数 NULL 固 有 函 数 NULL 返 回 一 个 能 够 赋 值 给 指 针 变 量 的 去 关 联 的 指 针 尽 管 它 的 功 能 与 NULLIFY 语 句 的 功 能 一 样, 但 是 它 们 的 应 用 场 合 不 同 : NULL 函 数 应 用 于 说 明 语 句 当 中, 以 便 对 指 针 变 量 进 行 初 始 化, 还 可 以 在 派 生 类 型 定 义 当 中 定 义 其 指 针 成 员 的 默 认 初 始 化 ; NULLIF Y 语 句 作 为 可 执 行 语 句 应 用 于 程 序 当 中 固 有 函 数 NULL 为 变 换 函 数 而 不 是 逐 元 函 数 3. 传 递 函 数 TRANSFER 固 有 函 数 TRANSFER 能 够 在 数 据 的 不 同 类 型 与 种 别 组 合 模 式 之 间 进 行 纯 粹 二 进 制 数 据 传 递, 而 不 需 要 进 行 烦 琐 的 类 型 与 种 别 组 合 模 式 的 转 换 当 一 个 固 有 函 数 TRANSFER 作 用 于 一 个 源 数 据 时, 它 的 二 进 制 表 示 形 式, 也 就 是 它 的 物 理 存 储 模 式 被 传 递 为 函 数 结 果, 而 函 数 结 果 的 类 型 与 种 别 组 合 模 式 则 由 函 数 的 MOLD 变 元 决 定 这 样 在 传 递 过 程 当 中 就 根 本 不 需 要 进 行 类 型 与 种 别 组 合 模 式 的 转 换 TRANSFER 为 变 换 函 数, 而 不 是 逐 元 函 数, 它 的 值 常 常 是 不 具 有 可 移 植 性 的 14.5 计 算 函 数 所 谓 计 算 函 数 都 是 针 对 变 元 的 计 算, 包 括 47 个 固 有 函 数, 分 为 如 下 三 类 : 数 值 计 算 函 数 ; 除 了 计 算 机 所 特 有 的 数 据 类 型 以 及 精 度 限 制 之 外, 数 值 计 算 函 数 可 以 理 解 为 就 是 相 应 的 数 学 计 算 函 数, 数 值 计 算 函 数 表 示 了 几 乎 所 有 最 常 用 的 基 本 数 学 函 数

263 字 符 计 算 函 数 ; 字 符 计 算 函 数 的 主 要 功 能 就 是 对 字 符 串 进 行 编 辑 位 计 算 函 数 位 计 算 函 数 基 于 数 据 的 位 模 式 表 示 进 行 操 作 与 计 算 这 3 类 固 有 函 数 的 名 称 以 及 返 回 值 分 别 列 举 在 下 面 的 表 14-6, 表 14-7, 和 表 14-8 里 面 ABS ACOS ASIN ATAN ATAN2 CEILING COS COSH 函 数 名 称 表 14-6 数 值 计 算 函 数 的 名 称 以 及 返 回 值 变 元 的 绝 对 值 变 元 的 反 余 弦 值 变 元 的 反 正 弦 值 变 元 的 反 正 切 值 返 回 值 复 数 变 元 (X,Y) 的 幅 角 弧 度 值 大 于 或 等 于 变 元 值 的 最 小 整 数 值 变 元 的 余 弦 值 变 元 的 双 曲 余 弦 值 DIM 如 果 2 个 变 元 的 差 为 正 数, 则 返 回 差 值, 否 则 返 回 0 DOT_PRODUCT DPROD EXP FLOOR LOG LOG10 MATMUL MAX MIN MOD MODULO SIGN SIN SINH SQRT TAN TANH 2 个 秩 为 1 的 数 组 的 点 积 2 个 单 精 度 数 值 的 双 精 度 乘 积 自 然 指 数 函 数 小 于 或 等 于 变 元 值 的 最 大 整 数 值 自 然 对 数 函 数 以 10 为 底 的 对 数 函 数 矩 阵 乘 积 一 个 值 集 合 里 面 的 最 大 值 一 个 值 集 合 里 面 的 最 小 值 求 余 函 数, 其 符 号 与 第 一 个 变 元 的 符 号 一 致 求 余 函 数, 其 符 号 与 第 二 个 变 元 的 符 号 一 致 赋 予 给 定 值 给 定 的 符 号 变 元 的 正 弦 值 变 元 的 双 曲 正 弦 值 变 元 的 平 方 根 变 元 的 正 切 值 变 元 的 双 曲 正 切 值 表 14-7 字 符 计 算 函 数 的 名 称 以 及 返 回 值 函 数 名 称 A DJUSTL ADJUSTR INDEX 返 回 值 把 字 符 串 左 边 的 空 格 移 到 它 的 右 边 把 字 符 串 右 边 的 空 格 移 到 它 的 左 边 一 个 子 串 在 给 定 字 符 串 里 面 的 位 置

264 LEN_TRIM 删 除 尾 部 空 格 后 的 字 符 串 长 度 LGE 基 于 ASCII 序 列 的 大 于 或 等 于 的 比 较 LGT 基 于 ASCII 序 列 的 大 于 的 比 较 LLE LLT REPEAT SCAN TRIM VERIFY 基 于 ASCII 序 列 的 小 于 或 等 于 的 比 较 基 于 ASCII 序 列 的 小 于 的 比 较 重 复 连 接 字 符 串 扫 描 一 个 字 符 串 以 获 得 给 定 字 符 串 在 其 中 的 位 置 删 除 尾 部 空 格 后 得 到 的 字 符 串 给 出 不 属 于 指 定 字 符 集 里 面 的 字 符 在 字 符 串 里 面 出 现 的 位 置 表 14-8 位 计 算 函 数 的 名 称 以 及 返 回 值 函 数 名 称 返 回 值 BTEST 整 型 变 元 在 指 定 的 位 上 面 的 值 IAND 2 个 整 型 变 元 的 逻 辑 AND 运 算 的 结 果 IBCLR 把 一 个 整 型 变 元 的 指 定 的 位 上 的 值 清 0 IBSET 把 一 个 整 型 变 元 的 指 定 的 位 上 的 值 设 置 为 1 IEOR 2 个 整 型 变 元 的 逻 辑 排 除 OR 运 算 的 结 果 IOR 2 个 整 型 变 元 的 逻 辑 包 含 OR 运 算 的 结 果 ISHFT 对 变 元 进 行 逻 辑 移 位 ISHFTC 对 变 元 进 行 逻 辑 循 环 移 位 NOT 变 元 的 逻 辑 补 注 意 : 计 算 函 数 当 中 除 了 LGE,LGT,LLE,LLT 之 外 都 是 类 过 程 计 算 函 数 当 中 除 了 DOT_PRODUCT,MATMUL,REPEAT 之 外 都 是 逐 元 过 程 位 计 算 函 数 的 结 果 不 可 移 植 14.6 数 组 函 数 数 组 函 数 包 括 17 个 固 有 函 数, 根 据 它 们 的 功 能 可 以 分 为 5 类 如 下 : 数 组 简 化 函 数 ; 数 组 构 造 函 数 ; 数 组 重 组 函 数 ; 数 组 操 作 函 数 ; 数 组 定 位 函 数 这 5 类 函 数 的 名 称 以 及 它 们 的 返 回 值 分 别 列 举 如 下 1. 数 组 简 化 函 数 所 谓 数 组 简 化 函 数, 从 形 式 上 都 是 把 一 个 数 组 经 过 计 算 之 后 得 到 一 个 标 量, 或 者 是 得 到 一 个 秩 为 1 的 数 组, 它 们 的 的 名 称 以 及 返 回 值 见 表 14-9

265 表 14-9 数 组 简 化 函 数 的 名 称 以 及 返 回 值 函 数 名 称 ALL ANY COUNT MAXVAL MINVAL PRODUCT SUM 返 回 值 如 果 变 元 数 组 的 所 有 元 素 都 是 真 则 取 真 值 如 果 变 元 数 组 的 元 素 当 中 存 在 一 个 真 值 则 取 真 值 变 元 数 组 的 元 素 当 中 取 真 值 的 元 素 的 数 目 变 元 数 组 的 元 素 当 中 的 最 大 值 变 元 数 组 的 元 素 当 中 的 最 小 值 变 元 数 组 的 元 素 的 乘 积 变 元 数 组 的 元 素 的 和 2. 数 组 构 造 函 数 所 谓 数 组 构 造 函 数 都 是 从 变 元 数 组 的 元 素 出 发 得 到 一 个 新 的 数 组, 它 们 的 的 名 称 以 及 返 回 值 见 表 表 数 组 构 造 函 数 的 名 称 以 及 返 回 值 函 数 名 称 MERGE PACK SPREAD UNPACK 返 回 值 在 过 滤 器 的 控 制 下 组 合 2 个 合 适 的 数 组 把 一 个 过 滤 了 的 数 组 封 装 为 一 个 向 量 通 过 复 制 某 个 维 度 而 得 到 增 加 维 度 的 数 组 从 一 个 向 量 还 原 为 一 个 过 滤 了 的 数 组 3. 数 组 重 组 函 数 数 组 重 组 函 数 只 包 含 一 个 固 有 函 数 RESHAPE, 它 的 功 能 是 把 一 个 秩 为 1 的 数 组 的 元 素 重 组 为 一 个 给 定 形 状 的 数 组 4. 数 组 操 作 函 数 数 组 操 作 函 数 对 变 元 数 组 的 元 素 进 行 重 新 排 列, 它 们 的 的 名 称 以 及 返 回 值 见 表 表 数 组 操 作 函 数 的 名 称 以 及 返 回 值 函 数 名 称 CSHIFT EOSHIFT TRANSPOSE 数 组 元 素 的 循 环 移 位 数 组 元 素 的 移 位 变 元 数 组 的 矩 阵 转 置 返 回 值 5. 数 组 定 位 函 数 数 组 定 位 函 数 给 出 数 组 元 素 里 面 的 最 大 值 或 最 小 值 在 数 组 当 中, 或 在 数 组 的 某 个 维 度 当 中 的 位 置, 它 们 的 的 名 称 以 及 返 回 值 见 表 表 数 组 定 位 函 数 的 名 称 以 及 返 回 值 MAXLOC 函 数 名 称 包 含 最 大 元 素 的 秩 为 1 的 数 组 返 回 值

266 MINLOC 包 含 最 小 元 素 的 秩 为 1 的 数 组 14.7 固 有 子 例 行 程 序 固 有 子 例 行 程 序 都 只 能 通 过 CALL 语 句 来 引 用, 而 不 能 作 为 实 元 传 递, 因 为 它 们 都 没 有 特 定 名 称 固 有 子 例 行 程 序 一 共 有 6 个, 分 别 说 明 如 下 : CPU_TIME 该 固 有 子 例 行 程 序 返 回 以 秒 为 单 位 的 处 理 器 时 间, 它 不 包 含 具 有 INTENT(OUT) 属 性 的 变 元 DATE_AND_TIME 该 固 有 子 例 行 程 序 返 回 日 期 与 时 间 信 息 作 为 一 些 具 有 INTENT(OUT) 属 性 的 变 元 的 值 MVBITS 该 固 有 子 例 行 程 序 把 一 个 二 进 制 码 序 列 从 一 个 整 型 数 据 对 象 复 制 到 另 一 个 整 型 数 据 对 象 该 固 有 子 例 行 程 序 是 唯 一 的 逐 元 固 有 子 例 行 程 序 RANDOM_NUMBER 该 固 有 子 例 行 程 序 返 回 一 个 伪 随 机 数 值 或 伪 随 机 数 组 作 为 变 元 的 取 值 表 面 看 来 它 应 该 可 以 作 为 一 个 函 数, 但 是 实 际 上 它 具 有 后 效, 即 它 每 产 生 一 个 伪 随 机 数 结 果, 都 会 影 响 它 底 下 的 伪 随 机 数 生 成 器 的 变 量 的 取 值, 因 此 它 不 是 纯 过 程, 而 固 有 函 数 必 须 是 纯 过 程 RANDOM_SEED 该 固 有 子 例 行 程 序 同 样 返 回 一 个 伪 随 机 数 值 或 伪 随 机 数 组 作 为 变 元 的 取 值 但 它 还 允 许 对 它 底 下 的 伪 随 机 数 生 成 器 的 变 量 进 行 特 定 的 初 始 化 或 恢 复 原 来 的 取 值 SYSTEM_CLOCK 该 固 有 子 例 行 程 序 以 整 数 形 式 返 回 处 理 器 时 钟 信 息, 可 以 有 几 种 格 式, 并 且 可 以 作 为 具 有 INTENT(OUT) 属 性 的 变 元 的 值 第 15 章 通 讯 计 算 的 过 程 除 了 指 令 的 序 列 之 外, 还 有 一 个 极 端 重 要 的 部 分, 就 是 通 讯 试 想 一 下 人 工 的 计 算 过 程, 几 乎 每 做 一 个 计 算 步 骤, 都 有 可 能 需 要 引 用 很 多 东 西, 例 如 其 他 计 算 的 结 果, 问 题 的 初 始 值, 其 他 的 现 成 公 式, 或 已 经 推 导 出 来 的 公 式, 或 者 引 用 别 人 的 计 算 成 果 等 等, 这 种 引 用 在 本 质 上 就 是 通 讯, 即 一 个 相 对 独 立 的 计 算 步 骤, 或 计 算 过 程, 都 不 可 能 是 真 正 独 立 的, 它 总 是 需 要 得 到 来 自 外 部 的 信 息, 无 论 是 外 部 的 数 据, 还 是 外 部 的 计 算, 只 要 是 叫 得 出 名 字 的 东 西, 都 有 可 能 被 用 到 而 该 计 算 步 骤 或 计 算 过 程 本 身, 不 也 是 有 可 能 被 别 的 计 算 所 使 用 吗! 当 然 这 一 切 都 是 通 过 草 稿 纸, 通 过 我 们 的 记 忆, 通 过 论 文 来 进 行 的 这 就 是 计 算 当 中 的 通 讯, 通 过 所 有 这 些 通 讯 才 能 使 得 计 算 成 为 一 个 整 体, 才 能 使 得 计 算 真 正 是 面 向 了 本 来 是 一 个 整 体 的 真 实 世 界 的 问 题 相 应 的, 当 我 们 使 用 FORT RAN 语 言 来 描 述 计 算 任 务 的 时 候, 它 同 样 需 要 描 述 其 中 的 通 讯 过

267 程, 而 且 还 得 是 严 格 地 把 一 切 通 讯 过 程 都 毫 无 遗 漏 地 描 述 出 来 同 样 地, 一 个 FORTRAN 程 序 正 是 通 过 这 些 通 讯 而 把 所 有 程 序 单 位, 乃 至 所 有 的 语 句 或 指 令 单 位, 都 连 接 起 来, 才 能 构 成 一 个 能 够 解 决 问 题 的 计 算 过 程 那 么 这 种 通 讯 利 用 FORTRAN 语 言 是 如 何 进 行 的 呢? 还 是 让 我 们 回 到 人 工 计 算 的 过 程, 因 为 本 质 上, 一 个 FORTRAN 计 算 程 序 描 述 的 就 是 一 个 人 工 计 算 过 程 首 先 我 们 需 要 对 想 使 用 的 对 象 命 名, 才 能 称 呼 它 们, 然 后 才 谈 得 上 进 行 引 用 然 而 我 们 不 能 够 指 望 给 世 界 上 的 每 一 个 具 体 对 象 都 给 予 一 个 唯 一 的 名 称, 那 么 做 既 不 现 实, 也 忽 略 了 事 物 之 间 所 具 有 的 紧 密 联 系 因 此 在 同 一 个 名 称 可 以 称 呼 不 同 的 对 象 的 情 况 下, 我 们 需 要 一 个 约 定, 就 是 一 个 名 称 必 定 跟 随 有 关 该 名 称 的 有 效 范 围 的 说 明 在 给 所 有 的 对 象 起 了 合 适 的 名 称 之 后, 就 需 要 考 虑 建 立 在 不 同 的 场 合 里 面 出 现 的 对 象 之 间 的 联 系, 例 如 在 波 函 数 里 面 出 现 的 正 弦 函 数 与 在 交 流 电 电 流 公 式 里 面 出 现 的 正 弦 函 数, 因 为 它 们 的 名 称 一 样, 就 可 以 认 为 是 同 一 个 函 数 而 波 函 数 里 面 的 振 幅 和 交 流 电 电 流 公 式 里 面 的 振 幅, 尽 管 名 称 一 样, 却 不 能 够 应 用 于 同 样 的 公 式, 例 如 波 函 数 里 面 的 振 幅 可 以 引 用 到 几 率 幅 公 式 里 面, 而 几 率 幅 公 式 对 于 交 流 电 却 没 有 任 何 意 义 所 以 建 立 合 适 的, 明 确 的 关 联 是 第 3 个 重 要 的 任 务 最 后, 我 们 可 能 还 得 检 验 某 个 对 象 是 否 具 备 进 行 通 讯 的 资 格, 例 如 在 有 关 交 流 电 的 计 算 任 务 当 中, 如 果 不 小 心 引 用 了 几 率 幅 的 概 念, 显 然 它 没 有 任 何 用 处, 只 会 捣 乱, 因 此 检 验 一 个 对 象 是 否 具 备 良 好 的 定 义, 是 我 们 在 进 行 计 算 通 讯 的 同 时 不 可 遗 忘 的 任 务 好 了, 上 面 分 析 出 来 的 4 个 概 念 : 命 名, 名 称 的 有 效 范 围, 关 联, 良 好 的 定 义, 构 成 了 FORTRAN 语 言 描 述 通 讯 时 最 核 心 的 概 念 运 用 FORTRAN 语 言 来 表 达 相 应 的 意 思 就 是 : 名 称 ; 作 用 域 ; 关 联 ; 定 义 状 态 即 任 何 的 FORTRAN 程 序 里 面 的 对 象 都 需 要 给 予 一 个 名 称, 而 所 有 的 名 称 都 能 够 按 照 变 量 与 值 的 关 系, 建 立 相 对 的 层 级 结 构 作 用 域 就 是 一 个 FORTRAN 程 序 对 象 能 够 被 识 别, 被 访 问 的 程 序 单 位 的 范 围 关 联 就 是 在 相 同 名 称 或 不 同 名 称 下, 进 行 相 应 的 值 的 交 换 定 义 状 态 就 是 必 须 能 够 随 时 确 定 一 个 变 量 是 否 具 有 良 好 的 定 义, 从 而 能 够 判 别 基 于 该 变 量 的 通 讯 是 否 有 效 可 以 形 象 地 说, 这 4 个 概 念 完 备 地 描 述 了 程 序 的 数 据 流 的 一 言 一 行, 一 动 一 止 下 面 我 们 就 分 别 说 明 通 讯 的 这 4 个 核 心 概 念 15.1 通 讯 与 名 称 给 对 象 命 名 是 进 行 有 关 对 象 的 通 讯 的 前 提 ( 试 想 一 下 我 们 要 告 诉 别 人 起 火 了, 如 果 我 们 不 知 道 描 述 火 的 词 汇, 那 该 如 何 说 清 楚 意 思 呢?) 为 了 保 证 通 讯 时 不 发 生 歧 义, 最 极 端 的 做 法 就 是 给 世 界 上 的 每 一 个 对 象 给 予 一 个 唯 一 的 名 称 然 而 这 是 不 可 能 实 现 的, 因 为 世 界 是 无 限 大 的 不 过 即 使 在 有 限 的 范 围 内, 也 是 非 常 不 明 智 的 例 如 在 FORTRAN 语 言 里 面 已 经 预 先 定 义 了 名 称 SUM 的 涵 义, 即 用 名 称 SUM 来 命 名 一 个

268 固 有 函 数, 表 示 一 种 作 用 于 数 组 的 运 算 然 而 如 果 在 一 个 程 序 里 面, 并 没 有 涉 及 到 任 何 与 数 组 有 关 的 计 算, 那 么 我 们 完 全 可 以 安 全 地 使 用 名 称 SUM 来 形 象 地 命 名 一 个 自 定 义 的 运 算, 例 如 两 个 属 于 派 生 类 型 的 对 象 的 组 合 运 用 容 易 记 忆 的 英 语 词 汇 或 缩 写 来 表 示 具 有 相 应 涵 义 的 对 象, 这 是 一 种 良 好 的 编 程 习 惯, 不 能 为 了 避 免 名 称 的 重 复 而 被 迫 记 忆 大 量 的 名 称 又 例 如 一 个 大 型 的 FORTRAN 程 序, 事 实 上 是 无 法 由 一 个 人 编 写 完 成 的, 那 么 如 果 由 多 个 人 分 块 编 写 的 话, 又 如 何 能 够 保 证 他 们 使 用 的 名 称 是 绝 对 一 致 的 呢? 即 相 同 的 对 象 具 有 相 同 的 名 称, 不 同 的 对 象 具 有 不 同 的 名 称 这 对 于 每 个 小 程 序 单 位 都 有 成 千 上 万 个 语 句 的 大 型 程 序, 是 绝 对 不 现 实 的 要 求, 也 是 完 全 不 必 要 的 要 求 因 为 不 同 对 象 的 重 名 问 题, 可 以 很 轻 易 地 通 过 约 定 名 称 的 有 效 范 围 而 获 得 解 决, 这 就 是 下 节 讨 论 的 作 用 域 的 概 念 15.2 作 用 域 任 何 具 有 名 称 的 对 象 都 具 有 相 应 的 作 用 域, 也 就 是 存 在 一 个 明 确 的 约 定, 该 名 称 在 FORTRAN 程 序 的 哪 个 范 围 内, 是 被 识 别 为 该 对 象, 而 且 引 用 该 名 称 就 意 味 着 访 问 该 对 象 在 一 个 FORTRAN 程 序 里 面 明 显 具 有 名 称 的 对 象 包 括 变 量, 常 量, 过 程, 数 据 块 子 程 序, 模 块, 名 称 列 表 集 合 等 它 们 都 具 有 相 应 的 作 用 域 还 有 其 他 的 对 象, 例 如 算 符, 赋 值 符 号, 标 签, 输 入 输 出 单 位 编 目 等, 它 们 都 已 经 不 再 需 要 额 外 的 名 称, 因 为 这 些 对 象 在 被 定 义 出 来 时, 就 已 经 具 有 天 然 的 名 称, 因 此 它 们 也 具 有 相 应 的 作 用 域 对 象 的 作 用 域 可 以 大 到 包 括 整 个 程 序, 也 可 以 小 到 只 有 一 个 语 句 的 某 个 部 分 当 一 个 对 象 的 作 用 域 为 整 个 程 序 时, 该 对 象 就 称 为 全 局 对 象 例 如 一 个 程 序 里 面 的 外 部 过 程, 在 程 序 的 任 意 位 置, 都 可 以 随 时 引 用 它 的 名 称, 而 不 会 发 生 无 法 访 问 该 外 部 过 程 的 情 形 当 一 个 对 象 的 作 用 域 还 没 有 达 到 整 个 程 序 时, 该 对 象 就 称 为 局 部 对 象 例 如 语 句 标 签, 一 般 只 在 该 语 句 所 处 的 程 序 单 位 里 面 有 效 当 一 个 对 象 的 作 用 域 只 是 该 对 象 所 处 的 语 句, 甚 至 只 是 语 句 的 一 个 部 分 时, 该 对 象 就 称 为 语 句 对 象 例 如 语 句 函 数 的 哑 元 就 是 典 型 的 语 句 对 象 一 般 说 来, 如 果 一 个 对 象 的 作 用 域 恰 好 构 成 一 个 程 序 单 位, 那 么 相 应 的 作 用 域 也 称 为 作 用 域 单 位, 这 样 一 来, 许 多 更 小 型 的 作 用 域, 例 如 语 句 函 数,FORALL 结 构, 隐 式 DO 语 句 等, 就 不 能 称 为 作 用 域 单 位 了 作 用 域 单 位 一 般 有 如 下 三 种 情 形 : 派 生 类 型 定 义 是 一 个 作 用 域 单 位 ; 一 个 过 程 界 面 体, 在 排 除 其 中 可 能 的 派 生 类 型 定 义, 以 及 包 含 在 派 生 类 型 定 义 里 面 的 过 程 界 面 体 之 后, 构 成 一 个 作 用 域 单 位 ; 一 个 程 序 单 位, 或 者 子 程 序, 在 排 除 其 中 可 能 的 派 生 类 型 定 义, 过 程 界 面 体 以 及 包 含 在 其 中 的 子 程 序 之 后, 构 成 一 个 作 用 域 单 位 在 一 个 作 用 域 单 位 里 面 还 可 以 包 含 其 他 的 作 用 域 单 位, 不 过 这 种 包 含 关 系 不 完 全 与 结 构 之 间 的 嵌 套 关 系 相 同 因 为 具 有 包 含 与 被 包 含 关 系 的 两 个 作 用 域 单 位 可 以 出 现 如 下 两 种 情 形 : 被 包 含 的 作 用 域 单 位, 可 以 继 承 包 含 它 的 作 用 域 单 位 的 数 据 环 境 ; 例 如 派 生 类 型 定 义, 模 块 过 程, 内 部 过 程 等 都 继 承 包 含 自 身 的 作 用 域 单 位 的 隐 式 类 型 规 则 被 包 含 的 作 用 域 单 位 不 继 承 包 含 它 的 作 用 域 单 位 的 数 据 环 境

269 例 如 界 面 块 不 继 承 包 含 自 身 的 作 用 域 单 位 的 隐 式 类 型 规 则 因 此 在 某 些 情 形 下, 一 个 作 用 域 需 要 排 除 包 含 其 中 的 作 用 域 单 位 之 后 才 构 成 一 个 作 用 域 单 位 作 用 域 与 作 用 域 单 位 的 相 互 关 系 参 见 示 意 图 15-1 里 面 的 表 示 图 15-1 作 用 域 与 作 用 域 单 位 的 相 互 关 系 在 上 面 的 示 意 图 15-1 当 中, 最 大 的 方 框 表 示 一 个 FORTRAN 程 序, 它 表 示 了 一 个 整 体, 显 然 它 不 构 成 一 个 作 用 域 单 位 然 后 是 其 中 的 4 个 方 框, 分 别 表 示 1 个 主 程 序,2 个 外 部 过 程 A 和 D,1 个 模 块 E 它 们 都 是 作 用 域 单 位, 但 是 得 排 除 它 们 内 部 出 现 的 方 框, 即 内 部 过 程 B 和 C, 界 面 块, 派 生 类 型 定 义, 以 及 模 块 过 程 F 和 G 因 为 它 们 同 样 是 作 用 域 单 位 由 于 在 上 面 的 FORTRAN 程 序 例 子 当 中, 内 部 过 程 B 和 C, 界 面 块, 派 生 类 型 定 义, 以 及 模 块 过 程 F 和 G 的 内 部 不 再 出 现 内 部 过 程, 界 面 块, 派 生 类 型 定 义, 以 及 模 块 过 程, 所 以 它 们 都 不 再 需 要 排 除 什 么, 就 构 成 一 个 作 用 域 单 位 不 过 一 般 在 它 们 内 部 还 包 含 其 他 的 作 用 域 单 位 是 非 常 常 见 的 名 称 的 作 用 域 一 个 名 称 的 作 用 域 存 在 如 下 4 种 情 形 : 整 个 程 序, 即 该 名 称 为 全 局 性 的 ; 一 个 作 用 域 单 位, 即 该 名 称 为 局 部 性 的 ; 一 个 结 构, 即 一 个 FORTRAN 结 构 的 作 用 域 ; 一 个 语 句, 即 一 个 FORTRAN 语 句 或 语 句 的 某 个 部 分 作 为 作 用 域

270 下 面 按 照 范 围 从 大 到 小 的 顺 序 分 别 予 以 说 明 1. 全 局 情 形 能 够 具 有 全 局 性 名 称 的 对 象 包 括 : 主 程 序 ; 外 部 过 程 ; 模 块 ; 数 据 块 程 序 单 位 ; 公 用 块 正 是 因 为 这 些 对 象 的 名 称 具 有 全 局 性, 因 此 它 们 在 一 个 FORTRAN 程 序 内 部 不 能 使 用 相 同 的 名 称 2. 局 部 情 形 能 够 具 有 局 部 性 名 称 的 对 象 包 括 如 下 3 个 类 别 : 变 量, 常 量, 控 制 结 构, 语 句 函 数, 内 部 过 程, 模 块 过 程, 哑 过 程, 固 有 过 程, 自 定 义 类 过 程, 派 生 类 型 和 名 称 列 表 集 合 派 生 类 型 的 成 员 之 所 以 把 派 生 类 型 的 名 称 与 它 的 成 员 的 名 称 分 为 不 同 的 类 别, 是 因 为 不 同 名 称 的 派 生 类 型, 完 全 可 以 具 有 相 同 名 称 的 成 员 变 元 关 键 词 之 所 以 把 具 有 显 式 界 面 的 过 程 的 名 称 与 其 变 元 关 键 词 的 名 称 分 为 不 同 的 类 别, 是 因 为 不 同 名 称 的 过 程, 完 全 可 以 具 有 相 同 名 称 的 变 元 关 键 词 局 部 性 名 称 的 作 用 域 的 一 般 规 则 如 下 : 在 一 个 作 用 域 单 位 里 面 可 以 访 问 的 全 局 性 对 象 的 名 称, 不 能 用 来 作 为 一 个 该 作 用 域 内 部 的 局 部 性 对 象 的 名 称, 除 非 该 局 部 性 对 象 和 一 个 公 用 块 同 名 一 个 非 类 型 的 局 部 性 对 象 的 名 称, 在 它 的 作 用 域 单 位 里 面, 以 及 它 的 同 一 个 名 称 类 别 里 面, 必 须 是 唯 一 的, 只 有 在 不 同 的 作 用 域 单 位, 或 者 不 同 的 名 称 类 别 里 面, 才 可 以 把 该 名 称 用 于 另 外 一 个 不 同 的 对 象 在 其 他 作 用 域 单 位 里 面 的 对 象, 不 管 其 使 用 的 名 称 是 否 与 此 作 用 域 单 位 里 面 的 对 象 所 使 用 的 名 称 相 同, 都 有 可 能 通 过 关 联, 而 导 致 实 际 上 是 同 一 个 对 象 一 个 类 型 的 局 部 性 名 称, 可 以 用 于 同 一 个 作 用 域 单 位 里 面 的 不 同 过 程 在 一 个 作 用 域 单 位 里 面 的 同 一 个 名 称 可 以 用 来 表 示 不 同 名 称 类 别 里 面 的 对 象 例 如 一 个 变 元 关 键 词 可 以 和 一 个 逻 辑 型 变 量 具 有 相 同 的 名 称 派 生 类 型 的 成 员 的 作 用 域 就 是 该 类 型 定 义, 当 该 成 员 被 用 于 结 构 引 用 时, 它 的 作 用 域 就 是 该 结 构 引 用 变 元 关 键 词 属 于 一 个 单 独 的 名 称 类 别, 因 此 一 个 变 元 关 键 词 的 名 称 可 以 在 同 一 个 作 用 域 单 位 里 面, 用 作 其 他 类 别 对 象 的 名 称, 例 如 其 他 过 程 的 变 元 关 键 词, 过 程, 或 变 量 的 名 称 如 果 在 程 序 当 中 出 现 了 一 个 公 用 块 与 一 个 局 部 性 对 象 的 名 称 的 雷 同, 那 么 该 名 称 只 有 在 表 示 公 用 块 时, 才 是 全 局 性 的 在 引 用 该 名 称 时, 它 所 指 称 的 对 象 的 唯 一 性 由 该 名 称 的 上 下 文 保 证 一 个 固 有 过 程 的 名 称 可 以 在 不 出 现 该 固 有 过 程 的 作 用 域 单 位 里 面 用 作 局 部 性 名 称 也 就 是 说 一 旦 某 个 固 有 过 程 的 名 称 在 某 个 作 用 域 单 位 里 面 被 用 来 作 为 一 个 局 部 性 名 称, 比 方 说 一 个 变 量 的 名 称, 那 么 在 整 个 该 作 用 域 单 位 里 面, 该 固 有 过 程 本 身 都 不 能 出 现 了 对 于 每 个 函 数 以 及 不 具 有 结 果 变 量 的 函 数 对 象, 在 它 的 子 程 序 作 用 域 单 位 里 面, 都 默 认

271 存 在 一 个 与 该 函 数 或 函 数 对 象 同 名 的 一 个 局 部 变 量, 该 局 部 变 量 用 来 在 本 作 用 域 单 位 里 面 定 义 该 函 数 或 函 数 对 象 的 结 果 值 对 于 每 个 内 部 过 程 或 模 块 过 程, 它 的 名 称 对 于 它 的 宿 主 作 用 域 单 位 而 言 都 是 局 部 的 类 似 地, 对 于 模 块 过 程 内 部 的 任 意 对 象 名 称, 对 于 它 的 宿 主 作 用 域 单 位 而 言, 也 都 是 局 部 的 3. 结 构 的 情 形 在 FORTRAN 里 面, 可 以 用 作 作 用 域 的 结 构 只 有 FORALL 结 构 在 FORALL 语 句 或 结 构 里 面 的 指 标 变 量 的 名 称 具 有 的 作 用 域 为 该 FORALL 语 句 或 结 构 的 赋 值 语 句 的 作 用 域 该 指 标 变 量 的 名 称 在 其 他 地 方 都 是 用 作 标 量 变 量 名 称, 而 在 作 用 域 单 位 的 任 何 位 置 它 都 是 整 型 变 量 FORALL 语 句 或 结 构 里 面 的 指 标 变 量 是 具 有 一 个 大 于 一 个 语 句 同 时 又 小 于 一 个 作 用 域 单 位 的 作 用 域 的 唯 一 的 例 子 4. 语 句 的 情 形 一 个 名 称 的 作 用 域 只 限 于 一 个 语 句 或 语 句 的 一 个 部 分 的 情 形 有 以 下 两 种 : 一 个 语 句 函 数 的 哑 元 的 名 称 ; 在 一 个 DATA 语 句 里 面 的 隐 式 D O 列 表 或 一 个 数 组 构 造 器 里 面 的 DO 变 量 名 称 这 些 名 称 都 可 以 在 该 语 句 的 作 用 域 单 位 的 其 他 地 方 用 作 标 量 变 量 名 称 或 公 用 块 名 称, 而 不 至 于 出 现 任 何 的 名 称 冲 突 语 句 里 面 的 名 称 的 一 般 规 则 如 下 : 一 个 语 句 函 数 的 哑 元 的 名 称 的 作 用 域 就 是 该 语 句, 它 的 类 型 与 种 别 参 数 都 在 该 语 句 所 在 的 作 用 域 单 位 里 面 得 到 声 明 在 一 个 DATA 语 句 里 面 的 隐 式 DO 循 环 或 一 个 数 组 构 造 器 里 面 的 DO 变 量 名 称 的 作 用 域 就 是 该 DO 变 量 所 在 的 语 句 部 分 该 DO 变 量 的 类 型 必 须 是 整 型, 而 它 的 种 别 参 数 则 由 它 所 在 的 作 用 域 单 位 声 明 在 隐 式 DO 列 表 里 面 的 DO 变 量 的 作 用 域 只 是 它 所 在 语 句 的 一 部 分, 而 在 一 个 DO 结 构 里 面 的 DO 变 量 的 作 用 域 则 是 该 结 构 所 在 的 作 用 域 单 位 这 两 种 是 完 全 不 同 的 在 输 入 输 出 项 列 表 当 中 的 隐 式 DO 里 面 的 DO 变 量 的 作 用 域, 为 该 输 入 输 出 语 句 所 在 的 程 序 单 位 标 签 的 作 用 域 标 签 总 是 局 部 性 的 也 就 是 说 在 一 个 作 用 域 单 位 里 面 一 个 标 签 总 是 指 称 同 一 个 语 句, 而 在 不 同 的 作 用 域 单 位 里 面, 可 以 同 时 使 用 同 一 个 标 签 来 指 称 不 同 的 语 句 输 入 输 出 单 位 的 作 用 域 外 部 输 入 输 出 单 位 的 编 目 总 是 全 局 性 的 也 就 是 说, 在 一 个 FORTRAN 程 序 里 面, 无 论 一 个 输 入 输 出 单 位 的 编 目 出 现 在 什 么 位 置, 它 都 指 称 同 一 个 输 入 输 出 单 位

272 算 符 的 作 用 域 算 符 分 为 固 有 算 符 和 自 定 义 算 符 两 种 固 有 算 符 是 全 局 性 的 ; 而 自 定 义 算 符 是 局 部 性 的 一 个 固 有 算 符 的 符 号 也 可 以 用 作 自 定 义 算 符 的 符 号 ; 而 且 算 符 还 可 以 具 有 类 的 属 性, 即 同 一 个 算 符 可 以 用 来 指 称 几 个 运 算 符 号, 它 们 具 有 不 同 的 涵 义 而 程 序 是 通 过 相 应 算 元 的 类 型, 种 别 参 数 以 及 秩 来 获 得 对 它 们 的 辨 别 的 赋 值 的 作 用 域 赋 值 分 为 固 有 赋 值 和 自 定 义 赋 值 两 种 固 有 赋 值 是 全 局 性 的 ; 而 自 定 义 赋 值 是 局 部 性 的 赋 值 符 号 (=) 总 是 全 局 性 的, 同 时 也 可 以 具 有 局 部 性 的 定 义 ; 而 且 赋 值 还 可 以 具 有 类 的 属 性, 即 不 同 的 赋 值 运 算 可 以 使 用 同 一 个 赋 值 运 算 符 号 来 指 称, 它 们 具 有 不 同 的 涵 义 而 程 序 是 通 过 赋 值 符 号 = 左 右 两 边 的 对 象 的 类 型, 种 别 参 数 以 及 秩 来 获 得 对 它 们 具 体 涵 义 的 辨 别 的 非 歧 义 过 程 引 用 的 作 用 域 所 谓 非 歧 义 的 过 程 引 用, 是 指 引 用 的 过 程 名 称 在 相 应 的 作 用 域 单 位 里 面, 是 一 个 种 过 程 名 称, 它 与 该 作 用 域 单 位 里 面 的 任 何 类 过 程 名 称 都 不 相 同 非 歧 义 的 过 程 引 用 包 括 如 下 的 情 形 : 引 用 内 部 过 程 ; 引 用 哑 过 程 ; 引 用 语 句 函 数 ; 引 用 属 于 固 有 过 程 的 与 类 过 程 不 重 名 的 种 过 程 名 称 ; 引 用 模 块 过 程 或 外 部 过 程, 它 不 能 够 出 现 在 具 有 所 在 作 用 域 单 位 的 类 声 明 的 界 面 块 里 面, 或 者 是 可 以 通 过 使 用 关 联 或 宿 主 关 联 来 访 问 的 只 有 属 于 外 部 过 程 的 种 过 程 名 称 是 全 局 性 的, 所 有 其 他 的 种 过 程 名 称 都 是 局 部 性 的 在 满 足 以 下 条 件 的 情 形 下, 涉 及 到 类 过 程 名 称 的 过 程 引 用 也 可 以 是 非 歧 义 的 即 如 果 任 意 两 个 过 程 具 有 同 一 个 类 过 程 名 称, 那 么 在 它 们 的 哑 元 列 表 当 中, 至 少 得 有 一 个 非 可 选 的 哑 元 同 时 满 足 下 面 两 个 条 件 : 或 者 是 在 另 外 的 哑 元 列 表 里 面 与 该 哑 元 所 处 列 表 位 置 相 同 的 位 置 不 存 在 相 应 哑 元, 或 者 是 与 相 应 哑 元 具 有 不 同 的 类 型, 种 别 以 及 秩 的 不 同 组 合 模 式 或 者 是 该 哑 元 具 有 与 另 外 那 个 哑 元 列 表 里 面 的 所 有 哑 元 都 不 同 的 名 称, 或 者 是 即 使 存 在 同 名 的 哑 元, 也 与 同 名 哑 元 具 有 不 同 的 类 型, 种 别 以 及 秩 的 组 合 模 式 一 个 非 逐 元 的 种 过 程 有 可 能 引 用 一 个 类 过 程 作 为 它 的 哑 元, 同 时 一 个 与 类 过 程 重 名 的 逐 元 过 程 也 引 用 类 过 程 作 为 它 的 变 元, 在 这 种 情 况 下, 该 非 逐 元 种 过 程 就 用 于 解 决 类 过 程 引 用 所 带 来 的 名 称 歧 义 问 题 不 管 类 名 称 是 固 有 的, 还 是 由 具 有 类 说 明 的 界 面 块 所 定 义 的, 上 面 的 规 则 都 是 适 用 的 而 且 它 们 还 适 用 于 算 符 类 的 名 称 以 及 赋 值 符 号 类 对 于 固 有 函 数 来 说, 固 有 函 数 的 类 名 称 是 全 局 性 的, 而 自 定 义 的 类 名 称 为 局 部 性 的

273 歧 义 过 程 引 用 的 名 称 处 理 方 法 在 FORTRAN 程 序 里 面, 一 个 过 程 引 用 发 生 在 如 下 几 种 情 形 里 面 : 情 形 1. 运 行 一 个 CALL 语 句 时 ; 情 形 2. 运 行 一 个 经 过 定 义 的 赋 值 语 句 时 ; 情 形 3. 运 行 一 个 经 过 定 义 的 运 算 时 ; 情 形 4. 运 行 一 个 包 含 函 数 引 用 的 表 达 式 时 在 情 形 2 里 面, 涉 及 到 了 作 为 类 名 称 的 赋 值 符 号 (=), 这 时 在 相 应 作 用 域 单 位 里 面 必 定 存 在 一 个 具 有 ASSIGNMENT 类 说 明 的 界 面 块, 或 者 是 通 过 使 用 关 联 或 宿 主 关 联 可 以 访 问 定 义 了 该 赋 值 的 外 部 子 例 行 程 序 或 模 块 子 例 行 程 序, 在 这 种 情 况 下, 就 必 须 运 用 节, 节 以 及 节 的 相 应 规 则 来 决 定 究 竟 引 用 哪 个 种 子 例 行 程 序 在 情 形 3 里 面, 涉 及 到 了 作 为 类 名 称 的 运 算 符 号, 这 时 在 相 应 作 用 域 单 位 里 面 必 定 存 在 一 个 具 有 OPERATOR 类 说 明 的 界 面 块, 或 者 是 通 过 使 用 关 联 或 宿 主 关 联 可 以 访 问 定 义 了 该 运 算 的 函 数 或 模 块 函 数, 在 这 种 情 况 下, 就 必 须 运 用 节, 节 以 及 节 的 相 应 规 则 来 决 定 究 竟 引 用 哪 个 种 函 数 在 情 形 4 里 面, 如 果 表 达 式 的 某 个 项 的 形 式 是 由 一 个 名 称 后 接 用 括 号 括 起 来 的 表 达 式 与 过 程 名 称 的 列 表, 其 中 的 过 程 名 称 在 本 作 用 域 单 位 里 面 没 有 被 声 明 为 数 组 名 称, 那 么 该 表 达 式 就 包 含 了 一 个 函 数 引 用 在 情 形 1 与 情 形 4 里 面, 对 于 有 可 能 出 现 的 过 程 名 称 引 用 歧 义 问 题, 必 须 按 照 以 下 的 规 则 序 列, 逐 步 地 来 决 定 应 该 被 引 用 的 种 过 程 如 果 引 用 的 过 程 名 称 是 所 在 作 用 域 单 位 里 面 的 一 个 哑 元, 那 么 该 哑 元 就 是 一 个 哑 过 程, 并 且 实 际 应 该 引 用 相 关 联 的 作 为 实 元 的 过 程 如 果 引 用 的 过 程 名 称 是 出 现 在 所 在 作 用 域 单 位 里 面 的 一 个 EXTERNAL 语 句 当 中, 那 么 就 引 用 该 名 称 所 指 称 的 外 部 过 程 如 果 引 用 的 过 程 名 称 是 指 向 一 个 可 访 问 的 内 部 过 程 或 语 句 函 数, 那 么 就 引 用 该 内 部 过 程 或 语 句 函 数 如 果 引 用 的 过 程 名 称 是 类 过 程 名 称, 而 该 类 过 程 名 称 是 在 一 个 所 在 作 用 域 单 位 里 面 的 界 面 里 出 现, 或 者 是 在 一 个 通 过 使 用 关 联 或 宿 主 关 联 可 以 访 问 界 面 块 里 面 出 现, 同 时 该 引 用 还 包 含 一 个 有 关 该 类 过 程 名 称 的 种 性 质 的 类 型, 种 别 以 及 秩 的 组 合 模 式 的 说 明, 那 么 就 引 用 具 有 该 类 型, 种 别 以 及 秩 的 组 合 模 式 的 相 应 种 过 程, 运 用 13.7 节 的 规 则 就 决 定 了 该 种 过 程, 而 节 以 及 节 的 规 则 则 保 证 了 这 样 的 种 过 程 至 多 只 存 在 一 个 如 果 过 程 引 用 是 由 一 个 引 用 逐 元 过 程 的 逐 元 引 用 组 成, 而 同 时 又 不 存 在 非 逐 元 的 过 程 能 够 匹 配 相 应 的 类 型, 种 别 以 及 秩 的 组 合 模 式, 那 么 就 引 用 该 逐 元 过 程 如 果 引 用 过 程 名 称 出 现 在 所 在 作 用 域 单 位 里 面 的 一 个 INTRINSIC 语 句 当 中, 那 么 就 引 用 该 名 称 所 指 称 的 相 应 固 有 种 过 程 如 果 引 用 的 过 程 名 称, 是 可 以 通 过 使 用 关 联 获 得 访 问 的, 那 么 就 引 用 相 应 的 种 过 程 另 外, 由 于 可 能 出 现 改 名 现 象, 引 用 的 过 程 名 称 可 能 会 与 模 块 里 面 的 过 程 名 称 不 一 致 如 果 引 用 所 在 的 作 用 域 单 位 还 具 有 一 个 宿 主 作 用 域 单 位, 而 如 果 引 用 歧 义 问 题 已 经 在 其 宿 主 作 用 域 单 位 里 面 通 过 上 面 的 规 则 加 以 解 决, 那 么 在 本 作 用 域 单 位 里 面 也 就 不 存 在 歧 义 问 题 了 如 果 引 用 的 过 程 名 称 同 时 是 类 过 程 和 种 过 程 的 名 称, 而 实 元 与 其 中 特 定 的 某 个 固 有 过 程 的 特 征 相 匹 配, 那 么 就 引 用 相 应 的 固 有 种 过 程 如 果 引 用 过 程 名 称 不 是 一 个 类 过 程 名 称, 那 么 就 引 用 具 有 该 名 称 的 外 部 过 程

274 如 果 以 上 规 则 都 不 能 解 决 问 题, 那 么 该 引 用 就 是 非 标 准 的, 或 非 法 的 引 用 15.3 关 联 在 明 确 了 每 一 个 名 称 或 对 象 的 作 用 域 之 后, 进 行 通 讯 的 主 要 手 段, 就 是 在 不 同 的 作 用 域 之 间 建 立 对 象 之 间 的 关 联 所 谓 建 立 关 联, 同 样 是 以 对 象 的 名 称 为 基 础 的, 因 为 按 照 直 观 的 理 解, 无 论 是 什 么 形 式 的 通 讯, 都 是 以 能 够 进 行 名 称 的 传 递 为 前 提 的 只 不 过 在 不 同 形 式 的 通 讯 里 面, 名 称 一 般 也 具 有 不 同 的 形 式 而 已 一 个 FORTRAN 程 序 的 运 行 过 程 就 是 通 过 名 称 对 相 应 对 象 的 操 作 过 程, 名 称 的 作 用 在 于 为 程 序 辨 认 相 应 对 象 的 属 性 提 供 依 据, 或 者 还 可 以 为 程 序 指 出 对 象 的 存 储 位 置 因 此 在 程 序 当 中 进 行 的 通 讯 无 非 就 是 一 些 交 换 名 称 的 过 程, 即 在 不 同 的 作 用 域 单 位 之 间 给 出 指 称 同 一 个 对 象 的 名 称, 或 者 在 同 一 个 作 用 域 单 位 里 面 给 出 指 称 同 一 个 对 象 的 不 同 名 称, 就 是 所 谓 通 讯 过 程 的 实 质, 而 关 联 的 含 义 就 是 用 来 完 成 这 两 种 任 务 关 联 具 有 以 下 4 种 形 式 : 名 称 关 联 即 直 接 使 用 名 称 进 行 关 联, 这 种 关 联 必 定 是 在 不 同 的 作 用 域 单 位 之 间 进 行 名 称 关 联 包 括 变 元 关 联, 使 用 关 联, 宿 主 关 联 3 种 类 型 指 针 关 联 所 谓 指 针 关 联 的 功 能 就 是 能 够 在 一 个 作 用 域 单 位 里 面 实 现 名 称 的 动 态 关 联 存 储 关 联 存 储 关 联 通 过 存 储 序 列 实 现 数 据 对 象 之 间 的 关 联 在 相 同 的 作 用 域 单 位 里 面 是 通 过 EQUIVALENCE 来 实 现 存 储 关 联 的, 而 在 不 同 的 作 用 域 单 位 之 间 则 是 通 过 COMMON 来 实 现 关 联 的 序 列 关 联 所 谓 序 列 关 联 其 实 就 是 名 称 关 联 与 存 储 关 联 的 组 合, 也 是 属 于 名 称 关 联 的 变 元 关 联 的 一 种 特 殊 形 式 序 列 关 联 在 不 同 作 用 域 单 位 的 名 称 之 间 实 现 关 联 在 下 面 的 示 意 图 15-2, 和 图 15-3 里 面, 给 出 了 两 个 实 现 各 种 关 联 的 可 执 行 程 序 的 例 子 分 别 是 在 两 个 非 模 块 作 用 域 单 位 之 间 的 关 联 和 一 个 模 块 作 用 域 单 位 与 另 一 个 非 模 块 作 用 域 单 位 之 间 的 关 联

275 图 15-2 两 个 非 模 块 作 用 域 单 位 之 间 的 关 联

276 图 15-3 一 个 模 块 作 用 域 单 位 与 另 一 个 非 模 块 作 用 域 单 位 之 间 的 关 联 名 称 关 联 尽 管 从 实 质 看 来, 关 联 总 是 要 通 过 名 称 来 进 行 的, 不 过 我 们 单 独 把 在 不 同 作 用 域 单 位 之 间 相 同 或 不 同 名 称 实 现 的 关 联 称 为 名 称 关 联 名 称 关 联 包 括 如 下 3 种 形 式 : 变 元 关 联 ; 使 用 关 联 ; 宿 主 关 联 下 面 分 别 予 以 说 明

277 1. 变 元 关 联 所 谓 变 元 关 联 就 是 在 一 个 包 含 了 过 程 引 用 的 作 用 域 单 位 里 面 的 实 元 和 另 一 个 包 含 了 对 被 引 用 过 程 的 定 义 的 作 用 域 单 位 里 面 的 虚 元 之 间 所 建 立 的 关 联, 即 把 可 能 相 同 也 可 能 不 同 的 处 于 不 同 作 用 域 单 位 的 名 称, 指 称 同 一 个 实 体 对 象 通 过 变 元 关 联 而 实 现 了 实 哑 通 讯 的 实 元, 是 一 个 变 量, 或 过 程, 或 表 达 式 的 名 称, 而 相 应 的 哑 元 则 是 出 现 在 过 程 定 义 当 中 的 用 来 引 用 实 元 的 名 称 或 表 达 式 这 种 关 联 在 程 序 的 执 行 离 开 该 过 程 之 后, 就 被 撤 消 了, 即 在 被 引 用 过 程 运 行 当 中 具 有 关 联 的 实 元 名 称 与 哑 元 名 称 在 程 序 退 出 该 过 程 之 后, 就 不 具 有 关 联 关 系 了 2. 使 用 关 联 使 用 关 联 在 一 个 模 块 作 用 域 单 位 和 一 个 通 过 USE 语 句 引 用 了 该 模 块 的 作 用 域 单 位 的 相 同 名 称 或 不 同 名 称 之 间 建 立 关 联 通 过 这 种 关 联 就 实 现 了 使 用 USE 语 句 的 作 用 域 单 位 对 被 引 用 模 块 内 部 的 对 象 的 访 问 按 照 默 认 的 约 定, 模 块 内 部 所 有 的 具 有 公 用 属 性 的 对 象 都 能 够 接 受 访 问 在 USE 语 句 里 面 可 以 选 择 性 地 对 需 要 访 问 的 对 象 进 行 重 命 名, 还 可 以 运 用 ONLY 选 项 来 挑 选 需 要 访 问 的 对 象 使 用 关 联 的 一 般 规 则 如 下 : 如 果 在 USE 语 句 当 中 使 用 了 重 命 名, 那 么 相 应 局 部 名 称 的 一 切 属 性 都 向 模 块 里 面 的 被 关 联 属 性 看 齐 而 且 对 于 USE 语 句 所 属 作 用 域 单 位 里 面 的 能 够 访 问 被 引 用 模 块 的 对 象, 除 了 可 以 改 变 它 的 访 问 能 力 之 外, 都 不 具 有 重 说 明 属 性 的 能 力 在 USE 语 句 里 面 对 一 个 对 象 进 行 了 改 名, 那 么 模 块 里 面 的 原 始 名 称 就 可 以 在 该 USE 语 句 所 属 作 用 域 单 位 里 面 作 为 局 部 名 称 使 用, 而 不 会 导 致 名 称 冲 突 模 块 内 部 的 对 象 的 PUBLIC 与 PRIVATE 属 性 都 只 能 够 由 模 块 自 身 来 规 定, 引 用 模 块 的 作 用 域 单 位 不 能 够 改 变 模 块 内 部 对 象 的 可 访 问 性 3. 宿 主 关 联 宿 主 关 联 是 在 一 个 内 部 过 程, 或 模 块 过 程, 或 派 生 类 型 定 义 里 面 的 对 象 名 称 与 它 的 宿 主 作 用 域 单 位 里 面 的 对 象 名 称 之 间 建 立 关 联 直 观 而 言, 宿 主 关 联 就 是 为 了 使 得 一 个 宿 主 作 用 域 单 位 里 面 的 名 称 都 能 够 被 其 内 部 的 过 程 或 派 生 类 型 定 义 所 访 问, 当 然 前 提 是 这 些 过 程 和 派 生 类 型 定 义 都 是 能 够 被 其 宿 主 作 用 域 单 位 所 访 问 的 尽 管 宿 主 关 联 不 具 有 使 用 关 联 那 样 的 改 名 机 制, 以 防 止 出 现 名 称 冲 突, 但 是 宿 主 关 联 可 以 很 容 易 地 通 过 在 内 部 过 程, 或 模 块 过 程, 或 派 生 类 型 定 义 里 面, 对 某 个 名 称 进 行 局 部 声 明, 而 防 止 它 所 在 的 作 用 域 单 位 访 问 其 宿 主 作 用 域 单 位 里 面 的 同 名 对 象 从 而 也 可 以 实 行 名 称 冲 突 管 理 之 所 以 通 过 局 部 声 明 来 防 止 与 宿 主 对 象 名 称 的 冲 突, 是 因 为 FORTRAN 有 一 个 基 本 的 约 定, 就 是 任 何 的 作 用 域 单 位 内 部 的 局 部 声 明 总 是 优 先 于 其 所 属 的 宿 主 作 用 域 单 位 里 面 同 名 的 声 明 特 别 是 如 果 同 时 在 内 部 作 用 域 单 位 与 其 宿 主 作 用 域 单 位 里 面 使 用 IMPLICIT NONE 语 句 的 话, 就 能 够 强 迫 在 它 们 内 部 的 所 有 对 象 都 必 须 具 有 相 应 的 显 式 局 部 声 明, 这 时, 内 部 作 用 域 单 位 的 显 式 局 部 声 明 总 是 优 先 于 其 所 属 宿 主 作 用 域 单 位 里 面 的 相 应 显 式 局 部 声 明 如 果 只 是 在 宿 主 作 用 域 单 位 里 面 使 用 了 IMPLICIT NONE 语 句, 那 么 它 内 部 的 所 有 作 用 域 单 位 在 默 认 情 况 下 也 是 受 到 IMPLICIT N ONE 的 作 用 的, 不 过 在 内 部 作 用 域 单 位 里 面 还 可 以 使 用 IMPLICIT 语 句 进 行 单 独 的 约 定, 这 时, 就 会 改 变 部 分 默 认 隐 式 规 则 例 15-1 如 果 在 一 个 宿 主 作 用 域 单 位 里 面 使 用 了 IMPLICIT NONE 语 句, 然 后 在 它 的 某 个

278 内 部 作 用 域 单 位 里 面 使 用 了 如 下 的 IM PLICIT 语 句 : IMPLICIT COMPLEX(O,Z) IMPLICIT LOGICAL(A-C) 这 样 就 使 得 该 内 部 作 用 域 单 位 里 面 所 有 以 O 和 Z 开 头 的 名 称 都 是 隐 式 复 型, 而 以 A,B,C 开 头 的 名 称 都 是 隐 式 逻 辑 型, 至 于 以 其 他 字 母 开 头 的 名 称 则 需 要 依 靠 显 式 声 明 才 能 确 定 其 类 型 一 旦 在 程 序 当 中 使 用 隐 式 声 明 的 时 候, 那 么 某 个 对 象 名 称 可 能 在 其 所 属 的 作 用 域 单 位 的 说 明 部 分 就 不 会 出 现 对 于 该 名 称 的 显 式 声 明, 这 就 会 给 名 称 的 引 用 管 理 带 来 一 定 的 复 杂 性 考 虑 所 有 的 宿 主 与 其 内 部 作 用 域 单 位 的 同 一 个 对 象 名 称 的 显 式 与 隐 式 声 明 的 组 合, 一 共 有 如 下 4 种 情 况 : 1. 在 宿 主 与 其 内 部 作 用 域 单 位 内 都 是 显 式 ; 2. 在 宿 主 内 没 有 出 现 隐 式 声 明 和 显 式 声 明, 在 其 任 何 内 部 作 用 域 单 位 内 都 是 隐 式 ; 3. 在 宿 主 的 说 明 部 分 出 现 显 式 声 明, 而 在 其 内 部 作 用 域 单 位 内 是 隐 式 ; 4. 在 宿 主 作 用 域 单 位 内 是 隐 式, 而 在 其 内 部 作 用 域 单 位 内 的 说 明 部 分 出 现 显 式 声 明 对 于 情 况 1, 它 们 都 是 局 部 的, 都 只 是 在 各 自 的 作 用 域 单 位 里 面 有 效, 不 发 生 宿 主 关 联 关 系 对 于 情 况 2, 只 要 该 对 象 名 称 在 宿 主 的 出 现 不 是 以 被 引 用 的 方 式, 那 么 它 们 都 是 局 部 的, 都 只 是 在 各 自 的 作 用 域 单 位 里 面 有 效, 不 发 生 宿 主 关 联 关 系 对 于 情 况 3, 则 该 对 象 名 称 是 宿 主 对 象, 其 内 部 作 用 域 单 位 内 的 同 名 对 象 需 要 通 过 宿 主 关 联 来 访 问 它 如 果 该 对 象 名 称 在 宿 主 作 用 域 单 位 内 部 只 是 以 被 引 用 的 方 式 出 现, 那 么 同 样 看 成 是 一 个 显 式 声 明 对 于 情 况 4, 则 在 其 内 部 作 用 域 单 位 内 是 该 作 用 域 单 位 的 局 部 名 称, 不 需 要 访 问 其 宿 主 作 用 域 单 位 隐 式 声 明 不 管 是 在 宿 主 作 用 域 单 位 还 是 在 内 部 作 用 域 单 位, 它 都 是 依 据 隐 式 类 型 规 则 与 IMPLIC IT 语 句 约 定 的, 约 定 内 容 如 下 : 一 个 名 称 如 果 在 内 部 作 用 域 单 位 里 面 得 到 显 式 声 明, 那 么 它 就 是 一 个 局 部 名 称, 与 其 宿 主 作 用 域 单 位 无 关 内 部 作 用 域 单 位 里 面 的 哑 元 本 身 被 认 为 就 是 一 个 显 式 局 部 声 明, 尽 管 该 哑 元 的 名 称 可 能 是 根 据 其 所 在 作 用 域 单 位 的 隐 式 类 型 规 则 进 行 隐 式 规 定 的 如 果 一 个 内 部 作 用 域 单 位 里 面 的 对 象 名 称 没 有 得 到 显 式 声 明, 那 么 只 有 在 该 名 称 在 其 宿 主 作 用 域 单 位 里 面 根 本 不 出 现 的 情 况 下, 该 名 称 才 依 据 其 所 在 作 用 域 单 位 的 隐 式 声 明 成 为 局 部 对 象 名 称 如 果 一 个 内 部 作 用 域 单 位 里 面 的 对 象 名 称 依 据 上 面 的 两 个 规 则 仍 然 不 是 局 部 的, 那 么 它 就 是 需 要 获 得 宿 主 关 联 的 非 局 部 名 称 内 部 作 用 域 单 位 里 面 如 果 不 出 现 IMPLICIT 语 句 的 话, 它 的 默 认 隐 式 类 型 规 则 就 继 承 其 宿 主 作 用 域 单 位 的 隐 式 规 则, 即 其 宿 主 作 用 域 单 位 的 默 认 隐 式 规 则 加 上 可 能 的 IMPLICIT 语 句 的 修 改 如 果 内 部 作 用 域 单 位 里 面 出 现 IMPLICIT 语 句, 那 么 它 对 内 部 作 用 域 单 位 从 其 宿 主 作 用 域 单 位 继 承 来 的 默 认 隐 式 规 则 进 行 修 改, 并 且 同 样 作 用 于 其 中 的 哑 元 一 个 内 部 函 数 或 模 块 函 数 的 函 数 名 称 或 对 象 名 称 的 类 型, 或 者 由 显 示 声 明 决 定, 或 者 由 该 函 数 的 隐 式 类 型 规 则 决 定 例 15-2 PROGRAM HOST USE GLOBAL_DATA IMPLICIT LOGICAL (E-J)! 隐 式 类 型 规 则 为 :A-D 为 默 认 实 型 ;

279 ! E-J 为 默 认 逻 辑 型 ;! K-N 为 默 认 整 型 ;! O-Z 为 默 认 实 型 REAL A,B READ *, P! 该 引 用 继 续 P 在 宿 主 里 面 的 隐 式 规 则 CALL CALC (Z )! 该 引 用 继 续 Z 在 宿 主 里 面 的 隐 式 规 则 CONTAINS SUBROUTINE CALC (X) IMPLICIT REAL (G-I)! 隐 式 类 型 规 则 为 :A-D 为 默 认 实 型 ;! E-F 为 默 认 逻 辑 型 ;! G-I 为 默 认 实 型 ;! J 为 默 认 逻 辑 型 ;! K-N 为 默 认 整 型 ;! O-Z 为 默 认 实 型 REAL B X=A+B+P+Q+Y! 在 SUBROUTINE CALC 里 面 它 们 都 是 实 型!X 为 局 部 哑 元 ;!A 获 得 宿 主 关 联 ;!B 为 得 到 显 式 声 明 的 局 部 名 称 ;!P 获 得 宿 主 关 联 ;!Q 为 得 到 隐 式 声 明 的 局 部 名 称 ;!Y 从 模 块 获 得 使 用 关 联. END SUBROUTINE END PROGRAM HOST 在 上 面 的 例 子 当 中, 表 达 式 X=A+B+P+Q+Y 里 面 的 各 个 算 元 依 据 不 同 的 类 型 规 则 指 针 关 联 前 面 讨 论 的 所 有 的 关 联 机 制 都 使 得 被 关 联 的 名 称 在 其 所 在 的 作 用 域 单 位 运 行 时 总 是 具 有 一 个 确 定 的 关 联 对 象, 但 是 指 针 关 联 却 是 一 种 动 态 关 联 机 制, 具 有 指 针 属 性 的 名 称 在 其 所 在 的 作 用 域 单 位 运 行 时, 可 以 具 有 三 种 状 态, 即 :

280 去 定 义 状 态 ; 去 关 联 状 态 ; 关 联 状 态 因 此 指 针 关 联 在 本 质 上 就 是 一 种 动 态 关 联 机 制, 在 其 所 在 的 作 用 域 单 位 的 运 行 期 间, 随 时 可 以 根 据 运 行 的 需 要 而 变 换 其 状 态 指 针 关 联 的 一 般 规 则 如 下 : 没 有 经 过 初 始 化 的 指 针 总 是 处 于 去 定 义 状 态, 在 经 过 初 始 化 之 后, 才 具 有 去 关 联 状 态 指 针 获 得 关 联 可 以 通 过 如 下 2 种 方 式 : 通 过 指 针 赋 值, 使 得 指 针 变 量 和 其 他 指 针, 或 者 和 具 有 TARGET 属 性 的 标 量 或 数 组 数 据 对 象 建 立 关 联 通 过 执 行 ALLOCATE 语 句, 使 得 指 针 变 量 和 此 前 无 名 的 空 间 建 立 关 联 处 于 关 联 状 态 的 指 针 变 量 可 以 通 过 如 下 3 种 方 式 去 关 联 : 在 NULLIFY 语 句 的 作 用 下 ; 在 DEALLOCATE 语 句 的 作 用 下 ; 被 赋 值 为 一 个 去 关 联 的 指 针 存 储 关 联 存 储 关 联 和 名 称 关 联 以 及 指 针 关 联 的 目 的 一 样, 都 是 使 得 不 同 的 名 称 能 够 共 享 同 一 个 数 据 实 体, 如 果 说 名 称 关 联 和 指 针 关 联 的 关 联 途 径 都 是 通 过 访 问 名 称 来 实 现 的, 那 么 存 储 关 联 则 是 通 过 直 接 访 问 数 据 对 象 的 存 储 空 间 来 实 现 的 所 谓 数 据 对 象 的 存 储 空 间 表 面 看 来 是 属 于 计 算 机 的 内 存 的 物 理 层 面 的 一 个 概 念, 但 是 在 FORTRAN 语 言 里 面 所 谓 的 存 储 空 间 并 不 完 全 就 是 一 个 物 理 层 面 的 概 念, 而 是 对 物 理 空 间 的 一 种 模 式 描 述 这 种 描 述 的 基 本 概 念 如 下 : 存 储 单 位 一 个 存 储 单 位 就 是 指 存 储 了 单 个 FORTRAN 数 据 值 的 内 存 空 间 根 据 存 储 单 位 所 存 储 的 FORTRAN 数 据 值 的 不 同 类 型, 存 储 单 位 分 为 数 值 存 储 单 位, 字 符 存 储 单 位 和 不 定 存 储 单 位 存 储 序 列 任 意 多 个 连 续 的 数 据 单 位 就 构 成 了 一 个 存 储 序 列, 存 储 序 列 的 大 小 就 是 序 列 所 包 含 的 存 储 单 位 的 数 目 要 描 述 FORTRAN 数 据 的 存 储, 就 必 须 说 明 每 种 类 型 的 数 据 对 象 所 占 据 的 存 储 单 位 的 数 目, 因 此 下 面 我 们 给 出 所 有 类 型 的 FORTRAN 数 据 对 象 所 对 应 的 存 储 单 位 分 配 模 式 一 个 默 认 整 型, 默 认 实 型, 默 认 逻 辑 型 的 标 量 数 据 对 象 占 据 一 个 数 值 存 储 单 位 ; 一 个 默 认 复 型, 双 精 度 实 型 数 据 占 据 2 个 连 续 的 数 值 存 储 单 位, 其 中 复 型 数 据 的 实 部 所 占 据 的 存 储 单 位 位 于 虚 部 所 占 据 的 存 储 单 位 一 个 默 认 字 符 占 据 一 个 字 符 存 储 单 位 所 有 的 其 他 类 型 的 数 据 值, 包 括 指 针 和 非 默 认 类 型 的 数 据 值 都 占 据 不 定 存 储 单 位 如 果 是 数 据 对 象 由 多 个 或 多 种 数 据 单 位 组 成, 那 么 该 数 据 对 象 的 存 储 模 式 由 其 具 体 数 据 形 式 决 定, 一 般 有 以 下 几 种 形 式 : 长 度 为 len 的 默 认 标 量 字 符 对 象 占 据 连 续 的 len 个 字 符 存 储 单 位, 构 成 一 个 存 储 序 列

281 一 个 数 组 对 象 占 据 一 个 存 储 序 列, 该 数 组 的 每 个 元 素 占 据 一 个 适 当 类 型 的 存 储 单 位, 存 储 序 列 里 面 存 储 单 位 的 顺 序 就 是 该 数 组 里 面 元 素 的 顺 序 一 个 具 有 序 列 机 构 的 派 生 类 型 对 象 占 据 一 个 存 储 序 列, 该 派 生 类 型 对 象 的 每 个 成 员 占 据 一 个 适 当 类 型 的 存 储 单 位, 存 储 序 列 里 面 存 储 单 位 的 顺 序 就 是 该 派 生 类 型 对 象 定 义 里 面 成 员 的 顺 序 一 个 公 用 块 占 据 一 个 存 储 序 列, 参 见 7.11 节 函 数 子 程 序 里 面 的 ENTRY 语 句 给 出 的 结 果 占 据 一 个 存 储 序 列, 参 见 13.6 节 EQUIVALENCE 语 句 里 面 的 等 价 列 表 的 所 有 对 象 占 据 一 个 存 储 序 列 两 个 数 据 对 象 如 果 共 享 了 同 一 个 存 储 序 列, 那 么 它 们 就 称 为 具 有 存 储 关 联 的 关 系 如 果 它 们 只 是 共 享 了 同 一 个 存 储 序 列 的 部 分 存 储 单 位, 那 么 它 们 称 为 具 有 部 分 存 储 关 联 的 关 系 能 够 建 立 部 分 存 储 关 联 的 数 据 对 象 只 能 是 字 符 型 数 据 以 及 在 COMMON,EQUIVALENCE, 或 ENT RY 语 句 里 面 给 出 的 复 合 数 据 对 象 因 为 只 有 这 样 的 复 合 序 列 形 式 的 数 据 对 象 的 子 对 象 作 为 子 串 才 是 有 意 义 的 数 据 对 象 例 15-3 考 虑 下 面 给 出 的 几 个 数 据 值 : REAL ::X( 0:3) COMPLEX ::Z EQUIVALENCE(Z,X(2)) 那 么 X 所 占 据 的 存 储 序 列 就 是 由 4 个 存 储 单 位 组 成, 每 个 存 储 单 位 为 一 个 数 值 存 储 单 位 : X(0) X(1) X(2) X(3) 而 Z 所 占 据 的 存 储 序 列 由 2 个 存 o 储 单 位 组 成, 分 别 作 为 实 部 与 虚 部 的 存 储 单 位 : Zr Zi EQUIV ALENCE 语 句 指 定 了 Z 的 存 储 序 列 从 X 的 下 标 为 2 的 元 素 所 占 据 的 存 储 单 位 开 始 共 享 存 储 空 间, 也 就 是 下 面 的 形 式 : X(0) X(1) X(2) Zr X(3) Zi 而 如 果 上 面 的 EQUIVALENCE 语 句 是 如 下 的 形 式 : EQUIVALENCE(Z,X(3)) 那 么 Z 和 X 就 构 成 了 如 下 的 部 分 存 储 关 联 形 式 : X(0) X(1) X(2) X(3) Zr Zi 序 列 关 联 序 列 关 联 就 是 一 种 特 殊 形 式 的 变 元 关 联, 用 于 对 具 有 序 列 结 构 的 数 据 对 象, 例 如 字 符 串, 数 组 等 建 立 关 联, 具 体 的 讨 论 参 见 节

282 15.4 定 义 状 态 固 然 通 过 关 联, 就 可 以 说 已 经 完 成 了 通 讯 的 过 程, 但 是 通 讯 的 实 现 过 程 当 中 还 有 一 个 重 要 的 问 题 还 没 有 讨 论, 就 是 如 何 保 障 使 用 名 称 所 指 称 的 值 时 的 安 全 性, 也 就 是 如 何 保 障 名 称 的 取 值 是 定 义 明 确 并 且 具 有 可 预 知 的 行 为 之 所 以 还 会 出 现 这 样 的 问 题, 是 因 为 在 程 序 运 行 过 程 当 中, 会 有 很 多 的 事 件 能 够 导 致 变 量 的 病 态 定 义, 或 者 是 取 值 的 不 可 预 知 性 例 如, 如 果 一 个 整 型 变 量 与 一 个 实 型 变 量 具 有 存 储 关 联 关 联, 那 么 对 于 整 型 变 量 的 赋 值 常 常 导 致 相 应 实 型 变 量 的 取 值 的 不 可 预 知 性 ; 更 常 见 的 是 一 个 输 入 输 出 的 错 误, 很 容 易 就 导 致 变 量 的 取 值 的 中 断 因 此 为 了 保 证 通 讯 的 顺 利 实 现, 我 们 还 必 须 监 视 变 量 在 程 序 运 行 过 程 中 的 取 值 行 为, 也 就 是 变 量 的 定 义 状 态 对 于 一 个 在 程 序 运 行 过 程 当 中 的 变 量 来 说, 它 的 定 义 状 态 就 是 如 下 两 种 : 良 定 义 的 ; 去 定 义 的 所 谓 良 定 义 的 就 是 指 一 个 变 量 能 够 在 程 序 的 运 行 过 程 中, 通 过 一 些 语 句 的 执 行 而 获 得 明 确 的 取 值 ; 所 谓 去 定 义 就 是 指 一 个 变 量 失 去 了 值 一 个 变 量 在 通 过 DATA 语 句, 或 类 型 声 明 语 句, 或 默 认 初 始 化 语 句 进 行 初 始 化 取 值 之 前, 总 是 默 认 为 去 定 义 的, 然 后 在 进 入 程 序 的 运 行 进 程 之 后, 总 会 出 现 某 些 事 件 能 够 定 义 变 量 的 取 值, 或 者 再 对 变 量 进 行 去 定 义 显 然 处 于 去 定 义 状 态 的 变 量 就 不 能 够 引 用 到 需 要 使 用 它 的 值 的 环 境 当 中 去 对 于 在 程 序 运 行 当 中 有 可 能 出 现 的 异 常 的 变 量 去 定 义 状 态, 编 译 器 常 常 并 不 能 够 检 查 出 来, 因 为 要 求 编 译 器 总 是 去 检 查 任 何 变 量 的 定 义 状 态, 是 一 件 花 销 特 别 庞 大 的 工 作, 因 此 主 要 的 避 免 出 现 变 量 的 异 常 定 义 状 态 的 任 务, 必 须 由 程 序 编 写 者 来 承 担, 做 到 在 程 序 的 编 写 过 程 中 尽 量 避 免 能 够 导 致 变 量 状 态 定 义 异 常 的 事 件 的 出 现 子 对 象 的 定 义 状 态 对 于 由 一 些 子 对 象 组 成 的 数 据 对 象, 它 们 的 定 义 状 态 是 由 它 们 的 所 有 子 对 象 的 定 义 状 态 决 定, 即 只 有 每 个 子 对 象 都 是 良 定 义 的, 整 个 数 据 对 象 才 是 良 定 义 的 ; 只 要 它 的 一 个 子 对 象 是 去 定 义 的, 那 么 整 个 数 据 对 象 就 是 去 定 义 的 这 样 一 些 数 据 对 象 以 及 子 对 象 的 例 子 包 括 : 复 型 数 据 及 其 实 部 和 虚 部 数 组 及 其 元 素 或 数 组 片 断 ; 字 符 型 变 量 及 其 字 符 子 串 ; 结 构 及 其 成 员 如 果 一 个 能 够 具 有 子 对 象 的 数 据 对 象 的 子 对 象 数 目 是 0, 那 么 约 定 它 是 良 定 义 的, 例 如 0 尺 度 的 数 组 和 0 长 度 的 字 符 串 影 响 变 量 定 义 状 态 的 事 件 一 个 程 序 的 执 行 过 程, 实 际 上 就 是 一 个 不 断 地 对 其 中 的 变 量 进 行 赋 值, 引 用, 再 赋 值 的 过 程, 因 此 几 乎 每 一 个 可 执 行 语 句 完 成 后, 都 会 导 致 某 些 变 量 取 值 的 变 化, 这 种 取 值 的 变 化 也 就 影 响 了

283 变 量 的 定 义 状 态, 即 或 者 是 保 持 变 量 的 定 义 状 态 不 变, 或 者 是 改 变 了 变 量 的 定 义 状 态 下 面 我 们 分 2 节 分 别 讨 论 在 程 序 运 行 过 程 当 中, 能 够 导 致 变 量 良 定 义 的 事 件, 与 能 够 导 致 变 量 去 定 义 的 事 件 导 致 变 量 良 定 义 的 事 件 在 程 序 运 行 过 程 当 中 的 如 下 的 事 件 能 够 导 致 变 量 获 得 良 定 义 : 在 固 有 赋 值 语 句 当 中, 除 了 过 滤 数 组 赋 值 与 指 标 并 行 数 组 赋 值 之 外, 都 能 够 在 执 行 后 使 得 等 号 前 面 的 变 量 获 得 良 定 义 过 滤 数 组 赋 值 与 指 标 并 行 数 组 赋 值 的 执 行, 都 能 够 使 得 赋 值 语 句 当 中 的 数 组 的 部 分 元 素 或 全 部 元 素 获 得 良 定 义 在 执 行 输 入 语 句 的 过 程 当 中, 从 输 入 文 件 获 得 赋 值 的 每 个 变 量 都 在 数 据 传 递 到 该 变 量 时 获 得 良 定 义 执 行 一 个 单 位 说 明 符 指 向 一 个 内 部 文 件 的 WRITE 语 句 时 后, 被 写 入 的 每 个 纪 录 都 获 得 良 定 义 执 行 一 个 DO 语 句 之 后, 其 中 可 能 有 的 任 何 DO 变 量 都 获 得 良 定 义 在 FORALL 结 构 或 语 句 当 中, 当 指 标 名 称 值 集 经 过 计 算 之 后, 其 指 标 名 称 就 获 得 良 定 义 执 行 一 个 输 入 输 出 语 句 内 部 由 一 个 隐 式 DO 列 表 给 出 的 指 令 之 后, 隐 式 DO 变 量 就 获 得 良 定 义 如 果 与 一 个 过 程 的 哑 元 相 关 联 的 实 元 获 得 非 语 句 标 签 的 良 定 义, 那 么 引 用 该 过 程 后, 该 哑 元 数 据 对 象 就 获 得 了 良 定 义 如 果 与 该 哑 元 相 应 的 实 元 只 是 部 分 子 对 象 获 得 非 语 句 标 签 的 良 定 义, 那 么 那 么 引 用 该 过 程 后, 也 只 有 该 哑 元 数 据 对 象 相 应 的 部 分 子 对 象 获 得 良 定 义 执 行 一 个 具 有 输 入 输 出 说 明 符 IOSTAT= 的 输 入 输 出 语 句 使 得 被 指 定 的 整 型 变 量 获 得 良 定 义 执 行 一 个 包 含 输 入 输 出 说 明 符 SIZE= 的 READ 语 句 使 得 被 指 定 的 整 型 变 量 获 得 良 定 义 在 没 有 错 误 条 件 存 在 的 情 况 下, 执 行 一 个 INQUIRE 语 句, 使 得 在 执 行 语 句 过 程 中 被 赋 值 的 任 何 变 量 都 获 得 良 定 义 当 一 个 字 符 存 储 单 位 获 得 良 定 义 之 后, 所 有 通 过 该 存 储 单 位 而 建 立 存 储 关 联 的 字 符 数 据 对 象 都 获 得 良 定 义 当 一 个 数 值 存 储 单 位 获 得 良 定 义 之 后, 所 有 通 过 该 存 储 单 位 而 建 立 存 储 关 联 的 相 同 类 型 的 数 值 数 据 对 象 都 获 得 良 定 义 当 一 个 存 储 双 精 度 实 型 数 据 的 存 储 序 列 获 得 良 定 义 之 后, 所 有 通 过 该 存 储 序 列 而 建 立 存 储 关 联 的 双 精 度 实 型 数 据 对 象 都 获 得 良 定 义 当 一 个 不 定 存 储 单 位 获 得 良 定 义 之 后, 所 有 通 过 该 不 定 存 储 单 位 而 建 立 存 储 关 联 的 数 据 对 象 都 获 得 良 定 义 当 一 个 存 储 默 认 复 型 数 据 的 存 储 序 列 获 得 良 定 义 之 后, 所 有 通 过 该 存 储 序 列 而 建 立 部 分 存 储 关 联 的 默 认 实 型 数 据 对 象 都 获 得 良 定 义 如 果 一 个 默 认 复 型 数 据 的 存 储 序 列 的 各 个 部 分 都 与 其 他 的 获 得 良 定 义 的 默 认 实 型 数 据 或 默 认 复 型 数 据 建 立 了 部 分 关 联, 那 么 该 默 认 复 型 数 据 对 象 就 获 得 了 良 定 义 如 果 一 个 数 值 序 列 结 构 或 字 符 序 列 结 构 的 所 有 成 员 都 与 其 他 的 获 得 良 定 义 的 数 据 对 象 建 立 了 部 分 关 联, 那 么 序 列 结 构 也 就 获 得 了 良 定 义 执 行 一 个 包 含 说 明 符 STAT= 的 ALLOCATE 语 句 或 DEALLOCATE 语 句, 使 得 被 说 明 符 STAT= 指 定 的 变 量 获 得 良 定 义 执 行 在 一 个 指 针 与 良 定 义 的 目 标 之 间 建 立 关 联 的 指 针 语 句, 就 使 得 该 指 针 获 得 良 定 义 零 尺 度 数 组 经 过 分 配 就 使 得 该 数 组 获 得 良 定 义

284 如 果 一 个 派 生 类 型 对 象 的 所 有 非 指 针 直 接 成 员 ( 参 见 第 6 章 ) 都 具 有 默 认 初 始 化, 那 么 该 派 生 类 型 对 象 的 分 配 导 致 其 成 员 获 得 良 定 义 调 用 一 个 过 程 使 得 其 中 所 有 零 尺 度 的 动 态 对 象 都 获 得 良 定 义 如 果 一 个 过 程 包 含 了 一 个 非 保 留 局 部 对 象, 该 对 象 不 是 一 个 哑 元, 不 能 通 过 使 用 关 联 或 宿 主 关 联 得 到 访 问, 也 不 具 有 ALLOCATABLE 以 及 POINTER 属 性, 并 且 属 于 派 生 类 型, 其 中 所 有 直 接 成 员 都 指 定 为 默 认 初 始 化, 那 么 调 用 该 过 程, 将 导 致 该 对 象 的 成 员 获 得 良 定 义 如 果 一 个 过 程 具 包 含 一 个 具 有 INTENT(OUT) 属 性 的 哑 元, 并 且 该 哑 元 作 为 一 个 派 生 类 型 对 象, 它 的 所 有 非 指 针 直 接 成 员 都 具 有 默 认 初 始 化, 那 么 该 哑 元 的 成 员 都 获 得 良 定 义 如 果 一 个 非 指 针 函 数 是 一 个 派 生 类 型 对 象, 它 的 所 有 非 指 针 直 接 成 员 都 具 有 默 认 初 始 化, 那 么 调 用 该 函 数 将 导 致 函 数 结 果 的 成 员 获 得 良 定 义 导 致 变 量 去 定 义 的 事 件 在 程 序 运 行 过 程 当 中 的 如 下 的 事 件 能 够 导 致 变 量 的 定 义 状 态 为 去 定 义 状 态 : 如 果 一 个 具 有 给 定 类 型 的 变 量 获 得 了 良 定 义, 那 么 就 导 致 与 该 变 量 相 关 联 的 具 有 不 同 类 型 的 变 量 去 定 义 不 过 还 有 如 下 2 种 特 殊 的 例 外 情 况 : 如 果 一 个 默 认 实 型 变 量 与 一 个 默 认 复 型 变 量 部 分 关 联, 当 实 型 变 量 获 得 良 定 义, 同 时 实 型 变 量 在 复 型 变 量 获 得 良 定 义 时 并 不 会 去 定 义, 那 么 该 复 型 变 量 也 不 会 去 定 义 如 果 一 个 默 认 复 型 变 量 与 另 外 一 个 复 型 变 量 部 分 关 联, 那 么 其 中 一 个 复 型 变 量 得 到 良 定 义 不 会 导 致 另 一 个 复 型 变 量 去 定 义 如 果 一 个 函 数 经 过 计 算, 导 致 函 数 的 实 元 或 者 是 模 块 或 公 用 块 里 面 的 变 量 获 得 了 良 定 义, 同 时 如 果 该 函 数 还 被 一 个 表 达 式 引 用, 而 该 函 数 的 值 在 该 表 达 式 里 面 并 不 参 与 决 定 表 达 式 的 值, 那 么 在 该 表 达 式 完 成 计 算 之 后, 就 导 致 那 个 实 元 或 变 量 去 定 义 执 行 了 一 个 子 程 序 里 面 的 RETURN 语 句 或 END 语 句 之 后, 就 导 致 该 子 程 序 的 所 有 作 用 域 单 位 里 面 的 局 部 变 量, 或 属 于 递 归 调 用 的 当 前 作 用 域 单 位 里 面 的 局 部 变 量 都 为 去 定 义 状 态 不 过 以 下 情 况 为 例 外 : 具 有 SAVE 属 性 的 变 量 例 外 ; 具 有 空 公 用 属 性 的 变 量 例 外 ; 从 宿 主 作 用 域 单 位 访 问 得 到 的 变 量 例 外 ; 同 时 出 现 在 一 个 子 程 序 以 及 另 外 一 个 直 接 或 间 接 引 用 了 该 子 程 序 的 作 用 域 单 位 里 的 命 名 公 用 块 里 面 的 变 量 例 外 ; 从 一 个 模 块 访 问 得 到 的 变 量 例 外, 同 时 要 求 该 模 块 至 少 被 另 一 个 直 接 或 间 接 引 用 该 模 块 的 作 用 域 单 位 所 引 用 在 一 个 已 经 获 得 初 始 定 义 然 而 还 没 有 得 到 进 一 步 定 义 或 重 定 义 的 命 名 公 用 块 里 面 的 变 量 例 外 如 果 在 一 个 输 入 语 句 的 执 行 过 程 中, 出 现 了 错 误 条 件 或 者 文 件 终 止 条 件, 那 么 由 该 语 句 的 输 入 列 表 或 名 称 列 表 集 合 所 给 出 的 所 有 变 量 都 去 定 义 如 果 在 一 个 输 入 输 出 语 句 的 执 行 过 程 中, 出 现 了 错 误 条 件 或 者 文 件 终 止 条 件, 那 么 部 分 或 全 部 的 隐 式 DO 变 量 去 定 义 执 行 一 个 自 定 义 赋 值 语 句 可 能 导 致 其 等 号 之 前 的 部 分 或 全 部 变 量 去 定 义 执 行 一 个 说 明 了 还 未 写 入 的 纪 录 的 直 接 访 问 输 入 语 句, 将 导 致 由 语 句 的 输 入 列 表 所 给 出 的 所 有 变 量 去 定 义 执 行 INQUIRE 语 句 使 得 NAME=,RECL=,NEXTREC= 变 量 去 定 义 当 一 个 字 符 存 储 单 位 去 定 义, 那 么 所 有 与 其 相 关 联 的 字 符 数 据 对 象 单 位 去 定 义

285 如 果 一 个 数 值 存 储 单 位 去 定 义, 那 么 所 有 与 其 相 关 联 的 数 值 数 据 对 象 单 位 去 定 义 唯 一 的 例 外 是 导 致 数 值 存 储 单 位 的 去 定 义 的 是 由 于 给 该 单 位 定 义 了 一 个 具 有 不 同 类 型 的 数 值 数 据 对 象 如 果 一 个 双 精 度 实 型 对 象 去 定 义, 那 么 所 有 与 其 完 全 关 联 的 双 精 度 实 型 对 象 都 去 定 义 如 果 一 个 不 定 存 储 单 位 去 定 义, 那 么 所 有 与 其 相 关 联 的 数 据 对 象 都 去 定 义 如 果 一 个 可 分 配 数 组 去 分 配, 那 么 它 也 就 去 定 义 针 对 一 个 还 没 有 指 定 默 认 初 始 化 的 非 零 尺 度 对 象 执 行 ALLOCATE 语 句, 如 果 执 行 成 功, 那 么 将 产 生 一 个 去 定 义 的 对 象 如 果 在 执 行 一 个 INQUIRE 语 句 时 出 现 错 误 条 件, 那 么 所 有 查 询 说 明 符 变 量 去 定 义, 在 说 明 符 IOSTAT= 里 面 的 变 量 例 外 调 用 一 个 过 程 会 导 致 如 下 几 种 去 定 义 情 形 : 没 有 关 联 任 何 实 元 的 可 选 哑 元 去 定 义 ; 具 有 INTENT(OUT) 属 性 的 哑 元 去 定 义, 除 非 是 那 些 指 定 了 默 认 初 始 化 的 变 元 的 成 员 与 一 个 具 有 INTENT(OUT) 属 性 的 哑 元 相 关 联 的 实 元 去 定 义 如 果 一 个 哑 元 的 子 对 象 所 关 联 的 实 元 子 对 象 去 定 义, 那 么 它 自 身 也 去 定 义 函 数 的 结 果 变 量 去 定 义, 例 外 是 指 定 了 默 认 初 始 化 的 结 果 的 成 员 当 一 个 指 针 的 关 联 状 态 去 定 义 或 去 关 联, 那 么 该 指 针 即 去 定 义 当 FORALL 语 句 或 结 构 执 行 完 毕 之 后, 指 标 名 称 去 定 义 而 如 果 在 相 应 的 程 序 单 位 里 面 存 在 与 之 同 名 的 变 量, 则 该 变 量 不 受 FORALL 语 句 或 结 构 的 影 响 第 16 章 数 据 文 件 的 管 理 固 然, 我 们 编 制 一 个 科 学 计 算 程 序 的 目 的 是 执 行 给 定 的 计 算, 是 描 述 一 个 通 过 算 法 而 实 现 的 对 输 入 数 据 的 计 算 的 过 程, 而 不 只 是 简 单 的 对 数 据 的 处 理, 但 是 这 并 不 妨 碍 我 们 从 信 息 处 理 的 角 度 来 看 待 这 个 过 程 因 为 任 何 的 计 算, 再 简 单 也 必 定 包 含 数 据 的 输 入 与 输 出 过 程, 更 复 杂 的 计 算 程 序 则 还 包 含 数 据 的 缓 存 管 理, 不 同 程 序 单 位 之 间 的 数 据 传 递, 特 别 是 在 程 序 的 计 算 涉 及 到 庞 大 的 数 据 量 时, 例 如 在 工 程 计 算 中 常 见 的 大 数 组 等, 更 加 不 能 依 靠 单 纯 的 变 量 来 管 理 庞 大 的 数 据 量 实 际 上 分 析 一 下 我 们 自 己 进 行 计 算 的 情 形, 就 知 道 在 计 算 过 程 当 中 进 行 数 据 管 理 同 样 是 一 件 非 常 重 要 的 事 务, 而 按 照 计 算 机 的 从 冯 纽 曼 时 代 就 已 经 给 予 奠 基 的 基 本 模 型 来 看, 一 台 计 算 机 的 有 效 工 作, 依 赖 于 指 令 流 与 数 据 流 的 有 机 合 作, 因 此 FORTRAN 语 言 除 了 要 描 述 计 算, 还 要 能 够 描 述 对 于 数 据 流 的 管 理 在 前 面 我 们 已 经 讨 论 了 FORTRAN 程 序 的 内 部 通 讯 问 题, 那 种 通 讯 完 全 是 依 赖 变 量 机 制 来 进 行 的, 因 为 那 种 通 讯 都 是 紧 密 关 联 于 计 算 的 通 讯, 直 接 在 变 量 之 间 进 行 数 据 值 的 交 换 能 够 保 证 计 算 的 效 率 和 速 度 但 是 一 旦 计 算 所 涉 及 的 数 据 量 非 常 庞 大, 而 计 算 过 程 对 于 数 据 的 输 入 与 输 出 要 求 更 加 复 杂 时, 变 量 机 制 就 不 足 以 承 担 数 据 处 理 的 功 能, 因 此 FORTRAN 提 供 了 单 独 的 输 入 输 出 语 句 以 及 文 件 的 概 念, 来 实 现 对 数 据 流 的 输 入 输 出 的 管 理 除 了 作 为 面 向 程 序 自 身 的 数 据 输 入 输 出 管 理 的 功 能 之 外, 一 个 FORTRAN 程 序 的 完 整 运 行 还 必 须 包 括 程 序 与 人 的 交 互, 而 一 旦 涉 及 到 机 器 与 人 的 交 互, 自 然 要 求 任 何 数 据 都 必 须 以 适 宜 于 人 的 辨 识 与 处 理 的 格 式 出 现 于 一 定 的 物 理 媒 质 上, 这 就 是 输 入 与 输 出 的 编 辑 问 题, 将 是 下 章 所 要 讨 论 的 内 容, 本 章 则 只 说 明 FORTRAN 所 提 供 的 输 入 输 出 处 理 语 句

286 FO RTRAN 用 于 处 理 与 管 理 输 入 输 出 数 据 的 语 句 分 为 如 下 四 大 类 : 文 件 联 结 语 句 包 括 OPEN 语 句 和 CLOSE 语 句 数 据 传 输 语 句 这 一 类 语 句 又 可 以 分 为 2 个 小 类 别 : 据 传 输 输 入 语 句, 包 括 READ 语 句 据 传 输 输 出 语 句, 包 括 WRITE 语 句 和 PRINT 语 句 文 件 定 位 语 句 包 括 BACKSPACE 语 句,ENDFILE 语 句 以 及 REWIND 语 句 文 件 查 询 语 句 包 括 INQUIRE 语 句 这 些 语 句 所 要 实 现 的 首 要 的 功 能, 就 是 控 制 数 据 的 输 入 与 输 出, 即 数 据 从 外 部 媒 质 到 内 存, 或 从 内 部 文 件 到 内 存 的 输 入, 以 及 数 据 从 内 存 到 外 部 媒 质, 或 从 内 存 到 内 部 文 件 的 输 出 然 后 就 是 辅 助 性 的 用 来 操 纵 外 部 媒 质, 以 及 描 述 或 查 询 文 件 与 外 部 媒 质 的 联 结 属 性 的 功 能 下 面 在 给 出 FORTRAN 管 理 数 据 输 入 输 出 的 一 般 概 念 之 后, 再 分 别 详 细 讨 论 这 些 语 句 16.1 输 入 输 出 管 理 的 数 据 单 位 FORTRAN 对 于 输 入 输 出 数 据 进 行 管 理 的 基 本 单 位 概 念 是 纪 录 以 及 纪 录 组 成 的 文 件, 因 此 下 面 我 们 分 别 讨 论 纪 录 与 文 件 概 念 纪 录 FORTRAN 的 变 量 一 次 只 能 存 储 一 个 数 据 值, 显 然 不 足 以 用 来 进 行 有 效 的 数 据 管 理, 因 此 FORTRAN 建 立 了 专 门 的 用 来 有 组 织 地 存 储 任 意 数 量 的 数 据 的 概 念, 即 文 件 文 件 由 一 个 纪 录 的 序 列 组 成, 而 纪 录 是 一 种 逻 辑 形 式 上 的 单 位, 可 以 是 终 端 或 打 印 输 出 上 显 示 的 一 行, 也 可 以 是 外 部 存 储 器 上 的 一 个 逻 辑 纪 录, 尽 管 纪 录 总 是 与 各 种 物 理 形 式 的 数 据 单 位 保 持 一 定 的 对 应, 但 实 际 上 是 与 具 体 的 物 理 表 现 形 式 无 关 的, 因 为 纪 录 本 质 上 是 一 个 语 法 上 的 概 念 实 际 上 在 FORTRAN 里 面 并 不 存 在 物 理 纪 录 的 概 念 组 成 一 个 文 件 的 纪 录 从 语 法 地 位 上 分 为 如 下 两 种 : 数 据 纪 录 ; 文 件 终 止 纪 录 所 谓 数 据 纪 录 就 是 作 为 文 件 的 数 据 内 容 的 纪 录, 而 文 件 终 止 纪 录 则 纯 粹 是 一 个 语 法 意 义 上 的 纪 录, 它 不 包 含 任 何 数 据 内 容, 只 是 用 来 标 志 一 个 文 件 的 终 止 因 此 文 件 终 止 纪 录 只 能 用 作 文 件 的 最 后 一 个 纪 录, 并 且 没 有 长 度 的 属 性 由 于 计 算 机 本 质 上 的 串 行 工 作 模 式, 纪 录 同 样 是 一 个 串 行 序 列 的 结 构, 该 序 列 的 单 位 就 是 数 据 值, 即 一 个 数 据 值 的 序 列 组 成 一 个 纪 录 对 于 数 据 纪 录 来 说, 其 中 的 数 据 值 可 以 有 如 下 两 种 表 示 形 式 : 无 格 式 数 据 ; 格 式 化 数 据 所 谓 数 据 的 是 否 具 有 格 式, 完 全 是 针 对 人 而 言 的, 即 具 有 格 式 的 数 据 就 是 把 数 据 转 化 为 便 于

287 人 的 阅 读 的 字 符 型 数 据 表 示 形 式, 也 就 是 文 字 与 数 字, 或 者 说 ASCII 编 码 形 式 ; 而 所 谓 无 格 式 数 据 就 是 FORTRAN 程 序 自 身 所 实 际 处 理 的 数 据 的 在 物 理 层 面 上 的 表 示 形 式, 一 般 都 是 二 进 制 表 示 的 数 字 形 式 对 于 计 算 机 来 说, 世 界 上 的 任 何 形 式 的 信 息, 终 归 都 要 表 示 为 这 种 形 式 的 数 据 一 个 FORTRAN 程 序 所 涉 及 到 的 任 何 数 据, 在 该 程 序 运 行 时, 无 论 是 作 为 运 行 的 结 果 还 是 作 为 运 行 的 初 始 值, 它 写 入 到 内 存 当 中, 或 从 内 存 当 中 读 出, 或 者 是 从 内 存 到 硬 盘 的 输 入 输 出, 数 据 流 里 面 的 数 据 都 是 无 格 式 数 据 而 一 旦 数 据 需 要 人 的 阅 读, 就 必 须 把 二 进 制 数 据 形 式 转 换 为 能 够 被 人 阅 读 的 字 符 形 式, 实 际 上 我 们 编 写 的 源 码 就 是 这 种 形 式 的 数 据 一 个 数 据 纪 录 或 者 完 全 由 无 格 式 的 数 据 组 成, 称 为 无 格 式 纪 录 ; 或 者 完 全 由 格 式 化 数 据 组 成, 称 为 格 式 化 纪 录 无 格 式 纪 录 完 全 只 是 在 机 器 内 部 存 在, 它 的 具 体 的 数 据 形 式 是 由 系 统 决 定 的, 最 常 见 的 就 是 二 进 制 形 式 这 种 纪 录 完 全 不 需 要 人 的 监 视 与 阅 读, 而 格 式 化 纪 录 则 完 全 是 人 用 来 给 机 器 输 入 数 据, 或 机 器 向 人 展 示 数 据 结 果 的 数 据 纪 录 形 式, 因 此 当 人 向 机 器 输 入 格 式 化 纪 录 后, 机 器 必 须 再 把 它 翻 译 为 无 格 式 的 纪 录, 才 能 被 程 序 所 使 用, 反 之 亦 然 格 式 化 纪 录 的 好 处 就 是 便 于 人 的 阅 读, 它 只 能 通 过 格 式 化 输 入 输 出 语 句 来 读 或 写 ; 而 无 格 式 的 纪 录 的 特 点 就 是 能 够 直 接 得 到 机 器 的 处 理, 相 应 的 它 也 只 能 通 过 无 格 式 的 输 入 输 出 语 句 来 读 或 写 对 于 纪 录 可 以 定 义 长 度 的 概 念 格 式 化 纪 录 的 长 度 就 是 其 所 包 含 的 字 符 的 数 目 ; 而 无 格 式 纪 录 的 长 度 同 样 用 来 计 量 其 中 数 据 量 的 大 小, 它 的 具 体 度 量 方 法 的 定 义 则 依 赖 于 具 体 的 处 理 器 系 统 对 于 数 据 量 单 位 的 定 义 格 式 化 纪 录 和 无 格 式 纪 录 的 长 度 都 可 以 为 0 除 了 包 含 数 据 值 的 纪 录 之 外, 还 有 文 件 终 止 纪 录 由 于 它 只 是 起 文 件 终 止 的 语 法 标 志 作 用, 因 此 它 不 包 含 任 何 数 据, 所 以 它 的 长 度 也 就 是 0 一 个 文 件 至 多 只 能 包 含 一 个 文 件 终 止 纪 录, 并 且 只 能 是 文 件 的 最 后 一 个 纪 录 文 件 终 止 纪 录 可 以 有 如 下 几 种 生 成 方 式 : 可 以 通 过 文 件 的 序 列 访 问, 最 后 用 一 个 ENDFILE 语 句 显 式 地 写 下 来 ; 也 可 以 通 过 文 件 定 位 语 句, 如 REWIND 语 句 或 BACKSPACE 语 句, 而 隐 式 地 写 下 来 ; 运 用 CLOSE 语 句 关 闭 文 件 或 部 件, 或 者 是 正 常 地 终 止 程 序, 或 者 是 对 同 一 个 部 件 使 用 了 另 外 一 个 OPEN 语 句, 从 而 隐 式 地 写 下 来 从 上 面 的 文 件 终 止 纪 录 的 实 现 方 式 可 以 看 出, 这 种 纪 录 并 不 需 要 任 何 实 际 的 物 理 实 现 文 件 一 个 纪 录 的 序 列 构 成 一 个 文 件 在 程 序 运 行 的 任 何 时 候, 对 于 一 个 给 定 的 文 件, 它 的 访 问 方 法, 形 式, 操 作 以 及 纪 录 的 长 度, 都 明 确 地 存 在 相 应 的 依 赖 于 系 统 的 合 法 性 规 定, 同 时 文 件 也 可 以 具 有 字 符 串 类 型 的 名 称, 即 所 谓 命 名 文 件, 不 过 对 于 该 名 称 所 使 用 的 字 符 形 式 或 长 度, 都 是 由 具 体 的 系 统 来 规 定, 以 便 与 相 应 操 作 系 统 对 于 文 件 的 命 名 约 定 保 持 一 致 按 照 文 件 与 程 序 的 功 能 关 系 以 及 存 储 性 质, 文 件 可 以 分 为 如 下 两 种 : 内 部 文 件 ; 外 部 文 件 所 谓 内 部 文 件 存 储 在 程 序 可 以 访 问 的 内 存 空 间 里 面, 而 外 部 文 件 则 存 储 在 系 统 的 外 部 存 储 部 件 上, 例 如 硬 盘 这 种 存 储 位 置 的 不 同 实 际 上 也 反 映 了 它 们 对 于 程 序 的 不 同 功 能, 因 为 这 两 种 存

288 储 空 间 的 物 理 性 能 差 异 决 定 了 它 们 对 于 CPU 是 具 有 不 同 意 义 的 外 部 文 件 与 内 部 文 件 的 这 种 不 同 功 能 意 义 体 现 在 如 下 几 个 不 同 的 方 面 : 文 件 的 存 在 性 对 于 外 部 文 件 来 说, 程 序 需 要 访 问 的 一 个 外 部 文 件 可 能 是 存 在 的, 也 可 能 是 不 存 在 的, 都 是 合 法 的 程 序 运 行 现 象 例 如 INQUIRE 语 句,OPEN 语 句,CLOSE 语 句,WRITE 语 句,PRINT 语 句,REWIND 语 句, 以 及 ENDFILE 语 句 都 可 以 引 用 一 个 并 不 存 在 的 文 件 ; 而 如 果 使 用 WRITE 语 句,PRINT 语 句, 或 ENDFILE 语 句 来 引 用 一 个 预 联 结 的 并 不 存 在 的 语 句, 就 自 然 地 能 够 生 成 该 文 件 一 个 外 部 文 件 的 不 存 在 也 可 能 是 来 源 于 系 统 对 于 硬 盘 空 间 的 权 限 限 制, 例 如 对 于 一 个 FORTRAN 应 用 程 序 来 说, 系 统 文 件 以 及 FORTRAN 编 译 器 程 序 文 件 都 不 应 该 被 访 问 而 对 于 程 序 来 说, 它 所 涉 及 的 内 部 文 件 则 都 必 须 存 在 于 相 应 的 内 存 空 间 里 面 程 序 对 外 部 文 件 的 访 问 需 要 通 过 与 逻 辑 部 件 建 立 联 结, 因 此 就 需 要 相 应 的 能 够 对 外 部 文 件 进 行 联 结, 定 位 与 查 询 的 语 句, 而 对 于 内 部 文 件 则 不 需 要 这 些 语 句 功 能 同 时 这 种 联 结 就 使 得 外 部 文 件 具 有 定 位 的 属 性 对 于 外 部 文 件 来 说, 它 的 访 问 方 式, 合 法 形 式, 合 法 操 作, 以 及 合 法 纪 录 长 度 等 都 不 是 由 FORTRAN 语 言 标 准 来 规 定, 而 是 由 操 作 系 统 对 于 文 件 的 约 定 以 及 用 户 的 特 定 选 择 来 决 定 的 ; 而 内 部 文 件 的 内 容 都 是 作 为 默 认 字 符 型 变 量 的 数 据 值 的 形 式 而 储 存 的, 这 些 字 符 型 数 据 值 都 是 程 序 的 通 常 的 赋 值 过 程 所 产 生 的, 或 者 是 输 出 语 句 针 对 变 量 而 给 出 的 如 果 内 部 文 件 所 表 示 的 变 量 是 一 个 标 量, 那 么 该 文 件 就 只 有 一 个 纪 录 ; 如 果 该 变 量 是 一 个 数 组, 那 么 该 数 组 的 每 一 个 元 素 组 成 该 文 件 的 一 个 纪 录, 文 件 里 面 纪 录 的 顺 序 就 是 数 组 的 相 应 的 元 素 顺 序, 每 个 纪 录 的 长 度 就 是 相 应 元 素 的 长 度 文 件 的 访 问 由 于 文 件 的 纪 录 是 一 种 串 行 的 序 列 结 构, 要 实 现 对 文 件 的 纪 录 的 访 问, 可 以 有 如 下 两 种 方 式 : 序 列 访 问 ; 直 接 访 问 所 谓 序 列 访 问, 就 是 顺 着 文 件 的 纪 录 序 列 来 访 问 特 定 的 纪 录, 即 如 果 要 访 问 文 件 的 第 n 个 纪 录, 则 需 要 顺 次 经 过 文 件 的 第 1,, 一 直 到 第 n-1 个 纪 录, 才 访 问 到 第 n 个 纪 录 ; 而 直 接 访 问 则 不 需 要 经 过 前 面 的 n-1 个 纪 录, 通 过 指 定 纪 录 号 即 可 直 接 访 问 第 n 个 纪 录, 因 此 直 接 访 问 无 论 是 读 还 是 写, 都 可 以 按 照 任 意 的 顺 序 进 行 这 两 种 不 同 的 访 问 方 法 很 大 程 度 上 是 由 存 储 文 件 的 媒 质 以 及 系 统 的 约 定 等 外 部 因 素 决 定 的, 例 如 存 储 在 磁 带 上 面 的 可 能 就 只 允 许 采 用 序 列 访 问 的 方 式 进 行 访 问 不 过 当 一 个 文 件 被 联 结 到 了 一 个 特 定 的 部 件 之 后, 或 者 是 预 联 结 的 文 件 被 生 成 之 后, 它 的 访 问 方 式 就 已 经 被 决 定 了 这 两 种 不 同 的 访 问 方 式 是 由 对 文 件 的 联 结 方 式 决 定 的, 而 不 是 属 于 文 件 自 身 的 属 性 一 个 文 件 可 以 只 能 通 过 序 列 访 问 方 式 来 访 问, 也 可 以 只 能 通 过 直 接 访 问 方 式 来 访 问, 也 可 以 分 别 通 过 这 两 种 方 式 来 访 问, 但 不 能 同 时 用 这 两 种 方 式 来 访 问, 也 就 是 说 当 文 件 通 过 某 个 联 结 而 被 程 序 按 照 序 列 方 式 来 访 问, 那 么 需 要 使 用 CLOSE 语 句 来 关 闭 该 联 结 之 后, 再 使 用 OPEN 语 句 重 新 建 立 新 的 联 结, 才 能 换 为 按 照 直 接 访 问 的 方 式 来 访 问 能 够 直 接 访 问 读 的 纪 录 只 限 于 已 经 写 下 来 的 纪 录 能 够 直 接 访 问 写 的 文 件 限 于 建 立 了 直 接 访 问 联 结 的 文 件

289 1. 序 列 访 问 一 个 外 部 文 件 建 立 了 序 列 访 问 的 联 结 之 后, 它 就 具 有 如 下 的 属 性 : 如 果 针 对 该 文 件 的 直 接 访 问 是 非 法 的, 那 么 组 成 该 文 件 的 纪 录 的 顺 序 就 是 写 入 该 文 件 的 纪 录 顺 序 ; 如 果 同 时 针 对 该 文 件 的 直 接 访 问 也 是 合 法 的, 那 么 该 文 件 的 纪 录 的 顺 序 由 直 接 访 问 来 决 定, 即 序 列 访 问 该 文 件 的 第 一 个 纪 录 就 是 直 接 访 问 该 文 件 所 指 定 的 纪 录 号 为 1 的 纪 录, 后 面 顺 次 类 推 文 件 的 纪 录 或 者 全 部 是 格 式 化 纪 录, 或 者 全 部 是 无 格 式 纪 录, 当 然 有 可 能 出 现 在 文 件 最 后 的 文 件 终 止 纪 录 除 外 只 要 该 文 件 的 前 一 个 引 用 不 是 数 据 传 输 输 出 语 句 或 文 件 定 位 语 句, 那 么 文 件 的 最 后 一 个 纪 录 就 一 定 是 文 件 终 止 纪 录 文 件 的 纪 录 不 允 许 直 接 访 问 输 入 输 出 语 句 的 读 与 写 2. 直 接 访 问 如 果 一 个 外 部 文 件 所 建 立 的 联 结 是 直 接 访 问, 那 么 该 文 件 具 有 如 下 属 性 : 文 件 的 所 有 纪 录 都 具 有 一 个 唯 一 的 纪 录 号, 该 纪 录 号 为 一 个 正 整 数, 是 在 写 纪 录 时 给 定 的, 而 这 个 纪 录 号 一 旦 给 定, 就 再 也 不 能 改 变 该 纪 录 号 决 定 了 文 件 的 纪 录 的 顺 序 文 件 的 任 何 纪 录 不 允 许 被 删 除, 但 允 许 被 改 写 文 件 的 纪 录 或 者 全 部 是 格 式 化 纪 录, 或 者 全 部 是 无 格 式 纪 录 如 果 对 于 该 文 件 序 列 访 问 方 式 也 是 合 法 的, 那 么 当 该 文 件 被 联 结 到 直 接 访 问 时, 它 有 可 能 包 含 的 文 件 终 止 纪 录 则 不 被 认 为 是 属 于 该 文 件 的 一 部 分 如 果 对 于 该 文 件 不 允 许 序 列 访 问, 那 么 该 文 件 就 不 能 包 含 文 件 终 止 纪 录 只 有 通 过 直 接 访 问 输 入 输 出 语 句 才 能 实 现 对 纪 录 的 读 和 写 文 件 所 有 的 纪 录 的 长 度 相 同 对 于 一 个 文 件 的 纪 录 的 读 写 顺 序 不 一 定 要 求 按 照 纪 录 号 的 顺 序 一 旦 文 件 与 部 件 建 立 了 联 结, 那 么 对 于 该 文 件 的 纪 录 的 读 写 可 以 是 任 意 顺 序 的 文 件 的 纪 录 不 能 使 用 表 控 格 式, 名 称 列 表 格 式, 或 通 过 非 预 输 入 输 出 语 句 来 读 写 文 件 的 定 位 由 于 文 件 是 一 个 数 据 的 集 合, 因 此 程 序 在 运 行 过 程 当 中, 对 于 文 件 的 读 写 操 作 总 是 意 味 着 程 序 当 前 所 使 用 的 数 据 是 在 发 生 变 化 的, 为 了 描 述 程 序 当 前 所 使 用 的 数 据 或 纪 录,FORTRAN 定 义 了 文 件 的 位 置 的 概 念, 并 且 还 给 出 了 专 门 用 来 对 文 件 位 置 进 行 操 作 的 语 句, 以 便 实 现 对 文 件 所 包 含 的 数 据 的 精 确 访 问 与 操 作 针 对 文 件 所 包 含 的 纪 录 的 串 行 序 列 结 构, 以 及 纪 录 本 身 所 包 含 的 数 据 值 的 串 行 序 列 结 构, FORTRA N 定 义 了 如 下 几 个 特 征 性 的 文 件 的 定 位 情 形 : 初 始 点 即 文 件 第 一 个 纪 录 前 面 紧 接 该 纪 录 的 位 置 如 果 文 件 定 位 在 这 个 位 置, 那 么 程 序 对 于 该 文 件 的 操 作 将 从 文 件 的 第 一 个 纪 录 开 始 终 止 点 即 文 件 最 后 一 个 纪 录 后 面 紧 接 该 纪 录 的 位 置 如 果 文 件 定 位 在 这 个 位 置, 那 么 程 序 接 下 来 的 操 作 将 不 进 入 该 文 件 如 果 文 件 为 空 文 件, 即 不 包 含 任 何 数 据, 那 么 它 的 初 始 点 和 终 止 点 相 同

290 对 于 文 件 的 定 位 可 以 处 于 两 个 紧 接 的 纪 录 中 间, 这 时 位 于 该 位 置 的 前 面 的 那 个 纪 录 称 为 前 纪 录, 而 位 于 该 位 置 的 后 面 的 那 个 纪 录 称 为 后 纪 录 当 然 对 于 初 始 点 不 存 在 前 纪 录, 而 对 于 终 止 点 则 不 存 在 后 纪 录 对 于 文 件 的 定 位 也 可 以 是 在 输 入 输 出 语 句 运 行 时 的 当 前 纪 录 上 面, 这 时 该 当 前 纪 录 的 紧 接 的 前 面 的 那 个 纪 录 称 为 其 前 纪 录, 而 该 当 前 纪 录 的 紧 接 的 后 面 的 那 个 纪 录 称 为 其 后 纪 录 当 然, 如 果 文 件 定 位 不 是 在 一 个 纪 录 里 面, 那 么 当 前 纪 录 就 不 存 在 当 文 件 定 位 处 于 当 前 文 件 时, 还 可 以 更 加 详 细 地 描 述 为 定 位 于 当 前 纪 录 的 数 据 值 序 列 的 初 始 点 或 终 止 点, 或 纪 录 的 任 意 两 个 数 据 值 之 间 即 该 纪 录 的 紧 接 在 数 据 值 序 列 的 第 一 个 数 据 值 前 面 的 位 置, 或 紧 接 在 数 据 值 序 列 的 最 后 一 个 数 据 值 后 面 的 位 置, 或 在 数 据 值 序 列 里 面 的 任 意 两 个 数 据 值 之 间 的 位 置 内 部 文 件 总 是 在 数 据 传 输 之 前 定 位 在 纪 录 的 开 始 位 置 预 输 入 输 出 操 作 总 是 以 纪 录 为 单 位 的, 因 此 完 成 这 样 一 个 操 作 之 后, 文 件 总 是 定 位 于 一 个 纪 录 的 终 止 位 置 或 纪 录 之 间 的 位 置 ; 而 非 预 输 入 输 出 操 作 是 以 字 符 为 单 位 的, 因 此 完 成 一 个 非 预 输 入 输 出 操 作 之 后, 文 件 有 可 能 定 位 于 当 前 纪 录 的 字 符 序 列 之 间 输 入 输 出 语 句 的 运 行 总 能 影 响 外 部 文 件 的 定 位, 根 据 作 用 效 果 的 不 同, 输 入 输 出 语 句 可 以 分 为 如 下 两 种 : 预 输 入 输 出 语 句 一 个 预 输 入 输 出 语 句 总 是 在 文 件 的 最 后 一 个 纪 录 完 成 读 写 之 后 对 文 件 定 位, 除 非 中 途 发 生 错 误 非 预 输 入 输 出 语 句 一 个 非 预 输 入 输 出 语 句 可 以 定 位 于 当 前 纪 录 里 面 的 字 符 位 置, 或 者 是 随 后 的 纪 录 上 面 运 用 非 预 输 入 输 出 语 句 就 可 以 通 过 一 个 输 入 输 出 语 句 序 列 读 写 文 件 的 纪 录, 其 中 每 个 语 句 访 问 纪 录 的 一 部 分 这 种 语 句 也 可 以 用 来 读 可 变 长 度 的 纪 录 在 数 据 传 输 之 前 的 文 件 的 定 位 在 直 接 访 问 文 件 与 序 列 访 问 文 件 时 有 不 同 的 约 定 : 序 列 输 入 时, 如 果 存 在 当 前 纪 录, 那 么 文 件 定 位 不 变 ; 否 则 文 件 定 位 于 下 一 个 纪 录 的 头 部, 自 然 该 纪 录 就 成 为 了 当 前 纪 录 如 果 这 个 纪 录 不 存 在, 或 者 在 存 在 当 前 纪 录, 而 最 近 访 问 文 件 的 数 据 传 输 语 句 执 行 的 是 输 出, 那 么 该 输 入 就 不 执 行 如 果 文 件 包 含 文 件 终 止 纪 录, 那 么 在 数 据 传 输 之 前 文 件 不 能 定 位 于 文 件 终 止 纪 录 后 面 可 以 运 用 REWIND 语 句 和 BACKSPACE 语 句 来 对 文 件 重 定 位 序 列 输 出 时, 如 果 存 在 当 前 纪 录, 那 么 文 件 定 位 不 会 变 化, 当 前 纪 录 成 为 文 件 的 最 后 纪 录 ; 如 果 不 存 在 当 前 纪 录, 那 么 就 生 成 下 一 个 纪 录 作 为 文 件 的 当 前 纪 录, 文 件 定 位 于 该 当 前 纪 录 的 头 部 如 果 是 直 接 访 问, 文 件 的 定 位 情 形 非 常 简 单, 即 定 位 于 纪 录 说 明 符 所 指 定 的 纪 录 的 头 部 该 纪 录 就 是 文 件 的 当 前 纪 录 在 数 据 传 输 过 程 结 束 之 后, 文 件 的 定 位 有 如 下 几 种 情 形 : 如 果 数 据 传 输 过 程 了 发 生 错 误, 那 么 文 件 定 位 就 是 不 可 预 知 的 如 果 数 据 传 输 过 程 没 有 发 生 错 误, 但 是 读 入 了 文 件 终 止 纪 录 而 导 致 文 件 终 止, 那 么 文 件 定 位 于 文 件 终 止 纪 录 之 后 对 于 非 预 输 入 如 果 没 有 出 现 错 误, 也 没 有 出 现 文 件 终 止 条 件, 但 是 出 现 了 纪 录 终 止 条 件, 那 么 文 件 定 位 于 刚 读 入 的 纪 录 之 后 ; 如 果 纪 录 终 止 条 件 也 没 有 出 现, 那 么 文 件 定 位 不 变 对 于 非 预 输 出 如 果 没 有 出 现 错 误, 则 文 件 定 位 不 变 在 所 有 的 其 他 情 况 下, 文 件 定 位 于 刚 读 写 过 的 纪 录 之 后, 该 纪 录 就 成 为 了 前 纪 录

291 内 部 文 件 内 部 文 件 的 概 念 是 FORTRAN 语 言 的 一 个 很 大 的 特 点, 它 实 现 了 数 据 从 内 存 到 内 存 的 传 输 与 转 换 的 功 能 内 部 文 件 的 属 性 与 约 定 如 下 : 内 部 文 件 为 默 认 字 符 型 变 量, 不 能 是 带 向 量 下 标 的 数 组 片 断 内 部 文 件 的 纪 录 为 标 量 字 符 变 量 如 果 文 件 本 身 就 是 一 个 标 量 字 符 变 量, 那 么 该 文 件 就 只 包 含 一 个 纪 录, 其 长 度 就 是 标 量 字 符 变 量 的 长 度 如 果 内 部 文 件 是 一 个 字 符 数 组, 那 么 它 就 被 看 成 是 一 个 字 符 数 组 元 素 的 序 列, 其 中 的 每 个 元 素 都 是 该 文 件 的 一 个 纪 录, 该 文 件 纪 录 的 顺 序 就 是 该 数 组 或 数 组 片 断 的 数 组 元 素 序, 该 文 件 的 每 个 纪 录 的 长 度 都 相 同, 即 数 组 元 素 的 长 度 写 入 内 部 文 件 纪 录 的 同 时 就 定 义 了 该 纪 录 如 果 写 入 字 符 数 目 少 于 纪 录 长 度, 那 么 纪 录 多 余 的 空 间 就 被 填 上 空 字 符 写 入 的 字 符 数 目 不 能 超 过 纪 录 长 度 只 有 在 内 部 文 件 的 纪 录 被 定 义 之 后, 才 能 读 入 该 纪 录 内 部 文 件 的 纪 录 除 了 通 过 输 入 语 句 之 外, 还 可 以 使 用 其 他 方 法 得 到 定 义 或 去 定 义, 例 如 字 符 赋 值 语 句 也 能 够 定 义 作 为 纪 录 的 字 符 变 量 在 数 据 传 输 之 前, 内 部 文 件 总 是 定 位 于 第 一 个 纪 录 的 头 部, 而 该 纪 录 就 是 当 前 纪 录 在 输 入 内 部 文 件 时, 对 空 格 的 处 理 与 使 用 具 有 值 NULL 的 说 明 符 BLANK= 来 打 开 外 部 文 件 一 样, 在 必 要 的 时 候 纪 录 可 以 添 加 空 格 在 表 控 输 出 时, 字 符 常 量 不 能 定 界 内 部 文 件 纪 录 的 读 与 写 只 能 通 过 不 说 明 名 称 列 表 格 式 的 序 列 访 问 格 式 化 输 入 输 出 语 句 来 完 成 内 部 文 件 不 能 出 现 在 文 件 联 结 语 句, 文 件 定 位 语 句 以 及 文 件 查 询 语 句 当 中 16.2 文 件 的 部 件 联 结 与 访 问 程 序 要 和 文 件 进 行 通 讯, 都 需 要 程 序 通 过 一 定 的 部 件 联 结 到 文 件, 即 通 过 部 件 输 出 数 据 到 文 件, 通 过 部 件 从 文 件 输 入 数 据 到 程 序 这 里 的 所 谓 部 件 是 一 个 纯 粹 的 逻 辑 概 念, 而 不 是 一 个 物 理 概 念, 之 所 以 要 引 入 这 么 一 个 逻 辑 概 念, 主 要 的 原 因 就 是 为 了 在 语 言 里 获 得 对 输 入 输 出 的 通 用 描 述 因 为 我 们 知 道 文 件 概 念 实 际 上 是 与 操 作 系 统 与 硬 件 存 储 形 式 密 切 相 关 的, 不 同 的 操 作 系 统 与 硬 件 存 储 形 式 里 面, 对 于 文 件 往 往 有 不 同 的 形 式 约 定, 因 此 为 了 使 得 对 输 入 输 出 能 够 有 不 依 赖 于 具 体 系 统 的 描 述,FORTRAN 引 入 了 部 件 这 个 逻 辑 概 念 作 为 数 据 从 程 序 到 文 件 之 间 的 桥 梁 部 件 使 用 如 下 的 语 法 表 示 方 法 (R901): io-unit 其 中 的 输 入 输 出 部 件 (io-unit) 可 以 具 有 如 下 三 种 形 式 之 一 : external-file-unit * internal-file-unit 其 中 外 部 文 件 部 件 的 表 示 形 式 为 标 量 整 型 表 达 式 或 者 是 一 个 星 号, 而 内 部 文 件 部 件 的 表 示 形

292 式 为 默 认 字 符 型 变 量 部 件 的 一 般 规 则 如 下 : 表 示 内 部 文 件 部 件 的 默 认 字 符 型 变 量 不 能 是 带 有 向 量 下 标 的 数 组 片 断 一 个 部 件 可 以 作 为 外 部 部 件 也 可 以 作 为 内 部 部 件 外 部 部 件 用 来 联 结 外 部 文 件 ; 而 内 部 部 件 用 来 联 结 内 部 文 件 如 果 表 示 内 部 文 件 部 件 的 字 符 型 变 量 是 指 针, 那 么 该 指 针 必 须 是 获 得 了 关 联 的 如 果 表 示 内 部 文 件 部 件 的 字 符 型 变 量 是 一 个 可 分 配 数 组, 或 者 这 样 一 个 数 组 的 子 对 象, 那 么 该 数 组 必 须 是 当 前 可 分 配 的 表 示 外 部 文 件 部 件 的 标 量 整 型 表 达 式 必 须 是 0 或 正 整 数 出 现 在 文 件 联 结 语 句, 文 件 定 位 语 句, 以 及 文 件 查 询 语 句 当 中 的 输 入 输 出 部 件 只 能 表 示 外 部 文 件 部 件 在 一 个 程 序 的 所 有 程 序 单 位 里 面, 一 个 表 示 外 部 文 件 部 件 的 标 量 整 型 表 达 式 的 值, 表 示 同 一 个 外 部 部 件 星 号 表 示 预 先 联 结 用 来 进 行 格 式 化 序 列 访 问 的 特 定 的 与 系 统 相 关 的 外 部 部 件 对 于 一 个 给 定 程 序, 在 任 意 的 时 间 总 是 存 在 一 个 与 系 统 相 关 的 外 部 部 件 集 合 所 有 的 输 入 输 出 语 句 都 可 以 使 用 存 在 的 部 件, 而 INQUIRE 语 句 和 CLOSE 语 句 还 可 以 使 用 不 存 在 的 部 件 例 16-1 SUBROUTINE A READ (6) X... SUBROUTINE B N = 6 REWIND N 在 这 个 程 序 例 子 里 面, 两 个 不 同 的 程 序 单 位 里 面 出 现 的 外 部 部 件 名 称 6 表 示 同 一 个 外 部 部 件 文 件 到 部 件 的 联 结 与 预 联 结 一 个 外 部 部 件 可 以 被 联 结, 也 可 以 不 被 联 结, 这 两 种 状 态 都 是 合 法 的 外 部 部 件 通 过 预 联 结 或 通 过 使 用 OPEN 语 句 而 获 得 与 一 个 外 部 文 件 的 联 结, 正 是 这 种 联 结 使 得 外 部 文 件 能 够 被 程 序 访 问 这 种 访 问 也 就 是 输 入 输 出 语 句 的 功 能 所 在, 或 者 准 确 地 说 是 除 了 OPEN 语 句,CLOSE 语 句, 以 及 INQUIRE 语 句 之 外 的 所 有 输 入 输 出 语 句 因 此 而 能 够 通 过 外 部 部 件 而 访 问 相 应 的 外 部 文 件 或 对 相 应 的 外 部 文 件 进 行 操 作 文 件 到 部 件 的 联 结 与 预 联 结 的 一 般 规 则 如 下 : 一 个 文 件 可 以 与 部 件 建 立 联 结 但 本 身 却 还 不 存 在, 例 如 一 个 已 经 建 立 了 预 联 结 的 文 件, 但 可 能 还 没 有 被 写 入 一 个 部 件 在 同 一 个 时 间 不 能 联 结 多 于 一 个 文 件 ; 而 一 个 文 件 也 不 能 在 同 一 个 时 间 与 多 于 一 个 的 部 件 相 联 结 执 行 CLOSE 语 句 之 后, 相 关 的 外 部 部 件 就 失 去 了 联 结, 然 后 在 同 一 个 程 序 单 位 里 面, 该 部 件 仍 然 可 以 根 据 程 序 的 需 要 再 次 与 同 一 个 文 件 或 不 同 的 文 件 建 立 联 结 类 似 的, 执 行 CLOSE 语 句 之 后, 相 关 的 外 部 文 件 也 失 去 了 联 结, 然 后 在 同 一 个 程 序 单 位 里 面, 该 文 件 仍 然 可 以 根 据 程 序 的 需 要 而 再 次 与 同 一 个 部 件 或 不 同 的 设 备 建 立 联 结 一 旦 一 个 文 件 失 去 了 联 结, 那 么 再 次 引 用 该 文 件 的 唯 一 方 法 就 是 在 OPEN 语 句 或

293 INQUIRE 语 句 里 面 引 用 该 文 件 的 名 称, 而 如 果 失 去 联 结 的 文 件 没 有 名 称, 那 么 就 无 法 使 得 它 再 次 获 得 联 结 对 于 内 部 部 件 来 说, 总 联 结 到 由 标 志 该 部 件 的 默 认 字 符 型 变 量 所 给 出 的 内 部 文 件 一 旦 部 件 与 文 件 建 立 了 联 结, 那 么 也 就 意 味 着 建 立 了 访 问 的 方 法, 或 者 是 序 列 访 问, 或 者 是 直 接 访 问 一 旦 与 一 个 已 经 存 在 的 文 件, 或 者 是 通 过 联 结 而 生 成 的 新 文 件 建 立 联 结, 那 么 就 会 建 立 相 应 的 格 式 化 或 非 格 式 的 数 据 格 式 如 果 联 结 是 通 过 执 行 OPEN 语 句 而 建 立 的, 那 么 在 没 有 指 定 数 据 格 式 的 情 形 下 给 出 默 认 数 据 格 式 ; 如 果 联 结 为 预 联 结 到 一 个 已 经 存 在 的 文 件, 那 么 数 据 格 式 由 预 联 结 建 立 ; 如 果 预 联 结 到 一 个 不 存 在 的 文 件, 那 么 数 据 格 式 可 以 建 立, 也 可 以 推 迟 到 文 件 生 成 之 后 再 建 立, 例 如 运 行 格 式 化 或 非 格 式 的 WRITE 语 句 之 后 OPEN 语 句 OP EN 语 句 的 功 能 就 是 建 立 初 始 的 外 部 文 件 与 指 定 部 件 之 间 的 联 结, 或 者 是 修 改 该 联 结 具 体 地 说, 一 个 OPEN 语 句 可 以 产 生 如 下 几 种 作 用 : 联 结 一 个 已 经 存 在 的 文 件 到 部 件 ; 产 生 一 个 已 经 预 联 结 的 文 件 ; 产 生 一 个 新 的 文 件 然 后 把 它 联 结 到 指 定 部 件 ; 改 变 一 个 文 件 与 部 件 之 间 联 结 的 特 定 说 明 符 OPEN 语 句 的 语 法 形 式 (R904) 为 : OPEN ( connect-spec-list ) 其 中 的 联 结 说 明 (connect-spec) 的 语 法 形 式 (R905) 有 以 下 几 种 : [ UNIT = ] external-file-unit IOSTAT = scalar-default-int-variable ERR = label FILE = file-name-expr STATUS = scalar-default-char-expr ACCESS = scalar-default-char-expr FORM = scalar-default-char-expr RECL = scalar-int-expr BLANK = scalar-default-char-expr POSITION = scalar-default-char-expr ACTION = scalar-default-char-expr DELIM = scalar-default-char-expr PAD = scalar-default-char-expr 其 中 的 文 件 名 称 表 达 式 (file-name-expr) 为 标 量 默 认 字 符 型 表 达 式 (R906) OPEN 语 句 的 一 般 规 则 为 : 如 果 在 部 件 说 明 符 里 面 省 略 可 选 字 符 UNIT=, 那 么 联 结 说 明 列 表 (connect-spec-list) 的 第 一 项 必 须 是 部 件 说 明 符

294 在 一 个 给 定 OPEN 语 句 里 面, 任 何 说 明 符 都 至 多 只 能 出 现 一 次 ; 其 中 必 须 给 出 外 部 文 件 部 件 (external-file-unit) 在 说 明 符 ERR= 里 面 给 出 的 语 句 标 签 必 须 是 与 该 OPEN 语 句 同 一 个 作 用 域 单 位 里 面 的 分 支 目 标 语 句 的 标 签 如 果 说 明 符 STATUS= 的 值 为 NEW 或 REPLACE, 那 么 说 明 符 FILE= 必 须 同 时 给 出 如 果 说 明 符 STATUS= 的 值 为 SCRATCH, 那 么 说 明 符 FILE= 不 能 同 时 出 现 如 果 说 明 符 STATUS= 的 值 为 OLD, 那 么 说 明 符 FILE= 必 须 出 现, 除 非 部 件 当 前 联 结 到 一 个 文 件, 并 且 该 文 件 存 在 说 明 符 当 中 出 现 的 标 量 默 认 字 符 表 达 式 为 字 符 的 有 限 列 表, 尾 部 的 空 格 被 忽 略 如 果 系 统 同 时 支 持 大 小 写, 那 么 字 符 取 值 不 区 分 大 小 写 在 一 个 程 序 的 任 意 程 序 单 位 里 面, 一 旦 一 个 外 部 部 件 通 过 OPEN 语 句 获 得 联 结, 那 么 在 该 程 序 的 任 意 程 序 单 位 里 面 都 可 以 引 用 该 部 件 如 果 一 个 部 件 已 经 联 结 到 一 个 存 在 的 文 件, 仍 然 可 以 对 该 部 件 执 行 OPEN 语 句 如 果 在 该 OPEN 语 句 当 中 不 包 含 FILE= 说 明 符, 那 么 与 该 部 件 联 结 的 文 件 就 是 已 经 与 该 部 件 联 结 的 文 件 如 果 与 部 件 联 结 的 文 件 并 不 存 在, 但 是 和 已 经 与 部 件 预 联 结 的 文 件 相 同, 那 么 由 OPEN 语 句 给 出 的 属 性 成 为 联 结 的 一 部 分 如 果 通 过 OPEN 语 句 联 结 到 部 件 的 文 件 与 已 经 与 部 件 联 结 的 文 件 不 同, 那 么 这 个 OPEN 语 句 的 执 行 效 果 相 当 于 : 在 执 行 OPEN 语 句 之 前, 马 上 执 行 一 个 不 带 有 STATUS= 说 明 符 的 CLOSE 语 句 如 果 通 过 OPEN 语 句 联 结 到 部 件 的 文 件 与 已 经 与 部 件 联 结 的 文 件 相 同, 只 是 当 前 起 作 用 的 B LANK=,DELIM=,PAD=,ERR=, 以 及 IOSTAT= 这 些 说 明 符 的 值 不 同, 那 么 会 产 生 如 下 后 果 : 如 果 OPEN 语 句 当 中 包 含 POSITION= 说 明 符, 那 么 它 的 值 可 能 与 文 件 的 当 前 定 位 不 符 如 果 OPEN 语 句 当 中 包 含 STATUS= 说 明 符, 那 么 它 的 值 为 OLD BLANK=,DELIM=,PAD= 这 些 说 明 符 的 值 发 生 作 用, 而 其 他 没 有 出 现 的 说 明 符 不 会 发 生 变 化, 文 件 的 定 位 也 不 会 发 生 变 化 此 前 执 行 的 任 何 OPEN 语 句 的 ERR=, 以 及 IOSTAT= 这 些 说 明 符 对 当 前 执 行 的 OPEN 语 句 没 有 影 响 如 果 通 过 OPEN 语 句 联 结 到 部 件 的 文 件 与 已 经 与 部 件 联 结 的 文 件 相 同, 那 么 具 有 值 OLD 的 说 明 符 STATUS= 总 是 合 法 的, 这 时 如 果 文 件 在 执 行 OPEN 语 句 之 前 的 状 态 为 SCRATCH, 那 么 在 部 件 关 闭 后, 文 件 被 删 除, 并 且 认 为 具 有 SCRATCH 状 态 如 果 一 个 文 件 已 经 与 一 个 部 件 建 立 联 结, 那 么 对 该 文 件 运 用 OPEN 语 句 使 其 与 另 外 一 个 不 同 的 部 件 建 立 联 结 是 非 法 的 例 16-2 OPEN (10, FILE = 'employee.names', ACTION = 'READ', PAD = 'YES') 下 面 更 加 详 细 地 说 明 OPEN 语 句 当 中 所 使 用 的 各 种 说 明 符 的 含 义 1 FILE= 说 明 符 FILE= 的 值 就 是 与 给 定 部 件 联 结 的 文 件 的 名 称 它 尾 部 的 所 有 空 格 都 被 忽 略 而 文 件 名 称 表 达 式 必 须 是 系 统 的 合 法 名 称 如 果 在 OPEN 语 句 当 中 省 略 该 说 明 符, 并 且 部 件 也 没 有 与 文 件 建 立 联 结, 那 么 说 明 符 STATUS= 给 出 值 SCRATCH, 这 时 部 件 联 结 一 个 依 赖 具 体 系 统 的 文 件 2 STATUS= 其 中 的 标 量 默 认 字 符 表 达 式 取 值 为 OLD,NEW,SCRATCH,REPLACE, 以 及 UNKNOWN

295 当 说 明 符 取 值 为 OLD 时, 文 件 存 在, 而 取 值 为 NEW 时, 则 文 件 不 存 在 当 具 有 值 NEW 的 OPEN 语 句 成 功 运 行 之 后, 生 成 相 应 的 文 件, 然 后 状 态 自 然 转 变 为 OLD 当 取 值 为 REPLACE 时, 如 果 文 件 不 存 在, 那 么 OPEN 语 句 生 成 一 个 新 文 件, 然 后 状 态 取 为 OLD; 而 如 果 文 件 已 经 存 在, 则 该 文 件 被 删 除,OPEN 语 句 生 成 一 个 新 文 件, 具 有 与 被 删 除 文 件 相 同 的 文 件 名 称, 然 后 状 态 取 为 OLD 如 果 取 值 为 SCRATCH, 则 生 成 文 件 并 联 结 到 指 定 的 部 件, 以 供 程 序 使 用, 然 后 在 执 行 引 用 同 一 个 部 件 的 CLOSE 语 句 之 后, 或 者 是 程 序 终 止 之 后, 该 文 件 被 删 除 SCRATCH 不 能 用 于 命 名 文 件 如 果 取 值 为 UNKNOWN, 则 具 体 的 状 态 依 赖 于 系 统 的 约 定 如 果 说 明 符 被 省 略 了, 则 默 认 值 就 是 UNKNOWN 3 ACCESS= 其 中 标 量 默 认 字 符 表 达 式 的 取 值 为 SEQUENTIAL 或 DIRECT 分 别 表 示 文 件 联 结 的 访 问 方 法 为 序 列 访 问 或 直 接 访 问 如 果 该 说 明 符 被 省 略, 则 默 认 取 值 为 SEQUENTIAL 如 果 联 结 文 件 已 经 存 在, 那 么 该 说 明 符 指 定 的 访 问 方 法 必 须 对 于 该 文 件 是 合 法 的 如 果 文 件 不 存 在 而 需 要 生 成 新 文 件, 那 么 说 明 符 指 定 的 访 问 方 法 必 须 对 于 该 新 文 件 是 合 法 的 4 FORM= 其 中 标 量 默 认 字 符 表 达 式 取 值 为 FORMATTED 或 UNFORMATTED 分 别 表 示 文 件 联 结 为 格 式 化 输 入 输 出 或 无 格 式 输 入 输 出 如 果 该 说 明 符 被 省 略 了, 那 么 在 文 件 联 结 为 直 接 访 问 时, 默 认 值 为 UNFORMATTED; 而 如 果 文 件 联 结 为 序 列 访 问 时, 默 认 值 为 FORMATTED 如 果 联 结 文 件 已 经 存 在, 那 么 该 说 明 符 指 定 的 格 式 必 须 对 于 该 文 件 是 合 法 格 式 如 果 文 件 不 存 在 而 需 要 生 成 新 文 件, 那 么 说 明 符 指 定 的 格 式 必 须 对 于 该 新 文 件 是 合 法 格 式 5 RECL= 该 说 明 符 的 取 值 必 须 为 正 整 数 在 文 件 联 结 为 直 接 访 问 的 情 况 下, 该 取 值 表 示 文 件 的 每 个 纪 录 的 长 度 ; 在 文 件 联 结 为 序 列 访 问 的 情 况 下, 该 数 值 表 示 文 件 的 所 有 纪 录 当 中 最 大 的 长 度 在 文 件 联 结 为 直 接 访 问 时, 该 说 明 符 必 须 给 出 在 文 件 联 结 为 序 列 访 问 时, 该 说 明 符 可 以 省 略, 默 认 值 依 赖 于 系 统 的 约 定 如 果 文 件 联 结 为 格 式 化 输 入 输 出, 那 么 取 值 为 只 包 含 默 认 字 符 型 字 符 的 纪 录 的 字 符 数 目 如 果 纪 录 里 面 包 含 了 非 默 认 字 符 型, 那 么 该 说 明 符 的 取 值 依 赖 于 系 统 的 约 定 如 果 文 件 联 结 为 无 格 式 输 入 输 出, 那 么 纪 录 长 度 由 系 统 约 定 的 度 量 单 位 来 决 定 具 体 数 值 如 果 联 结 文 件 已 经 存 在, 那 么 该 说 明 符 指 定 的 长 度 必 须 对 于 该 文 件 是 合 法 长 度 如 果 文 件 不 存 在 而 需 要 生 成 新 文 件, 那 么 说 明 符 指 定 的 长 度 必 须 对 于 该 新 文 件 是 合 法 长 度 6 BLANK= 其 中 标 量 默 认 字 符 表 达 式 的 取 值 为 NULL 或 ZERO BLANK= 说 明 符 只 能 用 于 格 式 化 输 入 输 出 的 文 件 联 结 如 果 取 值 为 NULL, 那 么 在 给 定 部 件 的 数 值 格 式 化 输 入 域 里 面 的 所 有 空 格 字 符 都 被 忽 略, 除 非 全 部 为 空 格 的 域 具 有 零 值 如 果 取 值 为 ZERO, 那 么 除 了 头 部 的 空 格 之 外, 所 有 其 他 空 格 都 被 视 为 0 如 果 该 说 明 符 省 略 了, 那 么 默 认 值 为 NULL

296 7. POSITION= 联 结 其 中 标 量 默 认 字 符 表 达 式 的 取 值 为 ASIS,REWIND, 或 APPEND 该 说 明 符 只 能 用 于 序 列 访 问 的 一 个 新 生 成 的 文 件 总 是 定 位 于 初 始 点 REWIND 使 得 一 个 已 经 存 在 的 文 件 定 位 于 它 的 初 始 点 APPEND 使 得 一 个 已 经 存 在 的 文 件 定 位 于 文 件 终 止 纪 录 的 前 纪 录, 而 如 果 该 文 件 不 包 含 文 件 终 止 纪 录, 则 定 位 于 该 文 件 的 终 止 点 如 果 文 件 存 在 并 且 已 经 联 结, 那 么 ASIS 使 得 它 的 定 位 不 变, 而 如 果 文 件 存 在 但 没 有 联 结, 那 么 ASIS 表 示 它 的 定 位 未 知 如 果 该 说 明 符 被 省 略, 那 么 默 认 值 为 ASIS 其 中 标 量 默 认 字 符 表 达 式 可 以 取 值 为 READ, WRITE, READWRITE 取 值 READ 表 示 WRITE, PRINT, 以 及 ENDFILE 语 句 都 不 能 引 用 该 联 结 取 值 WRITE 表 示 READ 语 句 不 能 引 用 该 联 结 取 值 READWRITE 表 示 任 何 输 入 输 出 语 句 都 可 以 引 用 该 联 结 如 果 该 说 明 符 省 略 了, 则 默 认 值 依 赖 于 系 统 的 约 定 如 果 文 件 的 合 法 操 作 里 面 包 含 了 READWRITE, 那 么 也 应 该 包 含 READ 和 WRITE 如 果 联 结 文 件 已 经 存 在, 那 么 该 说 明 符 指 定 的 操 作 必 须 对 于 该 文 件 是 合 法 操 作 如 果 文 件 不 存 在 而 需 要 生 成 新 文 件, 那 么 说 明 符 指 定 的 操 作 必 须 对 于 该 新 文 件 是 合 法 操 作 该 说 明 符 只 能 用 于 具 有 格 式 化 输 入 输 出 联 结 的 文 件 在 输 入 格 式 化 纪 录 时 该 说 明 符 被 忽 略 其 中 标 量 默 认 字 符 表 达 式 可 以 取 值 为 APOSTROPHE,QUOTE,NONE 如 果 取 值 为 APOSTROPHE, 则 表 控 或 名 称 列 表 格 式 写 入 的 字 符 值 的 分 隔 必 须 使 用 撇 号 ; 而 内 部 撇 号 则 必 须 使 用 双 撇 号 如 果 取 值 为 QUOTE, 那 么 表 控 或 名 称 列 表 格 式 写 入 的 字 符 值 的 分 隔 必 须 使 用 引 号 ; 而 内 部 引 号 则 必 须 使 用 双 引 号 如 果 取 值 为 NONE, 那 么 写 入 字 符 不 能 使 用 撇 号 或 引 号 作 为 分 隔 标 志, 内 部 撇 号 或 引 号 也 不 能 是 双 的 如 果 该 说 明 符 被 省 略 了, 那 么 默 认 取 值 为 NONE 10. PAD= 该 说 明 符 只 能 用 于 具 有 格 式 化 输 入 输 出 联 结 的 文 件 在 格 式 化 纪 录 输 出 时, 该 说 明 符 被 忽 略 8. ACTION= 9. DELIM= 其 中 的 标 量 默 认 字 符 表 达 式 可 以 取 值 为 YES,NO 如 果 取 值 为 YES, 那 么 在 给 出 了 输 入 列 表, 并 且 格 式 说 明 要 求 纪 录 包 含 比 它 本 来 具 有 的 数 据 更 多 的 数 据 时, 该 格 式 化 输 入 纪 录 可 以 在 尾 部 添 加 足 够 的 空 格 如 果 取 值 为 NO, 那 么 输 入 列 表 以 及 格 式 说 明 都 不 能 要 求 纪 录 具 有 比 它 本 来 具 有 的 数 据 更 多 的 数 据 如 果 该 说 明 符 被 省 略, 那 么 默 认 取 值 为 YES 对 于 非 默 认 字 符 型 数 据, 对 于 附 加 的 空 格 字 符 由 系 统 约 定 CLOSE 语 句 CLOSE 语 句 的 功 能 为 终 止 一 个 给 定 部 件 到 一 个 外 部 文 件 的 联 结 CLOSE 语 句 的 一 般 语 法 形 式 (R907) 为 :

297 CLOSE ( close-spec-list ) 其 中 的 关 闭 说 明 (close-spec) 可 以 是 如 下 几 种 形 式 (R908) 之 一 : [ UNIT = ] external-file-unit IOSTAT = scalar-default-int-variable ERR = label STATUS = scalar-default-char-expr CLOSE 语 句 的 一 般 规 则 为 : 如 果 在 部 件 说 明 当 中 省 略 了 字 符 UNIT=, 那 么 部 件 说 明 符 必 须 是 关 闭 说 明 列 表 的 第 一 项. 在 一 个 给 定 关 闭 说 明 里 面, 任 何 说 明 符 都 只 能 出 现 一 次, 其 中 必 须 给 出 外 部 文 件 部 件 出 现 在 说 明 符 ERR= 当 中 的 语 句 标 签, 必 须 是 在 和 CLOSE 语 句 同 一 个 作 用 域 单 位 里 面 的 分 支 目 标 语 句 的 标 签 其 中 的 标 量 默 认 字 符 表 达 式 取 值 为 字 符 型 数 据, 其 尾 部 的 空 格 都 被 忽 略 如 果 系 统 同 时 支 持 大 小 写, 那 么 不 区 分 字 符 的 大 小 写 在 程 序 的 任 何 程 序 单 位 里 面 都 可 以 对 某 个 部 件 执 行 CLOSE 语 句, 但 是 不 能 在 同 一 个 作 用 域 单 位 里 面 和 OPEN 语 句 作 用 于 同 一 个 部 件 针 对 一 个 不 存 在 的 部 件, 或 者 是 一 个 没 有 与 文 件 联 结 的 部 件 执 行 CLOSE 语 句 是 合 法 的, 但 是 不 影 响 任 何 文 件 在 一 个 作 用 域 单 位 里 面, 如 果 一 个 部 件 被 CLOSE 语 句 关 闭 联 结 之 后, 仍 然 可 以 再 次 和 原 来 的 文 件, 或 者 是 另 外 的 文 件 建 立 联 结 在 一 个 作 用 域 单 位 里 面, 如 果 一 个 命 名 文 件 被 CLOSE 语 句 关 闭 联 结, 那 么 它 仍 然 可 以 在 该 程 序 单 位 里 面 和 同 一 个 部 件, 或 者 另 外 的 部 件 建 立 联 结, 只 要 该 文 件 一 直 存 在 程 序 的 执 行 正 常 终 止 之 后, 所 有 的 部 件 联 结 都 被 关 闭 如 果 在 终 止 之 前 文 件 状 态 为 SCRATCH, 那 么 关 闭 之 后 部 件 状 态 为 DELETE; 其 他 情 形 下 关 闭 之 后 的 部 件 状 态 为 KEEP 例 16-3 CLOSE (10, STATUS = 'KEEP') CLOSE 语 句 的 STATUS= 说 明 符 遵 循 如 下 规 则 : 其 中 的 标 量 默 认 字 符 表 达 式 可 以 取 值 为 KEEP,DELETE, 分 别 表 示 是 否 保 留 与 给 定 部 件 联 结 的 文 件 KEEP 不 能 用 于 在 执 行 CLOSE 语 句 之 前 状 态 为 SCRATCH 的 文 件 如 果 KEEP 用 于 一 个 存 在 的 文 件, 那 么 在 执 行 CLOSE 语 句 之 后, 该 文 件 继 续 存 在 如 果 KEEP 用 于 一 个 不 存 在 的 文 件, 那 么 在 执 行 CLOSE 语 句 之 后, 该 文 件 仍 然 不 存 在 如 果 取 值 为 DELETE, 那 么 在 执 行 CLOSE 语 句 之 后, 文 件 不 再 存 在 如 果 该 说 明 符 被 省 略, 那 么 默 认 值 为 KEEP, 除 非 文 件 在 执 行 CLOSE 语 句 之 前 状 态 为 SCRATCH, 如 果 出 现 那 种 情 况, 则 默 认 值 为 DELETE 16.3 文 件 的 传 输 文 件 传 输 语 句 包 括 如 下 三 种 : READ 语 句, 为 数 据 输 入 语 句 ;

298 WRITE 语 句 和 PRINT 语 句, 为 数 据 输 出 语 句 READ 语 句 的 一 般 语 法 形 式 (R909) 为 以 下 两 种 形 式 之 一 : READ ( io-control-spec-list ) [ input-item-list ] READ format [, input-item-list ] WRITE 语 句 的 一 般 语 法 形 式 (R910) 为 : WRITE ( io-control-spec-list ) [ output-item-list ] PRI NT 语 句 的 一 般 语 法 形 式 (R911) 为 : PRINT format [, output-item-list ] 对 于 其 中 的 输 入 输 出 控 制 说 明 列 表 (io-control-spec-list) 和 数 据 输 入 输 出 项 列 表 (input/ou tput-item-list) 在 下 面 分 节 予 以 说 明 例 16-4 READ (6, *) SIZE READ 10, A, B WRITE (6, 10) A, S, J PRINT 10, A, S, J 10 FORMAT (2E16.3, I5) 控 制 信 息 列 表 所 谓 输 入 输 出 控 制 说 明 列 表 就 是 控 制 信 息 列 表, 用 来 控 制 数 据 的 传 输, 包 括 如 下 的 成 分 : 数 据 传 输 的 源 或 目 标 ; 可 选 的 编 辑 过 程 的 说 明 ; 可 选 的 确 定 纪 录 的 说 明 ; 可 选 的 对 于 需 要 排 除 的 操 作 的 说 明 ; 可 选 的 状 态 返 回 ; 可 选 的 纪 录 预 说 明 ; 可 选 的 读 入 字 符 数 目 返 回 输 入 输 出 控 制 说 明 的 一 般 语 法 形 式 (R912) 有 如 下 几 种 : [ UNIT = ] io-unit [ FMT = ] format [ NML = ] namelist-group-name REC = scalar-int-expr IOSTAT = scalar-default-int-variable ERR = label END = label ADVANCE = scalar-default-char-expr SIZE = scalar-default-int-variable EOR = label 按 照 控 制 信 息 列 表 所 包 含 的 内 容 的 不 同, 数 据 传 输 语 句 可 以 分 为 两 种 :

299 如 果 数 据 传 输 语 句 包 含 了 格 式 说 明 或 名 称 列 表 集 合 名 称, 那 么 该 语 句 就 属 于 格 式 化 输 入 输 出 语 句 否 则 就 属 于 无 格 式 输 入 输 出 语 句 控 制 信 息 列 表 的 一 般 规 则 为 : 在 上 面 列 举 的 输 入 输 出 控 制 说 明 当 中 必 须 包 含 一 个, 也 至 多 包 含 一 个 输 入 输 出 部 件, 而 其 他 的 说 明 选 项 至 多 出 现 一 次 在 WRITE 语 句 当 中 不 能 出 现 END=,EOR=, 以 及 SIZE= 说 明 符 出 现 在 说 明 符 ERR=,EOR=, 以 及 END= 里 面 的 语 句 标 签 必 须 该 数 据 传 输 语 句 所 在 的 作 用 域 单 位 里 面 的 分 支 目 标 语 句 的 标 签 如 果 在 数 据 传 输 语 句 当 中 出 现 了 输 入 输 出 项 列 表, 那 么 就 不 能 同 时 出 现 名 称 列 表 集 合 名 称 一 个 输 入 输 出 控 制 说 明 列 表 里 面 不 能 同 时 包 含 一 个 格 式 说 明 和 一 个 名 称 列 表 集 合 名 称 如 果 部 件 说 明 符 里 面 省 略 了 字 符 UNIT=, 那 么 控 制 信 息 列 表 的 第 一 项 必 须 是 部 件 说 明 符 如 果 在 格 式 说 明 符 里 面 省 略 了 字 符 FMT=, 那 么 控 制 信 息 列 表 的 第 二 项 必 须 是 格 式 说 明 符, 而 控 制 信 息 列 表 的 第 一 项 必 须 是 不 带 可 选 字 符 UNIT= 的 部 件 说 明 符 如 果 在 名 称 列 表 说 明 符 里 面 省 略 了 字 符 NML=, 那 么 控 制 信 息 列 表 的 第 二 项 必 须 是 名 称 列 表 说 明 符, 而 控 制 信 息 列 表 的 第 一 项 必 须 是 不 带 可 选 字 符 UNIT= 的 部 件 说 明 符 如 果 部 件 说 明 符 给 出 的 是 一 个 内 部 文 件, 那 么 输 入 输 出 控 制 说 明 列 表 不 能 包 含 说 明 符 REC=, 也 不 能 包 含 名 称 列 表 集 合 名 称 如 果 语 句 当 中 给 出 了 说 明 符 REC=, 那 么 其 中 就 不 能 出 现 说 明 符 END= 和 名 称 列 表 集 合 名 称, 如 果 出 现 格 式 说 明, 则 不 能 是 星 号 表 示 的 表 控 输 入 输 出 说 明 符 ADVANCE= 只 能 出 现 在 具 有 显 式 格 式 说 明 的 格 式 化 序 列 输 入 输 出 语 句 里 面, 其 控 制 信 息 列 表 不 包 含 内 部 文 件 的 部 件 说 明 符 如 果 出 现 了 EOR= 说 明 符, 那 么 说 明 符 ADVANCE= 也 必 须 同 时 出 现 如 果 出 现 了 SIZE= 说 明 符, 那 么 说 明 符 ADVANCE= 也 必 须 同 时 出 现 说 明 符 SIZE= 只 能 出 现 在 包 含 取 值 为 NO 的 说 明 符 ADVANCE= 的 输 入 语 句 当 中 说 明 符 EOR= 只 能 出 现 在 包 含 取 值 为 NO 的 说 明 符 ADVANCE= 的 输 入 语 句 当 中 如 果 数 据 传 输 语 句 的 IOSTAT= 或 SIZE= 说 明 符 里 面 给 出 了 变 量, 那 么 该 变 量 不 能 关 联 于 数 据 传 输 输 入 输 出 列 表 里 面 的 任 何 数 据 对 象, 也 不 能 关 联 于 名 称 列 表 集 合 对 象 列 表 里 面 的 任 何 数 据 对 象, 也 不 能 关 联 于 数 据 传 输 输 入 输 出 列 表 里 面 的 隐 式 输 入 输 出 do 结 构 里 的 do 变 量 在 数 据 传 输 语 句 里 面, 如 果 由 说 明 符 IOSTAT= 或 者 说 明 符 SIZE= 给 出 的 变 量 为 数 组 元 素 引 用, 那 么 数 据 传 输, 隐 式 输 入 输 出 do 过 程, 或 者 在 输 入 输 出 控 制 说 明 列 表 里 面 的 其 他 说 明 符 定 义 或 赋 值, 都 不 影 响 其 下 标 值 例 16-5 下 面 给 出 一 个 READ 语 句 的 例 子 READ (IOSTAT = IOS, UNIT = 6, FMT = '(10F8.2)') A, B 下 面 我 们 分 节 说 明 控 制 信 息 列 表 的 各 种 说 明 符 以 及 相 关 内 容 1. 格 式 说 明 符 FMT= 说 明 符 FMT= 的 功 能 为 在 格 式 化 输 入 输 出 语 句 当 中 提 供 格 式 说 明, 或 提 供 表 控 格 式 它 的 一 般 语 法 形 式 (R913) 为 default-char-expr label

300 其 中 的 标 签 (label) 必 须 是 出 现 在 同 一 个 作 用 域 单 位 里 面 的 包 含 了 格 式 说 明 符 的 作 为 FORMAT 语 句 的 标 签 其 中 的 默 认 字 符 表 达 式 (default-char-expr) 表 示 一 个 有 效 的 格 式 说 明 该 表 达 式 也 可 以 是 一 个 特 殊 的 字 符 常 量, 注 意 参 考 第 7 章 里 面 对 于 表 达 式 的 说 明 如 果 该 表 达 式 是 一 个 数 组 的 形 式, 那 么 可 以 把 该 数 组 看 成 是 所 有 的 数 组 元 素 按 照 数 组 元 素 序 串 联 起 来 如 果 格 式 表 示 是 其 中 的 星 号 *, 那 么 该 语 句 就 是 所 谓 的 表 控 输 入 输 出 语 句 例 16-6 READ (6, FMT = "(" // CHAR_FMT // ")" ) X, Y, Z 在 这 个 例 子 里 面 格 式 为 字 符 表 达 式, 其 中 CHAR_FMT 为 一 个 默 认 字 符 变 量 2. 名 称 列 表 说 明 符 NML= 说 明 符 NML= 给 出 名 称 列 表 集 合 名 称 该 名 称 表 示 了 一 个 需 要 进 行 数 据 传 输 操 作 的 数 据 对 象 的 集 合 如 果 语 句 当 中 给 出 了 这 个 名 称 列 表 集 合 名 称, 那 么 该 语 句 就 是 所 谓 名 称 列 表 输 入 输 出 语 句 3. 纪 录 数 说 明 符 REC= 纪 录 数 说 明 符 The REC= 给 出 需 要 读 写 的 纪 录 的 数 目 该 说 明 符 只 能 用 于 针 对 直 接 访 问 联 结 部 件 的 输 入 输 出 语 句, 因 此 这 个 说 明 符 可 以 说 是 一 个 标 志 性 的 东 西, 即 只 要 控 制 信 息 列 表 里 面 包 含 了 REC= 说 明 符, 那 么 该 语 句 就 是 所 谓 直 接 访 问 输 入 输 出 语 句, 否 则 就 是 所 谓 序 列 访 问 输 入 输 出 语 句 4. 输 入 输 出 状 态 说 明 符 IOSTAT= 执 行 一 个 包 含 了 IOSTAT= 说 明 符 的 输 入 输 出 语 句 实 际 上 也 就 是 定 义 了 在 IOSTAT= 说 明 符 里 面 给 出 的 变 量 该 变 量 的 取 值 情 况 有 如 下 几 种 : 如 果 语 句 执 行 过 程 当 中 没 有 出 现 错 误 条 件, 也 没 有 出 现 文 件 终 止 条 件 和 纪 录 终 止 条 件, 那 么 变 量 取 值 为 0 如 果 出 现 错 误 条 件, 那 么 取 值 为 系 统 约 定 的 正 整 数 值 如 果 出 现 文 件 终 止 条 件, 而 没 有 出 现 错 误 条 件, 那 么 取 值 为 系 统 约 定 的 负 整 数 值 如 果 出 现 纪 录 终 止 条 件, 而 没 有 出 现 错 误 条 件 与 文 件 终 止 条 件, 那 么 取 值 为 系 统 约 定 的 不 同 于 文 件 终 止 条 件 下 的 取 值 的 负 整 数 值 只 有 在 执 行 序 列 输 入 语 句 时 才 会 出 现 文 件 终 止 条 件, 而 只 有 在 执 行 非 预 输 入 语 句 时 才 会 出 现 纪 录 终 止 条 件, 参 见 下 面 的 例 子 例 16-7 READ (FMT = "(E8.3)", UNIT = 3, IOSTAT = IOSS) X IF (IOSS < 0) THEN! 对 联 结 到 部 件 3 的 文 件 进 行 文 件 终 止 操 作. CALL END_PROCESSING ELSE IF (IOSS > 0) THEN! 进 行 出 错 处 理 CALL ERROR_PROCESSING END IF

301 5. 出 错 分 支 处 理 如 果 在 执 行 一 个 包 含 了 说 明 符 ERR= 的 输 入 输 出 语 句 时 出 现 了 错 误 条 件, 就 会 导 致 如 下 的 分 支 后 果 : 输 入 输 出 语 句 执 行 中 断 ; 输 入 输 出 语 句 给 出 的 文 件 定 位 不 可 确 定 ; 如 果 该 输 入 输 出 语 句 还 包 含 了 IOSTAT= 说 明 符, 那 么 其 中 给 出 的 变 量 取 值 为 系 统 约 定 的 正 整 数 值 如 果 执 行 的 语 句 是 READ 语 句, 并 且 包 含 了 SIZE= 说 明 符, 那 么 变 量 取 值 整 数 值 ; 继 续 执 行 由 ERR= 说 明 符 给 出 的 语 句 6. 文 件 终 止 时 的 分 支 处 理 如 果 在 执 行 包 含 了 END= 说 明 符 的 输 入 语 句 时 出 现 了 文 件 终 止 条 件, 但 没 有 出 现 错 误 条 件, 那 么 会 导 致 如 下 分 支 后 果 : 输 入 语 句 的 执 行 中 断 ; 如 果 输 入 语 句 中 指 定 的 文 件 是 外 部 文 件, 那 么 它 定 位 在 文 件 终 止 纪 录 的 后 面 如 果 输 入 语 句 包 含 了 说 明 符 IOSTAT=, 那 么 其 中 给 出 的 变 量 取 值 为 系 统 约 定 的 负 整 数 值 继 续 执 行 由 END= 说 明 符 给 出 的 语 句 7. 纪 录 终 止 时 的 分 支 处 理 如 果 在 执 行 包 含 了 EOR= 说 明 符 的 输 入 输 出 语 句 时 出 现 了 纪 录 终 止 条 件, 但 没 有 出 现 错 误 条 件, 那 么 会 导 致 如 下 分 支 后 果 : 如 果 语 句 当 中 包 含 的 说 明 符 PAD= 的 取 值 为 YES, 那 么 纪 录 被 添 加 上 空 格, 以 便 满 足 输 入 列 表 项 及 其 数 据 编 辑 描 述 符 对 于 纪 录 字 符 数 目 的 要 求 输 入 语 句 的 执 行 中 断 输 入 语 句 给 出 的 文 件 定 位 于 当 前 纪 录 后 面 如 果 输 入 语 句 包 含 了 说 明 符 IOSTAT=, 那 么 其 中 给 出 的 变 量 取 值 为 系 统 约 定 的 负 整 数 值 如 果 输 入 语 句 包 含 了 说 明 符 SIZE=, 那 么 其 中 给 出 的 变 量 取 值 为 整 数 值 继 续 执 行 由 EOR= 说 明 符 给 出 的 语 句 8. ADVANCE= 说 明 符 其 中 的 标 量 默 认 字 符 表 达 式 (scalar-default-char-expr) 可 以 取 值 为 YES 或 NO 该 说 明 符 用 来 说 明 是 否 在 输 入 输 出 语 句 当 中 出 现 非 预 输 入 输 出 如 果 取 值 为 NO, 则 出 现 非 预 输 入 输 出 ; 如 果 取 值 为 YES, 那 么 出 现 预 格 式 化 序 列 输 入 输 出 如 果 该 说 明 符 省 略 了, 那 么 默 认 取 值 为 YES 9. 字 符 数 目 说 明 符 SIZE= 当 非 预 输 入 语 句 中 断 之 后, 在 说 明 符 SIZE= 当 中 给 出 的 变 量, 取 值 为 在 当 前 输 入 语 句 执 行 过 程 当 中 由 数 据 编 辑 描 述 符 传 输 的 字 符 数 目 其 中 填 充 的 空 格 不 计 入 该 字 符 数 目 值 数 据 传 输 的 输 入 输 出 列 表 一 个 所 谓 输 入 输 出 列 表 给 出 通 过 数 据 传 输 输 入 输 出 语 句 传 输 了 数 据 值 的 数 据 项 其 中 输 入 项 (input-item) 的 一 般 语 法 形 式 (R914) 为 :

302 variable io-implied-do 其 中 输 出 项 (output-item) 的 一 般 语 法 形 式 (R915) 为 : expr io-implied-do 其 中 隐 式 输 入 输 出 do 结 构 (io-implied-do) 的 一 般 语 法 形 式 (R916) 为 : ( io-implied-do-object-list, io-implied-do-control ) 而 里 面 的 隐 式 do 对 象 (io-implied-do-object) 的 语 法 形 式 (R917) 为 : input-item output-item 里 面 的 隐 式 输 入 输 出 do 控 制 (io-implied-do-control) 的 语 法 形 式 (R918) 为 : do-variable = scalar-int-expr, & & scalar-int-expr [, scalar-int-expr ] 输 入 输 出 列 表 的 一 般 规 则 为 : 作 为 输 入 项 的 变 量 不 能 是 完 全 哑 尺 度 数 组 do 变 量 必 须 是 整 型 的 命 名 标 量 变 量 在 输 入 项 列 表 (input-item-list) 里 面, 隐 式 输 入 输 出 do 对 象 (io-implied-do-object) 必 须 是 一 个 输 入 项 在 输 出 项 列 表 (output-item-list) 里 面, 隐 式 输 入 输 出 do 对 象 (io-implied-do-object) 必 须 是 一 个 输 出 项 如 果 某 个 输 入 项 为 指 针, 那 么 它 必 须 当 前 关 联 于 一 个 可 定 义 的 目 标 数 据 对 象, 并 且 数 据 从 文 件 传 输 到 关 联 目 标 如 果 某 个 输 出 项 为 指 针, 那 么 它 必 须 当 前 关 联 于 一 个 可 定 义 的 目 标 数 据 对 象, 并 且 数 据 从 关 联 目 标 传 输 到 文 件 一 个 输 入 项 不 能 是 一 个 包 含 输 入 项 的 隐 式 输 入 输 出 do 结 构 的 do 变 量, 也 不 能 关 联 于 这 样 的 do 变 量 一 个 派 生 数 据 类 型 的 对 象, 如 果 它 的 成 员 里 面 包 含 了 指 针, 则 不 能 作 为 输 入 输 出 列 表 里 面 的 数 据 项 因 为 指 针 成 员 的 值 只 是 对 于 内 存 地 址 的 一 个 描 述 符, 因 此 不 具 有 独 立 于 系 统 的 表 示 方 法 如 果 输 入 项 或 输 出 项 为 可 分 配 数 组, 那 么 它 的 当 前 状 态 应 该 是 已 分 配 包 含 在 一 个 隐 式 输 入 输 出 do 结 构 里 面 的 隐 式 输 入 输 出 do 结 构 的 do 变 量, 不 能 是 其 宿 主 结 构 的 do 变 量, 也 不 能 关 联 于 这 样 的 do 变 量 如 果 是 输 入 输 出 列 表 里 面 出 现 了 数 组 作 为 列 表 项, 那 么 其 中 的 元 素 按 照 数 组 元 素 序 的 顺 序 加 以 说 明 数 组 的 元 素 都 不 影 响 输 入 项 里 面 任 何 表 达 式 的 值, 任 何 元 素 都 不 能 在 输 入 项 里 面 重 复 出 现 输 入 输 出 列 表 当 中 的 隐 式 do 结 构 的 循 环 初 始 化 和 执 行 过 程 与 DO 结 构 的 一 样 如 果 输 入 输 出 语 句 说 明 的 是 内 部 文 件, 那 么 输 入 输 出 列 表 不 能 包 含 非 默 认 字 符 类 型 的 数 据 对 象 常 量, 包 含 算 符 或 函 数 引 用 的 表 达 式, 以 及 括 号 当 中 的 表 达 式 都 可 以 出 现 在 输 出 列 表 里 面, 但 不 能 出 现 在 输 入 列 表 里 面

303 例 16-8 下 面 的 例 子 里 面 既 有 合 法 的 形 式 也 有 不 合 法 的 形 式 INTEGER A (100), J (100)... READ *, A (A)! 非 法 READ *, A (LBOUND (A, 1) : UBOUND (A, 1))! 合 法 READ *, A (J)! 如 果 J 的 元 素 都 不 重 复 则 是 合 法 的 READ *, A (A (1) : A (10))! 非 法 例 16-9 WRITE (LP, FMT = '(10F8.2)') (LOG (A (I)), I = 1, N + 9, K), G 这 个 例 子 的 输 出 列 表 里 面 包 含 了 一 个 隐 式 do 结 构 数 据 传 输 输 入 输 出 语 句 的 执 行 执 行 一 个 数 据 传 输 输 入 输 出 语 句 的 完 整 过 程 如 下 : (1) 决 定 数 据 传 输 的 方 向 ; (2) 确 定 相 应 的 部 件 ; (3) 如 果 要 求 格 式 则 建 立 相 应 的 格 式 ; (4) 在 文 件 传 输 之 前 对 文 件 定 位 ; (5) 在 文 件 与 输 入 输 出 列 表 或 名 称 列 表 里 面 给 出 的 数 据 项 之 间 进 行 数 据 传 输 ; (6) 随 时 判 别 是 否 出 现 错 误 条 件, 文 件 终 止 条 件, 以 及 纪 录 终 止 条 件 ; (7) 在 数 据 传 输 完 成 之 后, 再 次 对 文 件 进 行 定 位 ; (8) 对 说 明 符 IOSTAT= 和 SIZE= 里 面 的 变 量 定 义 恰 当 的 值 格 式 化 纪 录 的 打 印 把 格 式 化 之 后 的 纪 录 传 输 给 系 统 设 置 的 外 部 设 备 就 称 为 打 印 在 打 印 一 个 格 式 化 纪 录 的 时 候, 纪 录 的 第 一 个 字 符 是 格 式 说 明, 不 被 打 印 出 来, 而 纪 录 的 其 他 字 符 都 打 印 在 一 行 上 纪 录 的 第 一 个 字 符 必 须 是 默 认 字 符 型 数 据, 它 的 功 能 在 于 决 定 竖 直 方 向 的 行 距, 列 举 如 下 表 16-1: 表 16-1 纪 录 字 符 所 表 示 的 行 距 纪 录 的 第 一 个 字 符 行 距 约 定 空 格 1 行 0 2 行 1 下 页 的 第 一 行 + 没 有 前 面 行 如 果 纪 录 不 包 含 任 何 字 符, 那 么 行 距 为 1 行, 并 且 除 了 空 格 之 外, 在 该 行 上 不 打 印 任 何 字 符

304 PRINT 语 句 并 不 意 味 着 打 印 开 始,WRITE 语 句 也 不 意 味 着 打 印 开 始, 它 们 都 只 是 起 到 类 似 记 账 的 作 用 数 据 传 输 语 句 的 终 止 当 出 现 如 下 的 情 况 时, 数 据 传 输 输 入 输 出 语 句 的 执 行 都 被 中 断 : 格 式 处 理 遇 到 一 个 数 据 编 辑 描 述 符, 而 同 时 在 输 入 输 出 项 列 表 里 面 不 再 包 含 任 何 元 素 无 格 式 的 数 据 或 表 控 数 据 的 传 输 完 成 整 个 输 入 项 列 表 或 输 出 项 列 表 的 所 有 项 目 名 称 列 表 输 出 完 成 整 个 名 称 列 表 集 合 对 象 列 表 (namelist-group-object-list) 里 面 的 所 有 项 目 出 现 错 误 条 件 出 现 文 件 终 止 条 件 An end-of-file condition occurs. 在 表 控 输 入 或 名 称 列 表 输 入 时, 读 入 纪 录 遇 到 了 作 为 值 分 隔 符 的 斜 线 (/) 在 执 行 非 预 输 入 语 句 时, 出 现 了 纪 录 终 止 条 件 16.4 文 件 的 定 位 文 件 的 定 位 语 句 包 括 BACKSPACE 语 句,ENDFILE 语 句 和 REWIND 语 句, 它 们 的 语 法 形 式 如 下 BACKSPACE 语 句 的 语 法 形 式 (R919) 为 : BACKSPACE external-file-unit BACKSPACE ( position-spec-list ) ENDFILE 语 句 的 语 法 形 式 (R920) 为 ENDFILE external-file-unit ENDFILE ( position-spec-list ) REWIND 语 句 的 语 法 形 式 (R921) 为 : REWIND external-file-unit REWIND ( position-spec-list ) 其 中 的 定 位 说 明 (position-spec) 的 语 法 形 式 (R922) 为 : [ UNIT = ] external-file-unit IOSTAT = scalar-default-int-variable ERR = label 文 件 的 定 位 的 一 般 规 则 如 下 : ERR= 说 明 符 里 面 的 标 签 必 须 是 处 于 与 文 件 定 位 语 句 同 一 个 作 用 域 单 位 的 分 支 目 标 语 句 的 标 签 如 果 在 部 件 说 明 符 里 面 省 略 了 可 选 的 字 符 UNIT=, 那 么 定 位 说 明 列 表 的 第 一 项 必 须 是 部 件 说 明 符

305 定 位 说 明 列 表 里 面 必 须 包 含 且 只 能 包 含 一 个 外 部 文 件 部 件, 并 且 每 个 说 明 符 只 能 至 多 出 现 一 次 没 有 联 结 为 序 列 访 问 的 文 件 不 能 用 于 这 三 个 定 位 语 句, 而 具 有 ACTION= 说 明 符, 并 且 取 值 为 READ 的 联 结 的 文 件 不 能 用 于 ENDFILE 语 句 BACKSPACE 语 句 执 行 一 个 BACKSPACE 语 句, 那 么 文 件 联 结 到 给 定 部 件, 文 件 定 位 则 有 如 下 三 种 情 形 : 如 果 文 件 存 在 当 前 纪 录, 定 位 于 当 前 部 件 前 如 果 不 存 在 当 前 纪 录, 则 定 位 于 前 纪 录 前 面 如 果 不 存 在 当 前 纪 录, 也 不 存 在 前 纪 录, 那 么 文 件 定 位 不 变 如 果 前 纪 录 为 文 件 终 止 纪 录, 那 么 文 件 定 位 于 文 件 终 止 纪 录 前 面 如 果 BACKSPACE 语 句 导 致 隐 式 写 入 文 件 终 止 纪 录, 那 么 文 件 定 位 于 文 件 终 止 纪 录 之 前 的 那 个 纪 录 例 下 面 是 BACKSPACE 语 句 的 一 个 例 子 BACKSPACE (10, ERR = 20) ENDFILE 语 句 ENDFILE 语 句 的 功 能 是 写 入 一 个 文 件 终 止 纪 录 作 为 文 件 下 一 个 纪 录, 然 后 文 件 定 位 于 该 文 件 终 止 纪 录 后 面, 而 该 文 件 终 止 纪 录 就 成 为 了 该 文 件 的 最 后 一 个 纪 录 如 果 该 文 件 也 能 够 被 联 结 为 直 接 访 问, 那 么 只 有 在 该 文 件 终 止 纪 录 之 前 的 纪 录 是 真 实 写 入 了 的, 因 此 也 就 只 有 这 些 纪 录 能 够 被 随 后 的 直 接 联 结 读 到 在 执 行 ENDFILE 语 句 之 后, 还 可 以 在 执 行 任 何 的 数 据 传 输 输 入 输 出 语 句 之 前 应 用 BACKSPACE 语 句 或 REWIND 语 句 来 改 变 文 件 的 定 位 针 对 一 个 联 结 了 但 是 并 不 存 在 的 文 件 执 行 ENDFILE 语 句, 将 在 写 入 文 件 终 止 纪 录 之 前 产 生 该 文 件 例 ENDFILE K 这 是 一 个 简 单 的 ENDFILE 语 句 的 例 子 REWIND 语 句 执 行 REWIND 语 句 的 效 果 就 是 使 得 给 定 的 文 件 被 定 位 于 它 的 初 始 点 如 果 文 件 本 来 就 已 经 定 位 于 它 的 初 始 点, 那 么 再 执 行 REWIND 语 句 将 不 会 对 它 的 定 位 产 生 任 何 影 响 针 对 一 个 联 结 了 但 并 不 存 在 的 文 件 执 行 REWIND 语 句 是 合 法 的, 但 是 并 不 能 产 生 任 何 的 影 响 例 REWIND 10

306 这 是 一 个 REWIND 语 句 的 简 单 例 子 16.5 文 件 的 查 询 INQUIRE 语 句 的 功 能 为 查 询 特 定 命 名 文 件 或 与 特 定 部 件 的 联 结 的 属 性 INQUIRE 语 句 具 有 三 种 形 式 : 文 件 查 询 形 式 这 种 查 询 形 式 使 用 说 明 符 FILE= 部 件 查 询 形 式 这 种 查 询 形 式 使 用 说 明 符 UNIT= 输 出 列 表 查 询 这 种 查 询 形 式 使 用 说 明 符 IOLENGTH= 所 有 这 些 说 明 符 的 赋 值 规 则 都 遵 循 一 般 的 赋 值 语 句 的 规 则 INQUIRE 语 句 可 以 在 文 件 的 任 何 联 结 状 态 之 下 执 行,INQUIRE 语 句 返 回 的 值 反 映 当 前 被 执 行 的 语 句 的 文 件 状 态 INQUIRE 语 句 的 一 般 语 法 形 式 (R923) 为 INQUIRE ( inquire-spec-list ) INQUIRE ( IOLENGTH = scalar-default-int-variable ) & &output-item-list 例 INQUIRE (IOLENGTH = IOL) A (1:N) INQUIRE (UNIT = JOAN, OPENED = LOG_01, NAMED = LOG_02, & FORM = CHAR_VAR, IOSTAT = IOS) 第 17 章 数 据 文 件 的 编 辑 对 于 真 实 世 界 的 任 何 数 据, 我 们 总 是 要 赋 予 一 定 的 表 示 形 式, 以 适 应 人 的 阅 读 理 解 习 惯, 也 就 是 对 于 任 何 数 据 文 件 的 都 存 在 一 个 约 定 的 格 式, 因 此 当 我 们 使 用 计 算 机 来 输 出 数 据 文 件 时, 当 然 希 望 直 接 输 出 的 就 是 我 们 所 习 惯 阅 读 的 带 有 相 应 格 式 的 数 据 文 件 ; 同 样, 在 我 们 向 计 算 机 输 入 数 据 文 件 时, 也 希 望 仍 然 按 照 我 们 习 惯 的 格 式 约 定 直 接 输 入 到 计 算 机, 因 此 FORTRAN 必 须 提 供 能 够 描 述 数 据 文 件 格 式 的 适 当 的 词 汇 与 语 句, 从 而 方 便 人 机 对 话 实 际 上 只 要 不 是 特 别 小 的 FORTRAN 程 序, 无 论 是 为 了 便 于 程 序 作 者, 还 是 便 于 其 他 用 户 的 使 用, 都 必 须 包 含 大 量 的 数 据 输 入 输 出 的 格 式 编 辑 方 面 的 内 容, 因 此 掌 握 好 语 言 的 输 入 输 出 编 辑 功 能, 是 编 写 一 个 好 的 FORTRAN 程 序 的 非 常 重 要 的 方 面 对 输 入 输 出 进 行 格 式 控 制 的 基 本 任 务, 就 是 要 在 数 据 的 机 器 内 部 表 示 与 数 据 的 格 式 化 纪 录 或 文 件 当 中 的 表 示 之 间, 进 行 适 当 的 转 化 当 然 从 编 程 语 言 的 角 度 来 看, 我 们 并 不 需 要 直 接 地 参 与

307 这 种 具 体 的 转 化 过 程, 因 为 数 据 的 机 器 内 部 表 示 是 非 常 依 赖 于 具 体 的 系 统 的, 作 为 一 种 通 用 编 程 语 言,F ORTRAN 并 不 需 要 具 有 描 述 具 体 系 统 的 能 力,FORTRAN 所 需 要 做 的, 只 需 要 能 够 提 供 描 述 格 式 本 身 的 语 言 就 行 了, 系 统 如 何 根 据 这 种 描 述 而 进 行 数 据 转 换, 则 不 需 要 程 序 编 写 者 关 心 FORTRAN 95 对 于 格 式 的 描 述 主 要 就 是 依 靠 格 式 说 明 符 来 完 成 的, 此 外 还 可 以 运 用 名 称 列 表 集 合 名 称 来 说 明 名 称 列 表 格 式 下 面 我 们 分 别 予 以 详 细 讨 论 17.1 显 式 格 式 说 明 显 式 的 格 式 说 明 可 以 使 用 如 下 两 种 方 式 : 运 用 FORMAT 语 句 ; 运 用 字 符 表 达 式 下 面 分 节 讨 论 这 两 种 显 式 格 式 说 明 方 式 FORMAT 语 句 FORMAT 语 句 的 一 般 语 法 形 式 (R1001) 为 : FORMAT format-specification 其 中 格 式 说 明 (format-specification) 的 一 般 语 法 形 式 (R1002) 为 : ( [ format-item-list ] ) 其 中 的 格 式 项 列 表 (format-item-list) 在 17.2 节 专 门 加 以 讨 论 FORMAT 语 句 的 一 般 规 则 如 下 : FORMAT 语 句 必 须 具 有 标 签 在 格 式 项 列 表 当 中 用 于 分 隔 不 同 格 式 项 的 逗 号 可 以 在 如 下 几 种 情 形 下 省 略 : P 编 辑 描 述 符 与 后 面 紧 接 的 F, E, EN, ES, D, 或 G 编 辑 描 述 符 之 间 ; 没 有 给 出 可 选 的 重 复 说 明 时, 在 斜 线 编 辑 描 述 符 之 前 ; 斜 线 编 辑 描 述 符 之 后 ; 冒 号 编 辑 描 述 符 的 前 后 空 格 字 符 可 以 放 置 在 格 式 说 明 的 初 始 的 左 括 号 之 前 除 了 在 字 符 串 编 辑 描 述 符 内 部 之 外, 空 格 可 以 添 加 在 格 式 说 明 的 任 何 位 置, 不 影 响 对 于 格 式 说 明 的 解 释 例 FORMAT (1PE12.4, I10) 这 是 FORMAT 语 句 的 两 个 简 单 例 子 字 符 表 达 式 作 为 格 式 说 明 9 FORMAT (I12, /, ' Dates: ', 2 (2I3, I5)) 显 式 的 格 式 说 明 除 了 使 用 FORMAT 语 句 之 外, 还 可 以 使 用 字 符 表 达 式, 即 在 格 式 化 输 入 输

308 出 语 句 里 面, 字 符 表 达 式 的 字 符 串 取 值, 作 为 格 式 说 明 符 能 够 有 效 地 说 明 格 式 注 意 整 个 格 式 说 明 必 须 是 包 含 在 一 对 括 号 当 中 的 当 格 式 说 明 所 在 的 输 入 输 出 语 句 开 始 执 行 的 时 候, 格 式 说 明 的 括 号 里 面 的 全 部 字 符 都 必 须 是 已 经 获 得 了 定 义 的, 而 在 该 语 句 的 整 个 执 行 过 程 当 中, 其 定 义 都 不 能 被 重 定 义 或 去 定 义 而 最 右 边 括 号 后 面 的 字 符 则 没 有 任 何 说 明 格 式 的 意 义 如 果 格 式 说 明 符 引 用 了 一 个 字 符 数 组, 那 么 该 数 组 的 元 素 按 照 元 素 序 列 联 结 起 来 作 为 一 个 整 体 看 待 注 意 : 如 果 在 输 入 输 出 语 句 里 面 使 用 了 字 符 常 量 来 作 为 格 式 说 明 符, 那 么 必 须 保 证 该 字 符 常 量 是 有 效 的 格 式 说 明 参 见 下 面 的 例 子 例 17-2 考 虑 下 面 的 文 字 : 2 ISN'T 3 这 段 文 字 在 输 出 语 句 与 格 式 说 明 当 中 可 以 使 用 如 下 多 种 形 式 : WRITE (6, 100) 2, FORMAT (1X, I1, 1X, 'ISN''T', 1X, I1) WRITE (6, '(1X, I1, 1X, ''ISN''''T'', 1X, I1)') 2, 3 注 意 其 中 多 重 的 引 号 与 撇 号 WRITE (6, '(A)') ' 2 ISN''T 3' 17.2 格 式 项 列 表 的 形 式 所 谓 格 式 项 (format-item) 的 一 般 语 法 形 式 (R1003) 是 : [ r ] data-edit-desc control-edit-desc char-string-edit-desc [ r ] ( format-item-list ) 其 中 的 r(r1004) 为 整 型 字 面 常 量, 表 示 说 明 重 复 数 它 必 须 是 正 的, 并 且 不 能 带 有 种 别 参 数 其 中 所 谓 编 辑 描 述 符 分 为 如 下 三 种 : 数 据 编 辑 描 述 符 ; 控 制 编 辑 描 述 符 ; 字 符 串 编 辑 描 述 符 下 面 分 别 给 出 它 们 的 语 法 形 式 1. 数 据 编 辑 描 述 符 的 语 法 形 式 (R1005) 为 以 下 几 种 形 式 之 一 :

309 I w [. m ] B w [. m ] O w [. m ] Z w [. m ] F w. d E w. d [ E e ] EN w. d [ E e ] ES w. d [ E e ] G w. d [ E e ] L w A [ w ] D w. d 其 中 的 w(r1006),m(r1007),d(r1008),e(r1009) 都 是 整 型 字 面 常 量 而 其 中 的 I, B, O, Z, F, E, EN, ES, G, L, A, 和 D 则 表 示 不 同 的 编 辑 方 式 详 细 说 明 参 见 17.5 节 数 据 编 辑 描 述 符 的 一 般 规 则 如 下 : e必 须 是 正 的 w在 I, B, O, Z, 以 及 F 这 些 编 辑 描 述 符 里 面 必 须 是 0 或 正 数 在 其 他 编 辑 描 述 符 里 面 则 必 须 是 正 的 w, m, d, 以 及 e 不 能 带 有 种 别 参 数 2. 控 制 编 辑 描 述 符 的 一 般 语 法 形 式 (R1010) 为 以 下 几 种 : position-edit-desc [ r ] / : sign-edit-desc k P blank-interp-edit-desc 其 中 的 k(r1011) 表 示 带 符 号 的 整 型 字 面 常 量 它 不 能 具 有 种 别 参 数 而 其 中 的 位 置 编 辑 描 述 符 (position-edit-desc) 的 一 般 语 法 形 式 (R1012) 为 : T n TL n

310 TR n n X 其 中 的 n(r1013) 为 整 型 字 面 常 量, 它 必 须 是 正 数, 并 且 不 能 具 有 种 别 参 数 符 号 编 辑 描 述 符 (sign-edit-desc) 的 一 般 语 法 形 式 (R1014) 为 : S SP SS 空 格 解 释 编 辑 描 述 符 的 语 法 形 式 (R1015) 为 : BN BZ 至 于 kp 里 面 的 k 称 为 比 例 因 子 控 制 编 辑 描 述 符 里 面 的 这 些 大 写 字 符 以 及 标 点 符 号 T, TL, TR, X, 斜 线, 冒 号, S, SP, SS, P, BN, 以 及 BZ 都 表 示 编 辑 方 式, 具 体 含 义 参 见 17-6 节 3. 字 符 串 编 辑 描 述 符 (R1016) 实 际 上 就 是 一 个 字 符 字 面 常 量, 而 作 为 字 符 串 编 辑 描 述 符 的 字 符 字 面 常 量 不 能 带 有 种 别 参 数 组 成 字 符 串 编 辑 描 述 符 的 字 符 必 须 属 于 系 统 所 认 可 的 字 符, 在 字 符 字 面 常 量 中 间 所 出 现 的 分 隔 符 号, 即 撇 号 与 引 号, 都 必 须 连 续 成 对 出 现, 不 能 间 隔 空 格, 这 样 的 一 对 符 号 应 该 看 成 是 一 个 单 独 的 分 隔 字 符 如 果 系 统 同 时 支 持 大 小 写, 那 么 编 辑 描 述 符 除 了 对 于 字 符 常 量 之 外, 不 区 分 大 小 写 注 意 字 符 串 编 辑 描 述 符 只 用 于 常 量 数 据 的 输 出, 而 对 输 入 无 效 与 数 据 编 辑 描 述 符 和 字 符 串 编 辑 描 述 符 相 关 的 一 个 概 念 是 纪 录 的 域 : 当 格 式 控 制 遇 到 数 据 编 辑 描 述 符 或 字 符 串 编 辑 描 述 符, 读 入 或 写 出 的 部 分 纪 录 就 称 为 该 纪 录 的 一 个 域, 而 域 宽 即 该 域 的 字 符 数 目 17.3 输 入 输 出 的 列 表 与 格 式 的 匹 配 通 过 格 式 说 明 来 进 行 格 式 化 数 据 传 输 的 第 一 步 是 格 式 控 制, 而 格 式 控 制 的 任 何 操 作 都 依 赖 于 下 面 的 两 个 方 面 的 信 息 : 格 式 说 明 当 中 的 下 一 个 编 辑 描 述 符 ; 输 入 输 出 列 表 当 中 的 下 一 个 有 效 项 这 两 个 方 面 的 信 息 都 是 格 式 控 制 所 必 不 可 少 的, 它 们 之 间 存 在 一 定 的 匹 配 性 的 要 求 如 下 : 如 果 在 一 个 输 入 输 出 说 明 列 表 当 中, 至 少 说 明 了 一 个 有 效 的 列 表 项, 那 么 在 格 式 说 明 里 面 就 至 少 应 该 有 一 个 相 应 的 数 据 编 辑 描 述 符, 这 是 输 入 输 出 列 表 与 格 式 说 明 相 匹 配 的 基 本 条 件 只 有 在 输 入 输 出 列 表 里 面 不 存 在 任 何 有 效 列 表 项 的 情 况 下, 才 可 以 使 用 形 式 为 () 的 空 的 格 式 说 明

311 0 长 度 的 字 符 项 是 一 个 有 效 的 列 表 项, 但 0 尺 度 的 数 组 和 具 有 重 复 度 为 0 的 隐 式 DO 列 表 不 是 有 效 列 表 项 除 了 前 置 有 重 复 说 明 因 子 r 的 格 式 项 之 外, 格 式 说 明 总 是 解 释 为 从 左 到 右 前 置 有 重 复 说 明 因 子 r 的 格 式 项 被 解 释 为 一 个 项 的 列 表, 数 目 等 于 r, 每 个 项 都 等 于 原 格 式 项, 用 逗 号 分 隔 如 果 重 复 说 明 因 子 r 省 略 了, 那 么 它 的 默 认 值 为 1 对 于 格 式 说 明 里 面 的 每 一 个 数 据 编 辑 描 述 符, 都 在 输 入 输 出 列 表 里 面 存 在 一 个 相 应 的 有 效 项, 当 然 如 果 输 入 输 出 列 表 里 面 的 项 为 复 型 数 据 对 象, 则 需 要 两 个 F, E, EN, ES, D, 或 G 编 辑 描 述 符 对 于 每 个 控 制 编 辑 描 述 符 或 字 符 编 辑 描 述 符, 则 不 存 在 相 应 的 输 入 输 出 列 表 项 格 式 控 制 直 接 与 纪 录 进 行 通 讯 只 要 格 式 说 明 里 面 格 式 控 制 遇 到 数 据 编 辑 描 述 符, 那 么 它 就 决 定 了 在 输 入 输 出 列 表 里 面 是 否 存 在 相 应 的 有 效 项 : 如 果 存 在 这 样 的 有 效 项, 那 么 在 该 项 与 纪 录 之 间 就 传 输 相 应 的 经 过 恰 当 编 辑 的 信 息, 然 后 执 行 相 应 的 格 式 控 制 ; 如 果 不 存 在 这 样 的 有 效 项, 那 么 格 式 控 制 就 终 止 如 果 在 格 式 说 明 里 面, 格 式 控 制 遇 到 冒 号 编 辑 描 述 符, 而 另 一 个 输 入 输 出 列 表 的 有 效 项 又 没 有 给 出, 那 么 格 式 控 制 终 止 如 果 在 格 式 说 明 里 面 格 式 控 制 遇 到 一 个 完 整 的 格 式 说 明 的 最 右 边 的 括 号, 而 另 外 的 输 入 输 出 列 表 的 有 效 项 也 没 有 给 出, 则 格 式 控 制 终 止 如 果 给 出 了 另 外 的 有 效 项, 则 文 件 定 位 的 方 式 和 处 理 斜 线 编 辑 描 述 符 一 样 格 式 控 制 回 复 到 被 前 置 右 括 号 终 止 的 格 式 项 的 开 头 位 置 ; 如 果 不 存 在 这 样 的 前 置 右 括 号, 那 么 格 式 回 复 到 格 式 说 明 的 第 一 个 左 括 号 处 一 旦 出 现 上 述 的 回 复 操 作, 那 么 格 式 说 明 里 面 重 复 使 用 的 部 分 必 须 至 少 包 含 一 个 数 据 编 辑 描 述 符 如 果 格 式 控 制 回 复 到 一 个 前 置 有 重 复 说 明 的 括 号 时, 其 前 置 重 复 说 明 必 须 同 样 加 以 重 复 使 用 格 式 控 制 的 回 复 对 于 比 例 因 子 (17.6.5), 符 号 控 制 编 辑 描 述 符 (17.6.4) 以 及 空 格 解 释 编 辑 描 述 符 (17.6.6) 都 不 产 生 任 何 影 响 例 17-3 格 式 说 明 的 一 个 简 单 例 子 为 : 10 FORMAT (1X, 2(F10.3, I5)) 它 的 输 出 列 表 为 : WRITE (10,10) 10.1, 3, 4.7, 1, 12.4, 5, 5.2, 6 下 面 的 格 式 说 明 能 够 得 到 同 样 的 输 出 : 10 FORMAT (1X, F10.3, I5, F10.3, I5/F10.3, I5, F10.3, I5) 17.4 格 式 控 制 的 文 件 定 位 格 式 控 制 的 文 件 定 位 有 如 下 几 种 情 况 : 在 执 行 任 何 的 数 据 编 辑 描 述 符 或 字 符 串 编 辑 描 述 符 之 后, 文 件 都 定 位 于 当 前 纪 录 的 最 后 一 个 被 读 或 写 的 字 符 之 后 在 执 行 T,TL,TR, 或 X 编 辑 描 述 符 之 后, 文 件 的 定 位 约 定 参 见 节 在 执 行 斜 线 编 辑 描 述 符 之 后, 文 件 的 定 位 约 定 参 见 节

312 如 果 格 式 控 制 出 现 了 上 节 所 述 的 回 复, 则 文 件 定 位 的 方 式 与 执 行 斜 线 编 辑 描 述 符 时 的 方 式 一 样 在 进 行 读 的 操 作 时, 遇 到 任 何 当 前 纪 录 的 不 可 处 理 的 字 符 都 被 忽 略, 一 直 到 读 入 下 一 个 纪 录 17.5 数 据 编 辑 描 述 符 数 据 的 机 器 内 部 表 示 显 然 是 不 能 直 接 拿 来 阅 读 的, 那 么 数 据 的 输 入 输 出 肯 定 就 包 含 着 对 于 以 内 部 表 示 存 在 的 数 据 进 行 转 换 的 过 程 这 就 是 数 据 编 辑 描 述 符 所 需 要 实 现 的 功 能 一 个 纪 录 当 中 的 数 据 对 象 如 果 属 于 数 值, 逻 辑 型 或 者 默 认 字 符 型, 那 么 把 它 用 字 符 形 式 表 示 出 来 的 时 候, 就 必 须 是 采 取 默 认 字 符 ; 如 果 数 据 对 象 本 来 就 是 非 默 认 字 符 型, 那 么 也 必 须 采 用 相 应 的 非 默 认 字 符 型 在 执 行 字 符 串 编 辑 描 述 符 的 时 候, 传 输 到 纪 录 的 字 符 必 须 是 默 认 字 符 型 在 执 行 输 入 语 句 的 时 候, 给 出 的 变 量 同 时 也 就 获 得 了 定 义, 除 非 中 途 出 现 错 误 条 件, 或 文 件 终 止 条 件, 或 纪 录 终 止 条 件 在 执 行 输 出 语 句 的 时 候, 给 出 的 表 达 式 同 时 也 就 被 赋 予 了 值 下 面 我 们 分 小 节 讨 论 下 面 这 三 种 数 据 对 象 的 编 辑 描 述 符 以 及 一 般 的 编 辑 描 述 符 : 数 值 编 辑 描 述 符 ; 逻 辑 型 编 辑 描 述 符 ; 字 符 型 编 辑 描 述 符 数 值 编 辑 用 于 说 明 整 型, 实 型, 以 及 复 型 数 据 的 输 入 输 出 格 式 的 编 辑 描 述 符 包 括 :I,B,O,Z,F,E, EN, ES,D, 和 G 数 值 编 辑 的 一 般 规 则 如 下 : 对 于 整 型, 实 型 和 复 型 这 些 数 值 数 据, 在 输 入 的 时 候 开 头 的 空 格 都 是 没 有 意 义 的 除 了 开 头 的 空 格 之 外, 对 于 其 他 位 置 的 空 格 的 解 释 依 赖 于 以 下 项 目 的 组 合 : 说 明 符 BLANK=; 预 联 结 文 件 或 内 部 文 件 的 默 认 解 释 ; 对 当 前 部 件 有 效 的 BN 或 BZ 空 格 控 制 数 值 数 据 之 前 的 加 号 可 以 省 略 如 果 数 值 数 据 纪 录 的 每 个 域 只 包 含 空 格, 则 其 域 宽 为 0 在 输 入 语 句 里 面 使 用 F,E,EN,ES,D, 和 G 这 些 编 辑 符, 可 以 在 输 入 域 里 面 使 用 比 系 统 所 支 持 的 更 多 的 位 数 在 输 出 语 句 里 面 使 用 I,F,E,EN,ES,D,G 这 些 编 辑 符, 对 于 正 数 或 0, 和 受 到 编 辑 描 述 符 S, SP,SS 的 控 制 一 样, 都 可 以 前 置 加 号 ; 而 负 数 则 必 须 前 置 减 号 在 输 出 时, 数 值 表 示 在 域 里 面 是 向 右 看 齐 的, 如 果 编 辑 产 生 的 字 符 数 目 少 于 域 宽, 那 么 字 符 串 前 面 用 空 格 填 充 在 输 出 时, 如 果 边 界 产 生 的 字 符 串 的 字 符 数 目 多 于 域 宽, 或 者 如 果 指 数 的 长 度 超 过 了 编 辑 描 述 符 Ew.dEe,ENw.dEe,ESw.dEe,Gw.dEe 所 给 出 的 长 度, 那 么 系 统 用 星 号 填 充 整 个 宽 度 为 w 的 域 如 果 出 现 了 SP 编 辑 描 述 符, 那 么 加 号 就 不 是 可 选 的 了

313 在 输 出 时, 如 果 使 用 了 编 辑 符 I,B,O,Z,F, 那 么 域 宽 w 的 值 可 以 是 0 这 时 系 统 自 动 选 择 保 证 不 会 使 得 整 个 域 填 充 星 号 的 最 小 的 正 数 域 宽 在 输 入 时, 域 宽 w 不 能 为 0 1. 整 数 编 辑 应 用 于 整 数 的 编 辑 描 述 符 包 括 :Iw,Iw.m,Bw,Bw.m,Ow,Ow.m,Zw, 以 及 Zw.m 其 中 的 各 个 字 符 含 义 如 下 : 其 中 的 I 编 辑 描 述 符 在 输 入 域 里 面, 除 了 作 用 于 空 格 之 外, 表 示 带 符 号 的 数 字 串 (signed-digit-string)(r401); 相 应 的 B,O,Z 则 分 别 表 示 二 进 制, 八 进 制 与 十 六 进 制 数 字 串 (R408, R409, R410) 如 果 系 统 同 时 支 持 大 小 写, 那 么 在 十 六 进 制 里 面 的 字 母 的 大 小 写 也 不 予 区 分 其 中 的 小 写 字 母 w 表 示 需 要 编 辑 的 纪 录 的 域 宽, 而 如 果 w 为 0, 则 由 系 统 约 定 域 宽 在 输 入 时, 域 宽 w 不 能 为 0 所 给 出 的 输 入 输 出 列 表 项 必 须 是 整 型 数 据 编 辑 描 述 符 G 也 可 以 用 来 编 辑 整 型 数 据, 参 见 m 对 输 入 无 效 Iw 编 辑 描 述 符 给 出 的 输 出 域 由 0 或 可 能 的 空 格 后 接 整 型 数 字 字 符 串 组 成, 整 型 数 字 字 符 串 可 以 是 负 数, 则 必 须 前 置 减 号, 也 可 以 是 正 数, 则 前 置 可 选 的 加 号 当 然 都 不 能 前 置 0 一 个 数 字 字 符 串 至 少 由 一 个 数 字 组 成 编 辑 描 述 符 Bw,Ow,Zw 给 出 的 输 出 域 由 0 或 可 能 的 空 格 后 接 二 进 制, 八 进 制, 或 十 六 进 制 形 式 的 常 数 数 值, 同 样 不 能 前 置 0 二 进 制, 八 进 制, 或 十 六 进 制 形 式 的 常 量 至 少 由 一 个 数 字 组 成 除 了 至 少 由 m 个 数 字 组 成 的 数 字 串 之 外, 编 辑 描 述 符 Iw.m,Bw.m,Ow.m,Zw.m 给 出 的 输 出 域 分 别 和 编 辑 描 述 符 Iw,Bw,Ow,Zw 所 给 出 的 一 致 当 数 字 数 目 不 够 的 情 况 下, 则 需 要 前 置 足 够 的 0 m 的 值 不 能 超 过 w 的 值, 除 非 w 为 0 如 果 m 为 0, 而 内 部 数 据 值 也 为 0, 则 输 出 域 完 全 由 空 格 组 成, 同 时 符 号 控 制 失 去 作 用 当 m 和 w 同 时 为 0, 而 内 部 数 据 值 也 为 0 时, 则 产 生 一 个 空 格 符 2. 实 数 和 复 数 的 编 辑 用 于 编 辑 实 数 和 复 数 的 编 辑 描 述 符 包 括 :F,E,EN,ES 以 及 D 因 此 凡 是 和 F,E,EN, ES, 以 及 D 相 应 的 输 入 输 出 列 表 项 都 必 须 是 实 数 或 复 数 另 外 编 辑 描 述 符 G 也 可 以 用 于 实 数 和 复 数 数 据 参 见 下 面 分 小 节 说 明 这 些 编 辑 描 述 符 的 用 法 1. 编 辑 符 F 编 辑 描 述 符 Fw.d 表 示 该 域 占 据 w 个 位 置, 而 它 的 小 数 部 分 由 d 个 数 字 组 成 如 果 w 的 值 为 0, 则 由 系 统 约 定 域 宽 不 过 在 输 入 的 时 候, 不 允 许 w 为 0 使 用 编 辑 描 述 符 F 的 规 则 如 下 : 输 入 域 包 括 可 选 的 符 号, 后 接 一 个 或 多 个 可 选 的 数 字 组 成 的 字 符 串, 其 中 还 包 括 小 数 点, 以 及 可 以 解 释 为 0 的 空 格 如 果 输 入 域 包 含 一 个 小 数 点, 那 么 d 对 输 入 无 作 用 如 果 输 入 域 当 中 没 有 出 现 小 数 点, 那 么 数 字 串 的 最 右 边 的 d 个 数 字 将 被 认 为 是 所 表 示 的 数 值 的 小 数 部 分 数 字 串 所 包 含 的 数 字 字 符 数 目 可 以 超 过 系 统 所 允 许 的 常 量 表 示 的 数 字 的 数 目, 不 过 这 时 需 要 采 用 如 下 的 三 种 形 式 的 指 数 形 式 : 符 号 后 接 一 个 数 字 串 ;

314 E 后 接 0 和 多 个 空 格, 然 后 再 后 接 一 个 具 有 符 号 的 数 字 串 ; D 后 接 0 和 多 个 空 格, 然 后 再 后 接 一 个 具 有 符 号 的 数 字 串 包 含 D 的 指 数 等 同 于 包 含 E 的 指 数 如 果 输 入 域 不 包 含 一 个 指 数, 则 等 价 于 在 基 本 形 式 后 接 一 个 指 数 值 -k, 这 里 的 k 为 给 定 的 比 例 因 子 输 出 域 包 含 空 格, 依 据 数 值 正 负 而 定 的 必 须 的 减 号, 和 可 选 的 加 号, 然 后 就 是 带 有 小 数 点 的 数 字 串, 表 示 了 内 部 值 的 大 小 当 输 出 域 里 面 的 值 的 小 于 1 时, 除 了 紧 接 小 数 点 左 边 的 可 选 的 0 之 外, 不 允 许 前 置 0 当 除 了 这 个 0 自 身 之 外, 输 出 域 里 面 不 再 含 有 其 他 数 字, 那 么 这 个 可 选 的 0 就 必 须 出 现 2. 编 辑 符 E 和 D 编 辑 描 述 符 Ew.d, Dw.d, 以 及 Ew.dEe 表 示 外 部 域 占 据 w 个 位 置, 而 它 的 小 数 部 分 由 d 个 数 字 组 成 ( 除 非 出 现 一 个 大 于 1 的 比 例 因 子 ), 指 数 部 分 由 e 个 数 字 组 成 其 中 e 的 取 值 对 于 输 入 没 有 作 用 如 果 输 入 域 包 含 小 数 点, 则 d 也 对 输 入 没 有 作 用 输 入 域 的 形 式 和 说 明 和 F 编 辑 符 一 致 比 例 因 子 为 0 的 输 出 域 形 式 为 : ] [0].x [ 1 x 2 x dexp 其 中 为 加 号 或 减 号 注 意 如 果 exp > 999, 则 编 辑 描 述 符 Ew.d 和 Dw.d 都 不 能 使 用 3. 编 辑 符 EN 编 辑 描 述 符 EN 表 示 输 出 域 的 形 式 为 实 数 的 在 工 程 技 术 领 域 常 常 使 用 的 一 种 表 示 形 式, 即 如 下 形 式 的 实 数 : ] yyy.x [ 1 x 2 x dexp 显 然 这 种 形 式 的 实 数 除 非 输 出 值 为 0, 它 的 整 数 部 分 的 绝 对 值 都 是 大 于 等 于 1 而 小 于 1000 的 具 体 的 编 辑 描 述 符 包 括 ENw.d 和 ENw.dEe, 表 示 外 部 域 占 据 了 w 个 位 置, 分 数 部 分 由 d 个 数 字 组 成, 而 指 数 部 分 由 e 个 数 字 组 成 这 时 输 入 域 的 形 式 和 解 释 和 编 辑 符 F 的 一 致 如 果 exp > 999, 那 么 编 辑 符 ENw.d 就 不 能 使 用 了 例 17-4 内 部 值 使 用 了 编 辑 符 SS, EN12.3 的 输 出 域 E E E E 编 辑 符 ES 编 辑 描 述 符 ES 产 生 的 输 出 域 的 形 式 为 实 数 的 科 学 表 示 法 这 种 形 式 的 实 数 的 整 数 部 分 在 不

315 等 于 0 的 情 况 下, 大 于 等 于 1 而 小 于 10 比 例 因 子 对 输 出 无 作 用 这 种 表 示 形 式 为 : ] y.x [ 1 x 2 x dexp 具 体 的 编 辑 描 述 符 包 括 ESw.d 和 ESw.dEe, 表 示 外 部 域 占 据 w 个 位 置, 小 数 部 分 由 d 个 数 字 组 成, 而 指 数 部 分 由 e 个 数 字 组 成 输 入 域 的 形 式 和 解 释 同 编 辑 符 F 的 一 致 如 果 exp > 999, 那 么 不 能 使 用 编 辑 符 ESw.d 例 17-5 内 部 值 使 用 了 编 辑 符 SS, ES12.3 的 输 出 域 E E E E 复 数 编 辑 由 于 在 FORTRAN 里 面 复 数 本 质 上 被 看 成 是 两 个 实 数 组 成 的 数 组, 因 此 复 数 的 编 辑 实 际 上 就 是 分 别 对 组 成 复 数 的 两 个 实 数 的 编 辑, 即 第 一 个 编 辑 描 述 符 用 于 复 数 的 实 部, 而 第 二 个 编 辑 描 述 符 用 于 复 数 的 虚 部, 这 两 个 编 辑 描 述 符 可 以 不 同 而 在 这 两 个 编 辑 描 述 符 之 间, 还 可 以 使 用 控 制 编 辑 符 和 字 符 串 编 辑 符 逻 辑 型 编 辑 逻 辑 型 编 辑 描 述 符 Lw 表 示 域 宽 为 w, 而 相 应 的 输 入 输 出 列 表 项 当 然 必 须 为 逻 辑 型 数 据 编 辑 描 述 符 G 也 可 以 用 来 编 辑 逻 辑 型 数 据 参 见 输 入 域 可 以 包 括 可 选 的 空 格, 可 选 的 小 数 点, 然 后 是 T 或 F, 分 别 表 示 真 和 假 在 T 或 F 后 面 还 可 以 附 加 任 意 的 字 符, 但 是 系 统 都 一 律 予 以 忽 略 如 果 系 统 同 时 支 持 大 小 写, 那 么 在 逻 辑 型 输 出 域 里 面 大 小 写 是 等 价 的 逻 辑 常 量.TRUE. 和.FALSE 都 是 合 法 的 输 入 形 式 输 出 域 由 w-1 个 空 格, 后 接 T 或 F 组 成, 分 别 表 示 真 或 假 字 符 型 编 辑 顾 名 思 义, 字 符 型 编 辑 描 述 符 A[w] 只 能 应 用 于 字 符 型 的 输 入 输 出 列 表 项, 而 同 时 编 辑 符 G 也 可 以 用 于 字 符 型 数 据 在 编 辑 符 A 或 G 的 控 制 下, 字 符 型 数 据 在 传 输 和 转 换 时 所 涉 及 到 的 种 别 参 数 的 匹 配 问 题, 是 由 相 应 的 列 表 项 的 种 别 参 数 来 决 定 的 如 果 编 辑 符 A 给 出 了 域 宽 w, 那 么 该 域 就 由 w 个 字 符 组 成 ; 如 果 编 辑 符 A 没 有 给 出 域 宽 w, 那 么 域 里 面 的 字 符 的 数 目 就 是 相 应 列 表 项 的 字 符 长 度, 而 不 用 考 虑 种 别 参 数 值 设 一 个 输 入 输 出 列 表 项 的 长 度 为 LEN, 如 果 相 应 输 入 域 宽 已 经 由 编 辑 符 A 给 出 为 w, 那 么

316 当 w 大 于 或 等 于 LEN 时, 那 么 取 右 边 的 LEN 个 字 符 作 为 输 入 ; 如 果 w 小 于 LEN, 那 么 这 w 个 字 符 靠 左 边 对 齐, 而 尾 部 填 充 LEN-w 个 空 格 作 为 输 入 如 果 编 辑 符 A 给 出 的 输 出 域 宽 w 大 于 LEN, 那 么 输 出 域 由 w-len 个 空 格 后 接 LEN 个 字 符 组 成 ; 如 果 w 小 于 或 等 于 LEN, 那 么 输 出 域 由 靠 左 边 的 w 个 字 符 组 成 通 用 编 辑 编 辑 描 述 符 Gw.d 和 Gw.dE e 用 于 任 意 固 有 类 型 的 输 入 输 出 列 表 项, 因 此 称 为 通 用 编 辑 符 一 般 的 应 用 这 种 编 辑 符 时, 总 是 表 示 域 宽 为 w, 小 数 部 分 至 多 为 d 个 数 字, 而 指 数 部 分 为 e 个 数 字 当 然 当 该 编 辑 符 应 用 于 整 型, 逻 辑 型 以 及 字 符 型 数 据 时,d 和 e 这 两 个 参 数 都 失 去 意 义 1. 通 用 数 值 编 辑 当 应 用 编 辑 描 述 符 Gw.d 和 Gw.dEe 来 说 明 整 型 实 型 以 及 复 型 数 据 时, 遵 循 数 值 编 辑 的 一 般 的 规 则 参 见 其 中 的 编 辑 符 Gw.dEe 的 应 用 规 则 和 编 辑 描 述 符 Ew.dEe 的 规 则 一 致 通 用 整 数 编 辑 当 针 对 整 型 数 据 的 输 入 输 出 应 用 编 辑 描 述 符 Gw.d 和 Gw.dEe 时, 规 则 和 应 用 编 辑 描 述 符 Iw 一 致, 只 是 这 时 w 不 能 为 0 通 用 实 数 和 复 数 编 辑 这 时 输 入 域 的 形 式 与 解 释 和 编 辑 符 F 的 一 致 而 输 出 域 的 表 示 形 式 依 赖 于 需 要 进 行 编 辑 的 数 值 的 大 小 比 例 因 子 同 样 是 无 效 的, 除 非 数 值 超 出 了 F 编 辑 所 允 许 的 有 效 范 围 2. 通 用 逻 辑 型 编 辑 当 应 用 Gw.d 和 Gw.dEe 来 编 辑 逻 辑 型 数 据 的 输 入 输 出 时, 遵 循 编 辑 描 述 符 Lw 的 规 则 3. 通 用 字 符 型 编 辑 当 应 用 Gw.d 和 Gw.dEe 来 编 辑 逻 辑 型 数 据 的 输 入 输 出 时, 遵 循 编 辑 描 述 符 Aw 的 规 则 控 制 编 辑 描 述 符 控 制 编 辑 描 述 符 并 不 决 定 数 据 的 传 输 以 及 数 据 的 内 部 表 示 和 外 部 表 示 之 间 的 转 换, 但 是 这 种 编 辑 符 能 够 对 后 续 的 数 据 编 辑 描 述 符 所 执 行 的 转 换 产 生 特 定 的 影 响 下 面 分 节 说 明 FORTRAN 的 这 些 控 制 编 辑 描 述 符 定 位 编 辑 所 谓 定 位 编 辑 描 述 符 T,T L,TR, 以 及 X 的 功 能 就 是 给 出 开 始 从 纪 录 进 行 传 输, 或 者 传 输 到 纪 录 的 第 一 个 字 符 的 位 置 由 编 辑 描 述 符 T 给 出 的 定 位 可 以 是 当 前 位 置 的 任 意 方 向, 这 样 在 输 入 时, 纪 录 的 某 个 部 分 就 有 可 能 被 多 次 进 行 不 同 的 编 辑 处 理 由 编 辑 描 述 符 X 给 出 的 定 位 是 从 当 前 位 置 向 前 运 行 编 辑 描 述 符 nx 和 编 辑 描 述 符 TRn 的 效 果 一 样

317 在 输 出 时, 编 辑 描 述 符 T, TL,TR, 以 及 X 本 身 不 能 导 致 字 符 的 传 输, 因 此 它 们 不 能 影 响 纪 录 的 长 度 如 果 字 符 传 输 到 或 者 落 后 于 T,TL,TR, 以 及 X 所 给 出 的 定 位, 那 么 被 忽 略 的 位 置 需 要 填 充 空 格 最 后 结 果 就 是 整 个 纪 录 都 初 始 化 为 空 格 在 输 出 时, 纪 录 当 中 的 字 符 可 以 被 替 换, 但 是 编 辑 描 述 符 T,TL,TR, 以 及 X 本 身 不 能 直 接 对 字 符 进 行 替 换, 而 只 能 通 过 定 位, 使 得 后 续 的 编 辑 符 能 够 完 成 替 换 的 工 作 斜 线 编 辑 斜 线 编 辑 描 述 符 表 示 数 据 传 输 的 结 束 当 从 能 够 序 列 访 问 的 文 件 输 入 数 据 时, 传 输 结 束 后 当 前 纪 录 的 剩 余 部 分 被 忽 略, 而 文 件 定 位 于 后 接 纪 录 的 开 头, 该 后 接 纪 录 就 成 为 当 前 纪 录 在 输 出 到 一 个 能 够 序 列 访 问 的 文 件 时, 就 在 当 前 纪 录 后 面 产 生 一 个 新 的 空 纪 录, 该 新 纪 录 就 成 为 文 件 的 下 一 个 当 前 纪 录, 而 文 件 也 定 位 于 该 新 纪 录 的 开 头 对 于 序 列 访 问 的 文 件 来 说, 纪 录 数 总 是 逐 一 增 加 的, 而 文 件 定 位 也 就 随 着 该 纪 录 数 而 变 化 一 个 不 包 含 任 何 字 符 的 纪 录 也 可 以 作 为 输 出, 这 时 如 果 该 文 件 是 内 部 文 件, 或 者 是 直 接 访 问 的 文 件, 该 纪 录 就 由 空 格 字 符 组 成 在 斜 线 编 辑 描 述 符 里 面, 重 复 说 明 是 可 选 的, 如 果 不 出 现, 则 默 认 值 为 冒 号 编 辑 如 果 在 输 入 输 出 列 表 里 面 再 也 不 存 在 有 效 的 项 了, 那 么 冒 号 编 辑 描 述 符 就 能 够 终 止 格 式 控 制, 而 如 果 在 输 入 输 出 列 表 里 面 还 存 在 有 效 项, 则 冒 号 编 辑 描 述 符 没 有 任 何 作 用 控 制 编 辑 符 S, SP, 以 及 SS 控 制 编 辑 描 述 符 S,SS, 以 及 SP 都 是 用 于 控 制 数 值 输 出 域 的 可 选 的 加 号, 或 者 说 正 号 是 否 给 出 如 果 在 格 式 说 明 里 面 使 用 了 SP, 那 么 系 统 将 在 任 何 后 续 的 位 置 添 加 一 个 加 号 ; 如 果 在 格 式 说 明 里 面 使 用 了 SS, 那 么 系 统 将 不 会 在 任 何 后 续 的 位 置 添 加 加 号 ; 如 果 在 格 式 说 明 里 面 使 用 了 S, 那 么 是 否 添 加 加 号 由 系 统 做 具 体 的 约 定 编 辑 描 述 符 S,SS, 以 及 S P 在 执 行 输 出 语 句 时, 只 影 响 编 辑 符 I,F,E,EN,ES, D, 和 G; 而 在 执 行 输 入 语 句 时, 这 些 编 辑 符 没 有 任 何 作 用 控 制 编 辑 描 述 符 P 编 辑 描 述 符 kp 能 够 把 比 例 因 子 重 定 义 为 k, 而 比 例 因 子 能 够 影 响 数 值 量 的 编 辑 在 开 始 执 行 每 一 个 输 入 输 出 语 句 时, 比 例 因 子 的 值 总 是 0, 对 于 后 续 的 编 辑 符 F,E,EN, ES,D, 以 及 G, 比 例 因 子 都 不 受 影 响, 而 只 有 在 出 现 编 辑 描 述 符 P 的 情 况 下, 才 产 生 新 的 比 例 因 子 而 格 式 控 制 的 复 原 也 不 会 影 响 已 有 的 比 例 因 子 比 例 因 子 k 对 于 编 辑 的 影 响 体 现 在 以 下 几 个 方 面 : 如 果 使 用 F,E,EN, ES,D,G 作 为 输 入 编 辑, 同 时 输 入 域 里 面 不 存 在 指 数 ; 或 者 使 用 F 作 为 输 出 编 辑, 那 么 比 例 因 子 的 意 思 就 是 外 部 表 示 数 值 等 于 内 部 表 示 数 值 乘 10 k

318 如 果 使 用 F,E,EN, ES,D,G 作 为 输 入 编 辑, 而 输 入 域 里 面 存 在 指 数, 那 么 比 例 因 子 没 有 作 用 如 果 使 用 E,D 作 为 输 出 编 辑, 那 么 产 生 的 数 值 的 带 号 部 分 需 要 乘 10 k, 而 指 数 除 以 k 使 用 G 作 为 输 出 编 辑 时, 比 例 因 子 的 将 没 有 作 用, 除 非 被 编 辑 的 数 据 值 超 过 了 F 编 辑 所 许 可 的 范 围 如 果 要 求 使 用 编 辑 符 E, 那 么 比 例 因 子 的 作 用 和 在 E 输 出 编 辑 一 样 如 果 使 用 EN,ES 作 为 输 出 编 辑, 则 比 例 因 子 没 有 作 用 17.7 字 符 串 编 辑 描 述 符 字 符 串 编 辑 描 述 符 用 来 把 需 要 写 入 的 字 符 隔 离 标 记 出 来 对 于 字 符 串 编 辑 描 述 符 来 说, 域 宽 就 是 被 隔 离 出 来 的 字 符 串 的 长 度, 包 括 其 中 的 空 格 也 需 要 计 入 而 其 中 成 对 的 隔 离 字 符 被 认 为 是 一 个 单 独 的 字 符 字 符 串 编 辑 描 述 符 的 定 界 符 或 者 是 撇 号, 或 者 是 引 号 附 录 C FORTRAN95 语 法 在 本 附 录 我 们 给 出 FORTRAN95 的 语 法 规 则 (ISO/IEC :1997(E)) 所 谓 语 法 规 则, 就 是 描 述 一 切 FORTRAN9 5 的 词 汇, 语 句, 结 构 等 语 言 成 分 的 形 式 规 则, 凡 是 遵 循 了 这 个 描 述 的, 就 是 合 法 的 FORTRAN95 语 言 ; 否 则, 就 是 不 合 法 的 因 此 语 法 规 则 本 身 必 须 是 精 确 的, 绝 对 不 能 产 生 歧 义 在 这 种 要 求 下,FORTRAN95 的 语 法 采 用 了 形 式 语 言 的 方 式 给 出 语 法 规 则, 即 属 于 所 谓 Backus-Naur 形 式 ( BNF) 的 一 种 变 体 由 于 这 种 描 述 形 式 本 身 采 用 了 语 言 的 形 式, 因 此 有 几 点 说 明 如 下 : 在 描 述 语 法 时, 对 于 属 于 FORTRAN 字 符 集 的 字 符 按 照 字 面 形 式 来 理 解, 除 非 有 特 别 的 说 明 对 于 每 一 个 语 法 成 分 的 描 述, 都 有 一 个 唯 一 的 编 号, 这 个 编 号 的 采 用 了 如 下 的 一 般 形 式 : Rxyy 其 中 的 R 表 示 规 则, 而 x 表 示 FORTRAN 标 准 的 节 号,yy 表 示 对 于 该 语 法 成 分 的 描 述 在 该 节 的 唯 一 编 号, 因 此 对 于 每 一 个 语 法 成 分 的 描 述, 这 个 Rxyy 可 以 看 成 是 它 的 唯 一 编 号, 全 书 的 正 文 当 中, 每 当 第 一 次 引 入 一 个 语 法 成 分, 我 们 总 是 给 出 了 它 的 这 个 编 号 在 下 面 的 规 则 表 里 面, 这 个 编 号 简 写 为 纯 数 字, 省 略 了 字 母 R 下 面 的 描 述 当 中, 为 了 简 洁 起 见, 采 用 了 如 下 的 缩 写 : argument arg attribute..attr declaration..decl definition def descriptor desc expression..expr

319 integer int operator..op specifier.spec statement stmt 同 样 为 了 简 洁 的 缘 故, 这 里 给 出 的 形 式 描 述 不 可 能 是 绝 对 完 备 和 精 确 的, 在 能 够 理 解 的 前 提 下, 本 附 录 采 用 了 一 定 的 简 化 形 式, 并 且 在 FORTRAN 标 准 的 基 础 上 作 了 一 定 的 节 略 除 了 文 字 之 外, 还 使 用 了 来 自 FORTRAN 字 符 集 的 如 下 特 殊 符 号 ; 另 外 还 使 用 了 表 示 或 者 的 意 思 + 加 号 % 百 分 号 - 减 号 & and * 星 号 ; 分 号 / 除 号 或 斜 线 省 略 符 号 < 小 于 引 号 > 大 于. 小 数 点 或 句 号 ( 左 括 号 = 等 号 ) 右 括 号! 叹 号 或 者 FORTRAN95 的 语 法 规 则 (ISO/IEC :1997(E)) 语 法 成 分 形 式 描 述 编 号 access-id use-name generic-spec 523 access-spec PUBLIC 511 PRIVATE access-stmt access-spec [ [ :: ] access-id-list ] 522 ac-do-variable scalar-int-variable 436 ac-implied-do ( ac-value-list, ac-implied-do-control ) 434 ac-implied-do-control ac-do-variable = scalar-int-expr, scalar-int-expr [, 435 scalar-int-expr ] action-stmt allocate-stmt assignment-stmt backspace-stmt call-stmt close-stmt continue-stmt cycle-stmt deallocate-stmt endfile-stmt end-function-stmt end-program-stmt end-subroutine-stmt exit-stmt forall-stmt 216

320 goto-stmt if-stmt inquire-stmt nullify-stmt open-stmt pointer-assignment-stmt print-stmt read-stmt return-stmt rewind-stmt stop-stmt where-stmt write-stmt actual-arg Expr 1214 variable procedure-name actual-arg-spec [ keyword = ] actual-arg 1212 ac-value Expr ac-implied-do add-op add-operand [ add-operand mult-op ] mult-operand 706 allocatable-stmt ALLOCATABLE [ :: ] array-name [ ( deferred-shape-spec-list ) ] {, array-name [ ( deferred-shape-spec-list ) ] } allocate-lower-bound scalar-int-expr 627 allocate-object variable-name structure-component allocate-shape-spec [ allocate-lower-bound : ] allocate-upper-bound 626 allocate-stmt ALLOCATE ( allocation-list [, STAT = stat-variable ] ) 622 allocate-upper-bound scalar-int-expr 628 allocation allocate-object [ ( allocate-shape-spec-list ) ] 624 alphanumeric-character Letter 302 digit underscore and-op.and. 720 and-operand [ not-op ] level-4-expr 715 array-constructor ( / ac-value-list / ) 432 array-element data-ref 615 array-section dataref [ ( substringrange ) ] 616 array-spec explicit-shape-spec-list assumed-shape-spec-list deferred-shape-spec-list

321 assumed-size-spec assignment-stmt variable = expr 735 assumed-shape-spec [ lower-bound ] : 517 assumed-shape-spec-list assumed-shape-spec { assumed-shape-spec } 0 assumed-size-spec [ explicit-shape-spec-list, ] [ lower-bound : ] * 519 attr-spec backspace-stmt PARAMETER access-spec ALLOCATABLE DIMENSION (array-spec ) EXTERNAL INTENT ( intent-spec ) INTRINSIC OPTIONAL POINTER SAVE TARGET BACKSPACE external-file-unit BACKSPACE ( position-spec-list ) binary-constant B ' digit { digit } ' 408 blank-interp-edit-desc B "digit { digit } " BN BZ block { execution-part-construct } 801 block-data block-data-stmt [specification-part] end-block-data-stmt 1112 block-data-stmt BLOCK DATA [block-data-name] 1113 block-do-construct do-stmt do-block end-do 817 boz-literal-constant binary-constant octal-constant hex-constant call-stmt CALL subroutine-name [ ( [ actual-arg-spec-list ] ) ] 1211 case-construct select-case-stmt { case-stmt block } end-select-stmt 808 case-expr scalar-int-expr scalar-char-expr scalar-logical-expr case-selector ( case-value-range-list ) DEFAULT case-stmt CASE case-selector [ case-construct-name ] 810 case-value case-value-range scalar-int-initialization-expr scalar-char-initialization-expr scalar-logical-initialization-expr case-value case-value : : case-value case-value : case-value

322 case-value-range-list case-value-range { case-value-range } 0 char-constant constant 309 char-expr expr 726 char-initialization-exr char-expr 731 char-length ( char-len-param-value ) char-len-param-value char-literal-constant char-selector scalar-int-literal-constant specification-expr * : [ _kind-param ] ' { rep-char } ' [ _kind-param ] " { rep-char } " length-selector (LEN = char-len-param-value, KIND = scalar-int-initialization-expr ) ( char-len-param-value, [ KIND = ] scalar-int-initialization-expr ) (KIND = scalar-int-initialization-expr [, LEN = char-len-param-value ] ) char-string-edit-desc char-literal-constant 1016 char-variable variable 605 close-spec [ UNIT = ] external-file-unit IOSTAT = scalar-default-int-variable ERR = label STATUS = scalar-default-char-expr close-stmt CLOSE ( close-spec-list ) 907 common-block-object variable-name [ ( explicit-shape-spec-list ) ] 530 common-stmt COMMON [ / [ common-block-name ] / ] common-block-object-list { [,] / [ common-block-name ] / common-block object-list } complex-literal-constant ( real-part, imag-part ) 417 component-array-spec component-attr-spec explicit-shape-spec-list deferred-shape-spec-list POINTER DIMENSION ( component-array-spec ) component-attr-spec-list component-attr-spec { component-attr-spec } 0 component-decl component-name [ ( component-array-spec ) ] [ * char-length ] [ component-initialization ] component-decl-list component-decl { component-decl } 0 component-def-stmt type-spec [ [, component-attr-spec-list ] :: ] component-initialization component-decl-list = initialization-expr => NULL ()

323 concat-op // 712 connect-spec constant [ UNIT = ] external-file-unit IOSTAT = scalar-default-int-variable ERR = label FILE = file-name-expr STATUS = scalar-default-char-expr ACCESS = scalar-default-char-expr FORM = scalar-default-char-expr RECL = scalar-int-expr BLANK = scalar-default-char-expr POSITION = scalar-default-char-expr ACTION = scalar-default-char-expr DELIM = scalar-default-char-expr PAD = scalar-default-char-expr literal-constant named-constant constant-subobject subobject 702 contains-stmt CONTAINS 1227 continue-stmt CONTINUE 839 control-edit-desc position-edit-desc 1010 [ r ] / : sign-edit-desc k P blank-interp-edit-desc cycle-stmt CYCLE [ do-construct-name ] 834 d int-literal-constant 1008 data-edit-desc I w [. m ] 1005 B w [. m ] O w [. m ] Z w [. m ] F w. d E w. d [ E e ] EN w. d [ E e ] ES w. d [ E e ] G w. d [ E e ] L w A [ w ] D w. d Data-i-do-object Array-element 536 scalarstructurecomponent dataimplieddo Data-i-do-variable Scalar-int-variable 537 Data-implied-do ( data-i-do-object-list, data-i-do-variable = scalar-int-expr

324 scalar-int-expr [, scalar-int-expr] ) data-ref part-ref { % part-ref } 612 data-stmt DATA data-stmt-set { [, ] data-stmt-set } 532 data-stmt-constant Data-stmt-object scalar-constant scalar-constant-subobject signed-int-literal-constant signed-real-literal-constant NULL ( ) structure-constructor entry-stmt variable data-implied-do data-stmt-object-list data-stmt-object { data-stmt-object } 0 datastmtrepeat Scalar-int-constant scalar-int-constant-subobject data-stmt-set data-stmt-object-list / data-stmt-value-list / 533 Data-stmt-value [ data-stmt-repeat* ] data-stmt-constant 538 data-stmt-value-list data-stmt-value { data-stmt-value } 0 deallocate-stmt DEALLOCATE ( allocate-object-list [, STAT = 631 stat-variable ] ) declaration-construct derived-type-def 207 interface-block type-declaration-stmt specification-stmt parameter-stmt format-stmt entry-stmt stmt-function-stmt default-char-expr expr 727 Default-char-variable variable 606 default-int-variable variable 608 default-logical-variable variable 604 deferred-shape-spec : 518 defined-binary-op. letter { letter }. 724 defined-operator defined-binary-op 311 defined-unary-op extended-intrinsic-op defined-unary-op. letter { letter }. 704 derived-type-def derived-type-stmt { private-sequence-stmt } component-def-stmt { component-def-stmt } end-type-stmt derived-type-stmt TYPE [ [, access-spec ] ] type-name 423 digit-string digit { digit } 402 dimension-stmt DIMENSION [ :: ] array-name ( array-spec ) {,

325 array-name ( array-spec ) } do-block block 823 do-construct block-do-construct 816 do-construct-name name 0 do-stmt label-do-stmt nonlabel-do-stmt do-variable scalar-int-variable 822 dummy-arg dummy-arg-name * e int-literal-constant 1009 else-if-stmt ELSE IF ( scalar-logical-expr ) THEN [ if-construct-name ] 804 else-stmt ELSE [ if-construct-name ] 805 elsewhere-stmt ELSEWHERE [ where-construct-name ] 745 end-block-data-stmt END [BLOCK DATA [block-data-name]] 1114 end-do end-do-stmt continue-stmt end-do-stmt END DO [ do-construct-name ] 825 endfile-stmt ENDFILE external-file-unit 920 end-forall-stmt END FORALL [ forall-construct-name ] 753 end-function-stmt END [ FUNCTION [ function-name ]] 1220 end-if-stmt END IF [ if-construct-name ] 806 end-interface-stmt END INTERFACE [ generic-spec ] 1204 end-module-stmt END [MODULE [ module-name]] 1106 end-program-stmt END [PROGRAM [ program-name]] 1103 end-select-stmt END SELECT [ select-case-construct-name ] 811 end-subroutine-stmt END [ SUBROUTINE [ subroutine-name ]] 1224 end-type-stmt END TYPE [ type-name ] 430 end-where-stmt END WHERE [ where-construct-name ] 746 entity-decl object-name [ ( array-spec ) ] [ * char-length ] [ initialization ] function-name [ * char-length ] entry-stmt ENTRY entry-name [ ( [ dummy-arg-list ] ) [ RESULT 1225 ( result-name ) ] ] enum-def equivalence-object type-alias-name ( enumerator-list ) 0 variable-name array-element substring 548 equivalence-set ( equivalence-object, equivalence-object-list ) 547 equivalence-set-list equivalence-set { equivalence-set } 0 equivalence-stmt EQUIVALENCE equivalence-set-list 546 equiv-op.eq. 722.NEQ. equiv-operand [ equiv-operand or-op ] or-operand

326 executable-construct action-stmt case-construct do-construct forall-construct if-construct where-construct execution-part executable-construct {execution-part-construct} 208 execution-part-construct executable-construct format-stmt entry-stmt data stmt (check still present) exit-stmt EXIT [ do-construct-name ] 835 explicit-shape-spec [ lower-bound : ] upper-bound 514 exponent signed-digit-string 406 exponent-letter E D expr [ expr defined-binary-op ] level-5-expr 723 extended-intrinsic-op intrinsic-operator 312 external-file -unit scalar-int-expr 902 external-name-list external-name { external-name } 0 external-stmt EXTERNAL [ :: ] external-name-list 1208 external-subprogram function-subprogram subroutine-subprogram file-name-expr scalar-default-char-expr 906 forall-assignment-stmt forall-body-construct assignment-stmt pointer-assignment-stmt forall-assignment-stmt where-stmt where-construct forall-construct forall-stmt forall-construct forall-construct-stmt { forall-body-construct } 747 end-forall-stmt forall-construct-name name 0 forall-construct-stmt [ forall-construct-name : ] FORALL forall-header 748 forall-header ( forall-triplet-spec-list [, scalar-mask-expr ] ) 749 forall-stmt FORALL forall-header forall-assignment-stmt 754 forall-triplet-spec index-name = subscript : subscript [ : stride ] 750 format default-char-expr 913 format-item label * [ r ] data-edit-desc control-edit-desc 1003

327 char-string-edit-desc [ r ] ( format-item-list ) format-item-list format-item { format-item } 0 format-specification ( [ format-item-list ) ] ) 1002 format-stmt FORMAT format-specification 1001 function-name name 0 function-reference function-name ( [ actual-arg-spec-list ] ) 1210 function-stmt function-subprogram generic-spec [ prefix ] FUNCTION function-name ( [ dummy-arg-name-list ] ) [ RESULT ( result-name ) ] function-stmt [specification-part] [execution-part] [internal-subprogram-part] end-function-stmt generic-name OPERATOR ( defined-operator ) ASSIGNMENT ( = ) goto-stmt GO TO label 836 hex-constant Z ' hex-digit { hex-digit } ' 410 Z " hex-digit { hex-digit } " hex-digit digit 411 A B C D E F if-construct if-then-stmt block { else-if-stmt block } [ else-stmt block ] 802 end-if-stmt if-construct-name name 0 if-stmt IF ( scalar-logical-expr ) action-stmt 807 if-then-stmt [ if-construct-name : ] IF ( scalar-logical-expr ) 803 THEN imag-part signed-int-literal-constant 419 signed-real-literal-constant implicit-part { implicit-part-stmt } implicit-stmt 205 implicit-part-stmt implicit-stmt 206 parameter-stmt format-stmt entry-stmt implicit-spec type-spec ( letter-spec-list ) 542 implicit-stmt IMPLICIT implicit-spec-list 541 IMPLICIT NONE initialization initialization-expr 505 => NULL()

328 initialization-expr expr 730 input-item variable io-implied-do input-item-list input-item { input-item } 0 inquire-spec [ UNIT = ] external-file-unit FILE = file-name-expr IOSTAT = scalar-default-int-variable ERR = label EXIST = scalar-default-logical-variable OPENED = scalar-default-logical-variable NUMBER = scalar-default-int-variable NAMED = scalar-default-logical-variable NAME = scalar-default-char-variable ACCESS = scalar-default-char-variable SEQUENTIAL = scalar-default-char-variable DIRECT = scalar-default-char-variable FORM = scalar-default-char-variable FORMATTED = scalar-default-char-variable UNFORMATTED = scalar-default-char-variable RECL = scalar-default-int-variable NEXTREC = scalar-default-int-variable BLANK = scalar-default-char-variable POSITION = scalar-default-char-variable ACTION = scalar-default-char-variable READ = scalar-default-char-variable WRITE = scalar-default-char-variable READWRITE = scalar-default-char-variable DELIM = scalar-default-char-variable PAD = scalar-default-char-variable inquire-spec-list inquire-spec { inquire-spec } 0 inquire-stmt INQUIRE ( inquire-spec-list ) INQUIRE ( IOLENGTH = scalar-default-int-variable ) output-item-list int-constant constant 308 intent-spec IN 512 OUT INOUT intent-stmt INTENT ( intent-spec ) [ :: ] dummy-arg-name-list 520 interface-block interface-stmt { interface-specification } end-interface-stmt 1201 interface-body function-stmt [ specification-part ] end-function-stmt 1205 subroutine-stmt [ specification-part ] end-subroutine-stmt interface-specification interface-body 1202 module-procedure-stmt interface-stmt INTERFACE [generic-spec]

329 internal-file-unit default-char-variable 903 internal-subprogram function-subprogram subroutine-subprogram internal-subprogram-part contains-stmt internal-subprogram {internal-subprogram} 210 int-expr expr 728 int-initialization-expr int-expr 732 int-literal-constant digit-string [ _ kind-param ] 404 intrinsic-operator power-op mult-op add-op concat-op rel-op not-op and-op or-op equiv-op intrinsic-procedure-name-list intrinsic-procedure-name { intrinsic-procedure-name } 0 intrinsic-stmt INTRINSIC [ :: ] intrinsic-procedure-name-list 1209 int-variable variable 607 io-control-spec [ UNIT = ] io-unit [ FMT = ] format [ NML = ] namelist-group-name REC = scalar-int-expr IOSTAT = scalar-default-int-variable ERR = label END = label ADVANCE = scalar-default-char-expr SIZE = scalar-default-int-variable EOR = label io-implied-do ( io-implied-do-object-list, io-implied-do-control ) 916 io-implied-do-control do-variable = scalar-int-expr, scalar-int-expr 918 io-implied-do-object input-item output-item [, scalar-int-expr ] io-unit external-file-unit 901 * internal-file-unit k signed-int-literal-constant 1011 keyword dummy-arg-name 1213 kind-param digit-string 405 scalar-int-constant-name kind-selector ( [ KIND = ] scalar-int-initialization-expr ) 506 label digit [ digit [ digit [ digit [ digit ]]]]] 313 label-do-stmt [ do-construct-name : ] DO label [ loop-control ]

330 Length-selector ( [ LEN = ] charlenparamvalue) * char-length [, ] Letter-spec letter [ - letter ] 543 level-1-expr [ defined-unary-op ] primary 703 level-2-expr [ [ level-2-expr ] add-op ] add-operand 707 level-3-expr [ level-3-expr concat-op ] level-2-expr 711 level-4-expr [ level-3-expr rel-op ] level-3-expr 713 level-5-expr [ level-5-expr equiv-op ] equiv-operand 718 literal-constant int-literal-constant real-literal-constant complex-literal-constant logical-literal-constant char-literal-constant boz-literal-constant local-name name 0 logical-expr expr 725 logical-initialization-expr logical-expr 733 logical-literal-constant.true. [ _kind-param ]. FALSE. [ _kind-param ] logical-variable variable 603 loop-control [, ] do-variable = scalar-int-expr, scalar-int-expr [, scalar-int-expr ] [, ] WHILE scalar-logical-expr lower-bound specification-expr 515 m int-literal-constant 1007 main-program [program-stmt] [specification-part] [execution-part] [internal-subprogram-part] end-program-stmt masked-elsewhere-stmt ELSEWHERE ( mask-expr ) [ where-construct-name ] 744 mask-expr logical-expr 743 module module-stmt [specification-part] [module-subprogram-part] 1104 end-module-stmt module-procedure-stmt MODULE PROCEDURE procedure-name-list 1206 module-stmt MODULE module-name 1105 module-subprogram module-subprogram-part mult-op * function-subprogram subroutine-subprogram 213 contains-stmt module-subprogram {module-subprogram} 212 / mult-operand level-1-expr [ power-op mult-operand ] 705 n int-literal-constant 1013 name letter (alphanumeric-character } 304 named-constant name 307 named-constant-def named-constant = initialization

331 namelist-group-name name 0 namelist-group-object variable-name 545 namelist-group-object-list namelist-group-object {namelist-group-object } 0 namelist-stmt NAMELIST / namelist-group-name / namelist-group-object-list { [, ] / namelist-group-name / namelist-group-object-list } nonlabel-do-stmt [ do-construct-name : ] DO [ loop-control ] 820 not-op.not. 719 nullify-stmt NULLIFY ( pointer-object-list ) 629 numeric-e xpr expr 729 object-name name 0 object-name-list object-name { object-name } 0 octal-constant only O ' digit { digit } ' O " digit { digit } " generic-spec only-use-name only-rename only-rename local-name => use-name 1111 only-use-name only-name 1110 open-stmt OPEN ( connect-spec-list ) 904 optional-stmt OPTIONAL [ :: ] dummy-arg-name-list 521 or-op.or. 721 or-operand [ or-operand and-op ] and-operand 716 output-item expr 915 io-implied-do output-item-list output-item { output-item } 0 parameter-stmt PARAMETER ( named-constant-def-list ) 550 parent-string scalar-variable-name 610 array-element scalar-structure-component scalar-constant part-ref part-name [ ( section-subscript-list ) ] 613 pointer-assignment-stmt pointer-object => target 736 pointer-object variable-name 630 structure-component pointer-object-list pointer-object { pointer-object } 0 pointer-stmt POINTER [ :: ] object-name [ ( deferred-shape-spec-list ) ] 528 {, object-name [ ( deferred-shape-spec-list ) ] } position-edit-desc T n 1012 TL n TR n n X

332 position-spec [ UNIT = ] external-file-unit IOSTAT = scalar-default-int-variable ERR = label 922 position-spec-list position-spec { position-spec } 0 power-op ** 708 prefix prefix-spec { prefix-spec } 1218 prefix-spec type-spec 1219 RECURSIVE PURE ELEMENTAL primary constant constant-sub-object variable array-constructor structure-constructor function-reference ( expr ) 701 print-stmt PRINT format [, output-item-list ] 911 private-sequence-stmt PRIVATE 424 SEQUENCE program program-unit {program-unit} 201 program-name name 0 program-stmt PROGRAM program-name 1102 program-unit main-program 202 external-subprogram module block-data r int-literal-constant 1004 read-stmt READ ( io-control-spec-list ) [ input-item-list ] 909 READ format [, input-item-list ] real-literal-constant significand [ exponent-letter exponent ] [ _kind-param ] 413 digit-string exponent-letter exponent [ _kind-param ] real-part signed-int-literal-constant 418 signed-real-literal-constant rel-op.eq..ne..lt..le..gt..ge. == /= 714

333 < <= > >= rename local-name => use-name 1108 result-name name 0 return-stmt RETURN [ scalar-int-expr ] 1226 rewind-stmt REWIND external-file-unit 921 REWIND ( position-spec-list ) saved-entity object-name 525 / common-block-name / saved-entity-list saved-entity { saved-entity } 0 save-stmt SAVE [ [ :: ] saved-entity-list ] 524 scalar-default-int-variable scalar-int-variable 0 scalar-int-expr expr 0 scalar-int-initialization-expr expr 0 scalar-logical-expr expr 0 sectionsubscript subscript 618 subscripttriplet vectorsubscript select-case-construct-name name 0 select-case-stmt [ case-construct-name : ] SELECT CASE ( case-expr ) 809 select-construct-name name 0 sign signed-digit-string [ sign ] digit-string 401 signed-int-literal-constant [ sign ] int-literal-constant 403 sign-edit-desc S 1014 SP SS signed-real-literal-constant [ sign ] real-literal-constant 412 significand digit-string. [ digit-string ]. digit-string specification-expr scalar-int-expr 734 specification-part { use-stmt } [ implicit-part ] { declaration-construct } 204 specification-stmt access-stmt allocatable-stmt common-stmt data-stmt dimension-stmt equivalence-stmt external-stmt intent-stmt 214

334 intrinsic-stmt namelist-stmt optional-stmt pointer-stmt save-stmt target-stmt stat-variable scalar-int-variable 623 stmt-function-stmt function-name ( [ dummy-arg-name-list ] ) = scalar-expr 1228 stop-code scalar-char-constant 841 digit [ digit [ digit [ digit [ digit ]]]] stop-stmt STOP [ stop-code ] 840 stride scalar-int-expr 620 structure-component data-ref 614 structure-constructor type-name ( expr-list ) 431 subobject array-element 602 array-section structure-component substring subroutine-stmt [ prefix ] SUBROUTINE subroutine-name 1222 [ ( [ dummy-arg-list ] ) ] subroutine-subprogram subroutine-stmt [specification-part] [execution-part] 1221 [internal-subprogram-part] end-subroutine-stmt subscript scalar-int-expr 617 Subscript-triplet [ subscript] : [subscript ] [ :stride ] 619 substring parent-string ( substring-range ) 609 substring-range [ scalar-int-expr ] : [scalar-int-expr ] 611 target variable 737 expr target-stmt TARGET [ :: ] object-name [ ( array-spec ) ] {, 529 object-name [ ( array-spec ) ] } type-declaration-stmt type-spec [ {, attr-spec } :: ] entity-decl-list 501 type-name name 0 type-spec INTEGER [ kind-selector ] 502 REAL [ kind-selector ] DOUBLE PRECISION COMPLEX [ kind-selector ] CHARACTER [char-selector ] LOGICAL [ kind-selector ] TYPE ( type-name ) underscore _ 303 Upper-bound Specification-expr 516 use-name name 0 use-stmt USE module-name [, rename-list ] 1107

335 variable USE module-name, ONLY : [only-list] scalar-variable-name array-variable-name subobject 601 Vectorsub-script intexpr 621 w int-literal-constant 1006 where-assignment-stmt assignment-stmt 742 where-body-construct where-assignment-stmt where-stmt where-construct where-construct where-construct-stmt 739 { where-body-construct } { masked-elsewhere-stmt { where-body-construct } } { elsewhere-stmt { where-body-construct } } end-where-stmt where-construct-name name 0 where-construct-stmt [ where-construct-name: ] WHERE ( mask-expr ) 740 where-stmt WHERE ( mask-expr ) where-assignment-stmt 738 write-stmt WRITE ( io-control-spec-list ) [ output-item-list ] 910

FY.DOC

FY.DOC 高 职 高 专 21 世 纪 规 划 教 材 C++ 程 序 设 计 邓 振 杰 主 编 贾 振 华 孟 庆 敏 副 主 编 人 民 邮 电 出 版 社 内 容 提 要 本 书 系 统 地 介 绍 C++ 语 言 的 基 本 概 念 基 本 语 法 和 编 程 方 法, 深 入 浅 出 地 讲 述 C++ 语 言 面 向 对 象 的 重 要 特 征 : 类 和 对 象 抽 象 封 装 继 承 等 主

More information

Microsoft PowerPoint - OPVB1基本VB.ppt

Microsoft PowerPoint - OPVB1基本VB.ppt 大 綱 0.VB 能 做 什 麼? CH1 VB 基 本 認 識 1.VB 歷 史 與 版 本 2.VB 環 境 簡 介 3. 即 時 運 算 視 窗 1 0.VB 能 做 什 麼? Visual Basic =>VB=> 程 式 設 計 語 言 => 設 計 程 式 設 計 你 想 要 的 功 能 的 程 式 自 動 化 資 料 庫 計 算 模 擬 遊 戲 網 路 監 控 實 驗 輔 助 自 動

More information

<4D F736F F D D342DA57CA7DEA447B14D2DA475B57BBB50BADEB27AC3FEB14DA447B8D5C344>

<4D F736F F D D342DA57CA7DEA447B14D2DA475B57BBB50BADEB27AC3FEB14DA447B8D5C344> 1. 請 問 誰 提 出 積 體 電 路 (IC) 上 可 容 納 的 電 晶 體 數 目, 約 每 隔 24 個 月 (1975 年 更 改 為 18 個 月 ) 便 會 增 加 一 倍, 效 能 也 將 提 升 一 倍, 也 揭 示 了 資 訊 科 技 進 步 的 速 度? (A) 英 特 爾 (Intel) 公 司 創 始 人 戈 登. 摩 爾 (Gordon Moore) (B) 微 軟 (Microsoft)

More information

幻灯片 1

幻灯片 1 白 色 花 诗 集 人 民 文 学 出 版 社 1981 年 出 版 共 收 七 月 派 诗 人 阿 垅 鲁 藜 孙 钿 彭 燕 郊 方 然 冀 汸 钟 瑄 郑 思 曾 卓 杜 谷 绿 原 胡 征 芦 甸 徐 放 牛 汉 鲁 煤 化 铁 朱 健 朱 谷 怀 罗 洛 等 二 十 人 的 诗 作 一 百 十 九 首 集 名 出 自 阿 垅 未 入 选 的 一 首 诗 中 要 开 作 一 枝 白 色 花

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: [email protected] 49 [P.51] C/C++ [P.52] [P.53] [P.55] (int) [P.57] (float/double) [P.58] printf scanf [P.59] [P.61] ( / ) [P.62] (char) [P.65] : +-*/% [P.67] : = [P.68] : ,

More information

Microsoft PowerPoint - plan06.ppt

Microsoft PowerPoint - plan06.ppt 程 序 设 计 语 言 原 理 Principle of Programming Languages 裘 宗 燕 北 京 大 学 数 学 学 院 2012.2~2012.6 6. 基 本 控 制 抽 象 子 程 序 抽 象 子 程 序 活 动 和 局 部 环 境 静 态 实 现 模 型 一 般 实 现 模 型 调 用 序 列 和 在 线 展 开 参 数 机 制 泛 型 子 程 序 异 常 处 理 其

More information

z x / +/- < >< >< >< >< > 3 b10x b10x 0~9,a~f,A~F, 0~9,a~f,A~F, x,x,z,z,?,_ x,x,z,z,?,_ h H 0~9,_ 0~9,_ d D 0~7,x,X,z,Z

z x / +/- < >< >< >< >< > 3 b10x b10x 0~9,a~f,A~F, 0~9,a~f,A~F, x,x,z,z,?,_ x,x,z,z,?,_ h H 0~9,_ 0~9,_ d D 0~7,x,X,z,Z Verilog Verilog HDL HDL Verilog Verilog 1. 1. 1.1 1.1 TAB TAB VerilogHDL VerilogHDL C 1.2 1.2 C // // /* /* /* /* SYNOPSY SYNOPSY Design Compiler Design Compiler // //synopsys synopsys /* /*synopsys synopsys

More information

2 34 2 41 2 39 37

2 34 2 41 2 39 37 2 34 2 41 2 39 37 1955 64 14 1957 4 2 1972 3 1 138 7 20 79 8 7 28 66 14 60 25 2 9 79 17 12 189 190 6 43 1 138 1 2 166 174 145 163 468 31 34 358 1118 131 132 513 514 865 58 292 37 21 1 142 232 244

More information

C/C++ - 函数

C/C++ - 函数 C/C++ Table of contents 1. 2. 3. & 4. 5. 1 2 3 # include # define SIZE 50 int main ( void ) { float list [ SIZE ]; readlist (list, SIZE ); sort (list, SIZE ); average (list, SIZE ); bargragh

More information

CH01.indd

CH01.indd 3D ios Android Windows 10 App Apple icloud Google Wi-Fi 4G 1 ( 3D ) 2 3 4 5 CPU / / 2 6 App UNIX OS X Windows Linux (ios Android Windows 8/8.1/10 BlackBerry OS) 7 ( ZigBee UWB) (IEEE 802.11/a/b/g/n/ad/ac

More information

(\244j\257d\276\307\274\351_201508021-C.indd_70%.pdf)

(\244j\257d\276\307\274\351_201508021-C.indd_70%.pdf) 1847-1852 1872 20 1 1896 8000 20 1896 1950 1 1896 1896 13 1900 1900 3 20 2 4 1910 1950 3 1911 1 2 3 4 1927 4 20 300 6 1906 1930 7 1911 5 1919 8 1914 9 1920 10 11 1902 200 6 12 1930 7 " # #! $! 14 15! "!

More information

四川省普通高等学校

四川省普通高等学校 四 川 省 普 通 高 等 学 校 计 算 机 应 用 知 识 和 能 力 等 级 考 试 考 试 大 纲 (2013 年 试 行 版 ) 四 川 省 教 育 厅 计 算 机 等 级 考 试 中 心 2013 年 1 月 目 录 一 级 考 试 大 纲 1 二 级 考 试 大 纲 6 程 序 设 计 公 共 基 础 知 识 6 BASIC 语 言 程 序 设 计 (Visual Basic) 9

More information

Computer Architecture

Computer Architecture ECE 3120 Computer Systems Assembly Programming Manjeera Jeedigunta http://blogs.cae.tntech.edu/msjeedigun21 Email: [email protected] Tel: 931-372-6181, Prescott Hall 120 Prev: Basic computer concepts

More information

,,,, (,, - ;, ;, ;, ;, ;,, - ;, - ) (,, ~ ),,,, (, ),,,, ( ), () () ( ),,,,,,,.,, :.,. (,, ) : ( ), ;( ), ;( ) ;( ), :.,. %(,, ),,,,, (,, - ) :( ) ( )

,,,, (,, - ;, ;, ;, ;, ;,, - ;, - ) (,, ~ ),,,, (, ),,,, ( ), () () ( ),,,,,,,.,, :.,. (,, ) : ( ), ;( ), ;( ) ;( ), :.,. %(,, ),,,,, (,, - ) :( ) ( ) * 张 文 宏 阮 丹 青 内 容 提 要 : 本 文 运 用 年 天 津 城 乡 居 民 社 会 网 的 问 卷 调 查 资 料, 对 市 民 和 农 民 的 社 会 支 持 网 进 行 了 比 较 研 究 我 们 的 研 究 发 现 :( ) 亲 属 在 城 乡 居 民 的 财 务 支 持 网 中 发 挥 着 非 常 重 要 的 作 用 ( ) 亲 属 在 精 神 支 持 网 中 的 作 用 也

More information

## $%& %& ## () #) (( * (+++ () #) #) (+ (+ #) #) ( #, - #)). #))- # ( / / / 0 1 2 0 / $ # ( *. 3. 3 *..# 4 #$ 3 ( 5 ) ### 4 $ # 5, $ ## # 4 $# 5 ( %

## $%& %& ## () #) (( * (+++ () #) #) (+ (+ #) #) ( #, - #)). #))- # ( / / / 0 1 2 0 / $ # ( *. 3. 3 *..# 4 #$ 3 ( 5 ) ### 4 $ # 5, $ ## # 4 $# 5 ( % # # $ %& $ %# ( $ # ( # $ ( $ $ ( ( % ( $ ( $ ( ( % ( % $ ( $ ( ( $ ( ( ( & ( ( ( $ ( ( % %# ( ( $ ( %# % ## $%& %& ## () #) (( * (+++ () #) #) (+ (+ #) #) ( #, - #)). #))- # ( / / / 0 1 2 0 / $ # ( *.

More information

C/C++ - 字符输入输出和字符确认

C/C++ - 字符输入输出和字符确认 C/C++ Table of contents 1. 2. getchar() putchar() 3. (Buffer) 4. 5. 6. 7. 8. 1 2 3 1 // pseudo code 2 read a character 3 while there is more input 4 increment character count 5 if a line has been read,

More information

Microsoft PowerPoint - 07 派生数据类型

Microsoft PowerPoint - 07 派生数据类型 能源与动力工程学院 目录 派生类型 陈 斌 固有数据类型 数值型 (numerical) 整型 INTEGER 实型 REAL 复数型 COMPLEX 非数值型 字符型 CHARACTER 逻辑型 ( 布尔型 )LOGICAL 自定义数据类型 ( 派生类型, derived type) 派生类型是指用户利用 Fortran 系统内部类型, 如整型 实型 复数型 逻辑型 字符型等的组合自行创建出一个新的数据类型,

More information

2 2 3 DLight CPU I/O DLight Oracle Solaris (DTrace) C/C++ Solaris DLight DTrace DLight DLight DLight C C++ Fortran CPU I/O DLight AM

2 2 3 DLight CPU I/O DLight Oracle Solaris (DTrace) C/C++ Solaris DLight DTrace DLight DLight DLight C C++ Fortran CPU I/O DLight AM Oracle Solaris Studio 12.2 DLight 2010 9 2 2 3 DLight 3 3 6 13 CPU 16 18 21 I/O DLight Oracle Solaris (DTrace) C/C++ Solaris DLight DTrace DLight DLight DLight C C++ Fortran CPU I/O DLight AMP Apache MySQL

More information

Ps22Pdf

Ps22Pdf 990 1995 ( ),,,,,,, ( ) ( ) ;, ;,, ( ),, 2000 7 1 ( 1 ) ( 4 ) ( 6 ) ( 15 ) ( 21 ) ( 33 ) ( 36 ) ( 43 ) ( 53 ) ( 60 ) ( 65 ) ( 74 ) ( 84 ) ( 87 ) ( 92 ) ( 97 ) (100) (111) (116) (119) (122) (127) (138)

More information

C/C++程序设计 - 字符串与格式化输入/输出

C/C++程序设计 - 字符串与格式化输入/输出 C/C++ / Table of contents 1. 2. 3. 4. 1 i # include # include // density of human body : 1. 04 e3 kg / m ^3 # define DENSITY 1. 04 e3 int main ( void ) { float weight, volume ; int

More information

投影片 1

投影片 1 真 善 美 幼 兒 園 102 學 年 度 第 二 學 期 小 廚 師 阿 諾 @ 活 動 日 期 :2/12~4/11 @ 活 動 班 級 : 獅 子 班 @ 製 作 編 輯 : 徐 淑 芬 *. *. 主 題 目 標. *. * 一. 能 分 享 自 己 長 大 的 志 願 二. 認 識 食 物 金 字 塔 以 及 食 物 的 營 養 三. 透 過 戶 外 教 學 到 傳 統 市 場 挑 選 新

More information

2006年国家公务员招录考试行测真题(A)

2006年国家公务员招录考试行测真题(A) 2006 年 中 央 国 家 机 关 公 务 员 录 用 考 试 行 政 职 业 能 力 测 验 (A) 真 题 说 明 这 项 测 验 共 有 五 个 部 分,135 道 题, 总 时 限 为 120 分 钟 各 部 分 不 分 别 计 时, 但 都 给 出 了 参 考 时 限, 供 你 参 考 以 分 配 时 间 请 在 机 读 答 题 卡 上 严 格 按 照 要 求 填 写 好 自 己 的 姓

More information

新版 明解C言語入門編

新版 明解C言語入門編 328, 4, 110, 189, 103, 11... 318. 274 6 ; 10 ; 5? 48 & & 228! 61!= 42 ^= 66 _ 82 /= 66 /* 3 / 19 ~ 164 OR 53 OR 164 = 66 ( ) 115 ( ) 31 ^ OR 164 [] 89, 241 [] 324 + + 4, 19, 241 + + 22 ++ 67 ++ 73 += 66

More information

Microsoft Word - 103鐵路佐級-國文(二)

Microsoft Word - 103鐵路佐級-國文(二) 103 年 特 種 考 試 交 通 事 業 鐵 路 人 員 考 試 試 題 等 別 : 佐 級 鐵 路 人 員 考 試 類 科 : 事 務 管 理 機 械 工 程 機 檢 工 程 電 力 工 程 電 子 工 程 養 路 工 程 科 目 : 國 文 ( 包 括 公 文 格 式 用 語 ) 一 單 一 選 擇 題 : 下 列 成 語, 沒 有 錯 別 字 的 選 項 是 : 手 屈 一 指 載 罪 立

More information

学 习 贯 彻 中 央 尧 省 尧 市 纪 委 全 会 精 神 专 栏 中 国 共 产 党 第 十 八 届 中 央 纪 律 检 查 委 员 会 第 六 次 全 体 会 议 公 报 渊 2016 年 1 月 14 日 中 国 共 产 党 第 十 八 届 中 央 纪 律 检 查 委 员 会 第 六 次

学 习 贯 彻 中 央 尧 省 尧 市 纪 委 全 会 精 神 专 栏 中 国 共 产 党 第 十 八 届 中 央 纪 律 检 查 委 员 会 第 六 次 全 体 会 议 公 报 渊 2016 年 1 月 14 日 中 国 共 产 党 第 十 八 届 中 央 纪 律 检 查 委 员 会 第 六 次 内 部 资 料 注 意 保 存 渊 第 三 期 冤 中 共 六 盘 水 市 委 讲 师 团 编 2016 年 3 月 15 日 学 习 贯 彻 中 央 尧 省 尧 市 纪 委 全 会 精 神 专 辑 音 学 习 贯 彻 中 央 尧 省 尧 市 纪 委 全 会 精 神 专 栏 淫 中 国 共 产 党 第 十 八 届 中 央 纪 律 检 查 委 员 会 第 六 次 全 体 会 议 公 报 渊 2 冤 淫

More information

Microsoft Word - 临政办发12.doc

Microsoft Word - 临政办发12.doc 临 沂 市 人 民 政 府 办 公 室 文 件 临 政 办 发 2016 12 号 临 沂 市 人 民 政 府 办 公 室 关 于 印 发 临 沂 市 乡 村 教 师 支 持 计 划 (2015-2020 年 ) 实 施 细 则 的 通 知 各 县 区 人 民 政 府, 市 政 府 各 部 门 各 直 属 机 构, 临 沂 高 新 技 术 产 业 开 发 区 管 委 会, 临 沂 经 济 技 术 开

More information

中共山东省委高校工委

中共山东省委高校工委 关 于 印 发 中 共 山 东 省 委 高 校 工 委 2016 年 工 作 要 点 的 通 知 青 岛 淄 博 威 海 日 照 滨 州 市 委 高 校 工 委, 各 高 等 学 校 党 委 : 现 将 中 共 山 东 省 委 高 校 工 委 2016 年 工 作 要 点 印 发 你 们, 请 认 真 学 习 领 会, 抓 好 贯 彻 落 实 中 共 山 东 省 委 高 校 工 委 2016 年 1

More information

目 录 第 一 部 分 国 家 知 识 产 权 局 概 况 一 主 要 职 能 二 部 门 预 算 单 位 构 成 第 二 部 分 国 家 知 识 产 权 局 2016 年 部 门 预 算 表 一 财 政 拨 款 收 支 总 表 二 一 般 公 共 预 算 支 出 表 三 一 般 公 共 预 算 基

目 录 第 一 部 分 国 家 知 识 产 权 局 概 况 一 主 要 职 能 二 部 门 预 算 单 位 构 成 第 二 部 分 国 家 知 识 产 权 局 2016 年 部 门 预 算 表 一 财 政 拨 款 收 支 总 表 二 一 般 公 共 预 算 支 出 表 三 一 般 公 共 预 算 基 国 家 知 识 产 权 局 2016 年 部 门 预 算 目 录 第 一 部 分 国 家 知 识 产 权 局 概 况 一 主 要 职 能 二 部 门 预 算 单 位 构 成 第 二 部 分 国 家 知 识 产 权 局 2016 年 部 门 预 算 表 一 财 政 拨 款 收 支 总 表 二 一 般 公 共 预 算 支 出 表 三 一 般 公 共 预 算 基 本 支 出 表 四 一 般 公 共 预 算

More information

科学技术部2013年度部门预算

科学技术部2013年度部门预算 1 目 录 第 一 部 分 中 国 侨 联 概 况 一 主 要 职 能 二 部 门 预 算 单 位 构 成 第 二 部 分 中 国 侨 联 2016 年 部 门 预 算 表 一 财 政 拨 款 收 支 总 表 二 一 般 公 共 预 算 支 出 表 三 一 般 公 共 预 算 基 本 支 出 表 四 一 般 公 共 预 算 三 公 经 费 支 出 表 五 政 府 性 基 金 预 算 支 出 表 六

More information

一、二○○二年学校工作的简要回顾

一、二○○二年学校工作的简要回顾 北 华 校 字 [2016]13 号 北 华 大 学 2016 年 硕 士 研 究 生 招 生 复 试 录 取 工 作 办 法 为 做 好 我 校 2016 年 硕 士 研 究 生 招 生 复 试 录 取 工 作, 规 范 招 生 工 作 程 序, 加 强 招 生 制 度 建 设, 根 据 教 育 部 关 于 印 发 的

More information

Microsoft Word - 白俄罗斯公司法汉语译文2015年7月15日修改版.docx

Microsoft Word - 白俄罗斯公司法汉语译文2015年7月15日修改版.docx 白 俄 罗 斯 共 和 国 公 司 法 条 目 第 一 章 总 则 第 1 条 关 于 公 司 的 基 本 规 定 第 2 条 白 俄 罗 斯 共 和 国 关 于 公 司 的 立 法 第 3 条 本 法 的 适 用 范 围 第 4 条 公 司 的 名 称 和 住 所 第 5 条 公 司 的 责 任 第 6 条 公 司 的 代 表 处 和 分 公 司 第 7 条 子 公 司 第 8 条 附 属 公 司

More information

第 一 部 分 中 国 气 象 局 职 责 及 概 况 一 主 要 职 责 ( 一 ) 拟 定 气 象 工 作 的 方 针 政 策 法 律 法 规 发 展 战 略 和 长 远 规 划 ; 制 定 发 布 气 象 工 作 的 规 章 制 度 技 术 标 准 和 规 范 并 监 督 实 施 ; 承 担

第 一 部 分 中 国 气 象 局 职 责 及 概 况 一 主 要 职 责 ( 一 ) 拟 定 气 象 工 作 的 方 针 政 策 法 律 法 规 发 展 战 略 和 长 远 规 划 ; 制 定 发 布 气 象 工 作 的 规 章 制 度 技 术 标 准 和 规 范 并 监 督 实 施 ; 承 担 中 国 气 象 局 2016 年 部 门 预 算 目 录 第 一 部 分 中 国 气 象 局 职 责 及 概 况 一 主 要 职 责 二 机 构 设 置 第 二 部 分 中 国 气 象 局 2016 年 部 门 预 算 表 一 财 政 拨 款 收 支 总 表 二 一 般 公 共 预 算 支 出 表 三 一 般 公 共 预 算 基 本 支 出 表 四 一 般 公 共 预 算 三 公 经 费 支 出 表

More information

无 锡 职 业 技 术 学 院 国 有 资 产 管 理 办 法 第 一 章 总 则 第 一 条 为 加 强 学 校 国 有 资 产 管 理, 合 理 配 置 和 有 效 使 用 国 有 资 产, 确 保 国 有 资 产 安 全 与 完 整, 保 障 和 促 进 学 校 各 项 事 业 发 展, 根

无 锡 职 业 技 术 学 院 国 有 资 产 管 理 办 法 第 一 章 总 则 第 一 条 为 加 强 学 校 国 有 资 产 管 理, 合 理 配 置 和 有 效 使 用 国 有 资 产, 确 保 国 有 资 产 安 全 与 完 整, 保 障 和 促 进 学 校 各 项 事 业 发 展, 根 无 锡 职 业 技 术 学 院 文 件 锡 职 院 资 2016 2 号 关 于 印 发 无 锡 职 业 技 术 学 院 国 有 资 产 管 理 办 法 的 通 知 各 部 门 各 院 部 : 现 将 无 锡 职 业 技 术 学 院 国 有 资 产 管 理 办 法 印 发 给 你 们, 请 遵 照 执 行 无 锡 职 业 技 术 学 院 2016 年 3 月 28 日 - 1 - 无 锡 职 业 技

More information

南 昌 大 学 人 力 资 源 工 作 简 讯 2015 年 第 2 期 ( 总 第 27 期 ) 目 录 1 人 力 资 源 综 合 信 息 2 人 员 调 配 及 机 构 编 制 管 理 信 息 3 劳 资 工 作 信 息 4 师 资 管 理 信 息 5 高 层 次 人 才 及 队 伍 建 设

南 昌 大 学 人 力 资 源 工 作 简 讯 2015 年 第 2 期 ( 总 第 27 期 ) 目 录 1 人 力 资 源 综 合 信 息 2 人 员 调 配 及 机 构 编 制 管 理 信 息 3 劳 资 工 作 信 息 4 师 资 管 理 信 息 5 高 层 次 人 才 及 队 伍 建 设 人 力 资 源 工 作 简 讯 2015 年 第 2 期 ( 总 第 27 期 ) 南 昌 大 学 人 事 处 2015 年 7 月 南 昌 大 学 人 力 资 源 工 作 简 讯 2015 年 第 2 期 ( 总 第 27 期 ) 目 录 1 人 力 资 源 综 合 信 息 2 人 员 调 配 及 机 构 编 制 管 理 信 息 3 劳 资 工 作 信 息 4 师 资 管 理 信 息 5 高 层

More information

三亚市政府投资建设项目代建制管理工作介绍

三亚市政府投资建设项目代建制管理工作介绍 三 亚 市 发 展 和 改 革 委 员 会 2015 年 9 月 一 代 建 制 的 定 义 二 代 建 范 围 规 定 三 代 建 单 位 入 库 资 格 及 要 求 四 代 建 单 位 的 职 责 七 代 建 单 位 管 理 费 拨 付 和 计 算 五 代 建 项 目 组 织 实 施 程 序 六 资 金 管 理 与 监 督 八 项 目 前 期 费 用 及 工 程 款 拨 付 九 代 建 项 目

More information

目 录 一 部 门 职 责... 1 二 预 算 编 报 范 围... 3 三 2013 年 部 门 预 算 报 表 及 情 况 说 明... 5 收 支 预 算 总 表 及 情 况 说 明... 5 收 入 预 算 表 及 情 况 说 明... 7 支 出 预 算 表 及 情 况 说 明... 1

目 录 一 部 门 职 责... 1 二 预 算 编 报 范 围... 3 三 2013 年 部 门 预 算 报 表 及 情 况 说 明... 5 收 支 预 算 总 表 及 情 况 说 明... 5 收 入 预 算 表 及 情 况 说 明... 7 支 出 预 算 表 及 情 况 说 明... 1 教 育 部 2013 年 部 门 预 算 二 〇 一 三 年 四 月 十 八 日 目 录 一 部 门 职 责... 1 二 预 算 编 报 范 围... 3 三 2013 年 部 门 预 算 报 表 及 情 况 说 明... 5 收 支 预 算 总 表 及 情 况 说 明... 5 收 入 预 算 表 及 情 况 说 明... 7 支 出 预 算 表 及 情 况 说 明... 11 财 政 拨 款

More information

目 录 引 言... 3 第 一 部 分 电 价 水 平 基 本 情 况...4 一 上 网 电 价...4 二 输 配 电 价...6 三 销 售 电 价...9 四 政 府 性 基 金 和 附 加...12 第 二 部 分 电 价 政 策 执 行 情 况...13 一 电 价 水 平 调 整 情

目 录 引 言... 3 第 一 部 分 电 价 水 平 基 本 情 况...4 一 上 网 电 价...4 二 输 配 电 价...6 三 销 售 电 价...9 四 政 府 性 基 金 和 附 加...12 第 二 部 分 电 价 政 策 执 行 情 况...13 一 电 价 水 平 调 整 情 2008 年 度 电 价 执 行 情 况 监 管 报 告 国 家 电 力 监 管 委 员 会 二 九 年 十 月 目 录 引 言... 3 第 一 部 分 电 价 水 平 基 本 情 况...4 一 上 网 电 价...4 二 输 配 电 价...6 三 销 售 电 价...9 四 政 府 性 基 金 和 附 加...12 第 二 部 分 电 价 政 策 执 行 情 况...13 一 电 价 水 平

More information

西安邮电学院本科教学工作简报

西安邮电学院本科教学工作简报 西 安 邮 电 学 院 本 科 教 学 工 作 简 报 (2011 年 第 一 期 ) 西 安 邮 电 学 院 教 务 处 2011 年 7 月 本 期 要 目 教 学 新 闻 王 曙 燕 教 授 荣 获 陕 西 省 教 学 名 师 称 号 2010 2011 年 中 央 财 政 专 项 资 金 项 目 使 用 及 申 报 情 况 人 民 邮 电 出 版 社 西 安 邮 电 学 院 教 材 出 版

More information

( 十 ) 其 他 会 计 工 作 第 四 条 单 位 不 得 任 用 ( 聘 用 ) 不 具 备 会 计 从 业 资 格 的 人 员 从 事 会 计 工 作 不 具 备 会 计 从 业 资 格 的 人 员, 不 得 从 事 会 计 工 作, 不 得 参 加 会 计 专 业 技 术 资 格 考 试

( 十 ) 其 他 会 计 工 作 第 四 条 单 位 不 得 任 用 ( 聘 用 ) 不 具 备 会 计 从 业 资 格 的 人 员 从 事 会 计 工 作 不 具 备 会 计 从 业 资 格 的 人 员, 不 得 从 事 会 计 工 作, 不 得 参 加 会 计 专 业 技 术 资 格 考 试 会 计 从 业 资 格 管 理 办 法 (2012 年 12 月 6 日 中 华 人 民 共 和 国 财 政 部 令 第 73 号 公 布 根 据 2016 年 5 月 11 日 财 政 部 关 于 修 改 < 会 计 从 业 资 格 管 理 办 法 > 的 决 定 修 改 ) 第 一 章 总 则 第 一 条 为 了 加 强 会 计 从 业 资 格 管 理, 规 范 会 计 人 员 行 为, 根 据

More information

<C1ACD6DDCAD0CAD0B3A1BCE0B6BDB9DCC0EDBED6C8A8D4F0C7E5B5A5A3A8B9ABCABEA3A92E786C73>

<C1ACD6DDCAD0CAD0B3A1BCE0B6BDB9DCC0EDBED6C8A8D4F0C7E5B5A5A3A8B9ABCABEA3A92E786C73> 机 构 编 制 委 员 会 办 公 室 编 2016 年 2 月 29 日 类 别 数 量 合 计 拟 调 整 后 保 留 拟 调 整 小 计 取 消 下 放 转 移 提 请 或 调 整 事 项 行 政 许 可 9 9 1 行 政 处 罚 951 951 行 政 强 制 37 37 行 政 征 收 4 4 行 政 给 付 0 0 行 政 检 查 47 47 行 政 确 认 1 1 行 政 裁 决 1

More information

Microsoft Word - Future CEDAW C CHN 7-8.doc

Microsoft Word - Future CEDAW C CHN 7-8.doc 序 言 1. 根 据 消 除 对 妇 女 一 切 形 式 歧 视 公 约 ( 简 称 公 约 ) 第 十 八 条 第 一 款 规 定, 中 华 人 民 共 和 国 向 联 合 国 秘 书 长 提 交 执 行 公 约 第 7 8 次 合 并 报 告 本 报 告 的 撰 写 遵 循 了 消 除 对 妇 女 歧 视 委 员 会 ( 简 称 消 歧 委 员 会 ) 关 于 缔 约 国 定 期 报 告 的 指

More information

本 科 生 手 册 中 南 大 学 学 生 工 作 委 员 会 秘 书 处 编 印 二 〇 一 四 年 八 月 社 会 主 义 核 心 价 值 观 富 强 民 主 文 明 和 谐 自 由 平 等 公 正 法 治 爱 国 敬 业 诚 信 友 善 校 徽 : 校 训 : 校 风 : 知 行 合 一 经 世 致 用 向 善 求 真 唯 美 有 容 目 录 一 法 律 法 规 与 上 级 制 度 1 中

More information

2014 年 12 月 16 日 广 西 春 茂 投 资 股 份 有 限 公 司 ( 原 名 广 西 汽 牛 农 业 机 械 股 份 有 限 公 司, 以 下 简 称 春 茂 股 份 挂 牌 公 司 公 司 ) 召 开 2014 年 第 五 次 临 时 股 东 大 会, 通 过 向 特 定 对 象

2014 年 12 月 16 日 广 西 春 茂 投 资 股 份 有 限 公 司 ( 原 名 广 西 汽 牛 农 业 机 械 股 份 有 限 公 司, 以 下 简 称 春 茂 股 份 挂 牌 公 司 公 司 ) 召 开 2014 年 第 五 次 临 时 股 东 大 会, 通 过 向 特 定 对 象 国 海 证 券 股 份 有 限 公 司 关 于 广 西 春 茂 投 资 股 份 有 限 公 司 重 大 资 产 重 组 之 2015 年 持 续 督 导 报 告 独 立 财 务 顾 问 : 签 署 日 期 : 二 〇 一 六 年 五 月 2014 年 12 月 16 日 广 西 春 茂 投 资 股 份 有 限 公 司 ( 原 名 广 西 汽 牛 农 业 机 械 股 份 有 限 公 司, 以 下 简

More information

Microsoft Word - 面向合格投资者公开发行公司债券上市预审核反馈意见公告(截至2015年10月8日)

Microsoft Word - 面向合格投资者公开发行公司债券上市预审核反馈意见公告(截至2015年10月8日) 面 向 合 格 投 资 者 公 开 发 行 公 司 债 券 上 市 预 审 核 反 馈 意 见 公 告 ( 截 至 2015 年 10 月 8 日 ) 日 前, 上 海 证 券 交 易 所 召 开 了 公 司 债 券 预 审 核 反 馈 会 会 议 讨 论 了 公 司 债 券 预 审 核 中 关 注 的 主 要 问 题, 形 成 了 书 面 反 馈 意 见 现 将 反 馈 意 见 公 告 如 下 :

More information

律 师 执 业 必 须 以 事 实 为 根 据, 以 法 律 为 准 绳 律 师 执 业 应 当 接 受 国 家 社 会 和 当 事 人 的 监 督 律 师 依 法 执 业 受 法 律 保 护, 任 何 组 织 和 个 人 不 得 侵 害 律 师 的 合 法 权 益 第 四 条 司 法 行 政 部

律 师 执 业 必 须 以 事 实 为 根 据, 以 法 律 为 准 绳 律 师 执 业 应 当 接 受 国 家 社 会 和 当 事 人 的 监 督 律 师 依 法 执 业 受 法 律 保 护, 任 何 组 织 和 个 人 不 得 侵 害 律 师 的 合 法 权 益 第 四 条 司 法 行 政 部 中 华 人 民 共 和 国 律 师 法 (2012 修 正 ) (1996 年 5 月 15 日 第 八 届 全 国 人 民 代 表 大 会 常 务 委 员 会 第 十 九 次 会 议 通 过 根 据 2001 年 12 月 29 日 第 九 届 全 国 人 民 代 表 大 会 常 务 委 员 会 第 二 十 五 次 会 议 关 于 修 改 中 华 人 民 共 和 国 律 师 法 的 决 定 第 一

More information

(Microsoft Word - \270t\270g\254\354\305\252\270g\274\372\300y\255p\271\2722012-2013.docx)

(Microsoft Word - \270t\270g\254\354\305\252\270g\274\372\300y\255p\271\2722012-2013.docx) 學 校 名 稱 : 學 生 姓 名 : 李 建 衡 級 別 : 五 信 (2012-2013) 詩 篇 一 一 九 篇 (9 至 16 節 ) 教 導 年 輕 人 要 全 心 全 意 遵 從 神 的 話 語 和 不 要 偏 離 神 的 命 令 這 幾 節 詩 歌 教 導 我 要 喜 愛 神 的 法 度 和 律 例, 還 要 思 索 神 的 品 格 和 緊 記 祂 的 話 語 詩 篇 一 一 九 篇

More information

自 觉 实 践 科 学 发 展 观, 扎 实 推 进 管 理 服 务 工 作 四 川 大 学 档 案 馆 ( 校 史 办 公 室 )2007 年 上 半 年 工 作 总 结 2007 年 上 半 年, 四 川 大 学 档 案 馆 ( 校 史 办 公 室 ) 在 学 校 党 委 行 政 领 导 和 上

自 觉 实 践 科 学 发 展 观, 扎 实 推 进 管 理 服 务 工 作 四 川 大 学 档 案 馆 ( 校 史 办 公 室 )2007 年 上 半 年 工 作 总 结 2007 年 上 半 年, 四 川 大 学 档 案 馆 ( 校 史 办 公 室 ) 在 学 校 党 委 行 政 领 导 和 上 四 川 大 学 档 案 管 理 与 校 史 工 作 简 报 2007 年 2 期 ( 总 第 2 期 ) 本 期 要 目 四 川 大 学 档 案 馆 ( 校 史 办 公 室 )2007 年 上 半 年 工 作 总 结 四 川 大 学 各 单 位 档 案 工 作 分 管 领 导 和 兼 职 档 案 管 理 员 名 单 2007 年 四 川 大 学 兼 职 档 案 管 理 员 业 务 培 训 会 议 圆

More information

2014

2014 目 录 第 一 部 分 国 家 知 识 产 权 局 基 本 情 况 一 主 要 职 能 二 部 门 决 算 单 位 构 成 第 二 部 分 国 家 知 识 产 权 局 2014 年 部 门 决 算 表 一 收 入 支 出 决 算 总 表 二 收 入 决 算 表 三 支 出 决 算 表 四 财 政 拨 款 收 入 支 出 决 算 总 表 五 一 般 公 共 预 算 财 政 拨 款 支 出 决 算 表

More information

第 一 部 分 广 州 市 广 播 电 视 大 学 概 况 一 学 校 的 主 要 任 务 和 业 务 范 围 根 据 市 编 委 的 批 复, 广 州 市 广 播 电 视 大 学 为 市 局 级 事 业 单 位, 归 口 市 教 育 局 管 理 主 要 承 担 以 下 任 务 : ( 一 ) 承

第 一 部 分 广 州 市 广 播 电 视 大 学 概 况 一 学 校 的 主 要 任 务 和 业 务 范 围 根 据 市 编 委 的 批 复, 广 州 市 广 播 电 视 大 学 为 市 局 级 事 业 单 位, 归 口 市 教 育 局 管 理 主 要 承 担 以 下 任 务 : ( 一 ) 承 广 州 市 广 播 电 视 大 学 2014 年 部 门 预 算 目 录 第 一 部 分 广 州 市 广 播 电 视 大 学 概 况 一 学 校 的 主 要 任 务 和 业 务 范 围 二 部 门 预 算 单 位 构 成 三 学 校 人 员 构 成 第 二 部 分 2014 年 部 门 预 算 安 排 情 况 说 明 第 三 部 分 2014 年 部 门 预 算 表 一 收 支 预 算 总 表 (

More information

Microsoft Word - 关于印发《云南保险业高级管理人员任职资格考试办法》的通知

Microsoft Word - 关于印发《云南保险业高级管理人员任职资格考试办法》的通知 中 国 保 监 会 云 南 监 管 局 文 件 云 保 监 发 2014 71 号 关 于 印 发 云 南 保 险 业 高 级 管 理 人 员 任 职 资 格 考 试 办 法 的 通 知 各 保 险 机 构 云 南 省 分 公 司, 各 保 险 专 业 中 介 机 构 : 根 据 中 国 保 监 会 监 督 管 理 委 员 会 规 范 性 文 件 制 定 管 理 办 法 ( 保 监 发 2013 101

More information

2013 2013 2

2013 2013 2 2013 1 2013 2013 2 3 4 36 2013 37 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 5 2013 94,464.84 89,873.01 6,896.66 344.49 94,809.33 96,769.67 1,960.34

More information

一 前 言 2 作 為 我 國 儒 家 經 典 及 十 三 經 之 一, 孟 子 流 傳 千 年 不 輟, 足 以 證 明 其 對 中 華 文 化 的 重 要 性 與 影 響 力, 除 了 道 德 文 化 意 識 的 開 發, 也 弘 揚 仁 政 王 道 的 政 治 觀, 大 多 數 人 都 肯 定

一 前 言 2 作 為 我 國 儒 家 經 典 及 十 三 經 之 一, 孟 子 流 傳 千 年 不 輟, 足 以 證 明 其 對 中 華 文 化 的 重 要 性 與 影 響 力, 除 了 道 德 文 化 意 識 的 開 發, 也 弘 揚 仁 政 王 道 的 政 治 觀, 大 多 數 人 都 肯 定 當 經 典 遇 上 經 典 - 孟 子 與 火 鳳 燎 原 之 非 人 也 * 江 穰 峰 提 要 作 為 我 國 儒 家 經 典 及 十 三 經 之 一, 孟 子 流 傳 千 年 不 輟, 深 化 了 孔 子 思 想, 而 自 古 以 來, 許 多 學 者 嘗 試 對 孟 子 一 書 給 予 正 確 的 本 意 詮 釋 抑 或 提 出 符 合 當 代 的 新 說, 諸 家 注 疏 輩 出, 孟 子

More information

附件3

附件3 自 治 区 住 房 城 乡 建 设 厅 行 政 执 法 公 示 事 项 总 表 序 号 执 法 权 分 类 执 法 权 名 称 1 行 政 许 可 ( 权 限 ) 建 设 工 程 施 工 企 业 勘 察 单 位 设 计 单 位 和 工 程 监 理 单 位 工 程 质 量 检 测 单 位 资 质 证 书 核 发 ( 建 设 工 程 施 工 企 业 施 工 总 承 包 资 质 序 列 二 级 资 质 及

More information

关 于 建 立 失 联 ( 异 常 ) 私 募 机 构 公 示 制 度 的 通 知... 169 私 募 基 金 登 记 备 案 相 关 问 题 解 答... 170 2

关 于 建 立 失 联 ( 异 常 ) 私 募 机 构 公 示 制 度 的 通 知... 169 私 募 基 金 登 记 备 案 相 关 问 题 解 答... 170 2 一 国 家 法 律... 1 中 华 人 民 共 和 国 证 券 投 资 基 金 法 (2015 年 修 正 )... 2 二 证 监 会 部 门 规 章... 37 第 105 号 令 私 募 投 资 基 金 监 督 管 理 暂 行 办 法... 38 三 协 会 自 律 规 则... 47 私 募 投 资 基 金 管 理 人 登 记 和 基 金 备 案 办 法 ( 试 行 )... 48 私 募

More information