⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vb程式设计内功讲座.htm

📁 VB设计内功讲座
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<br>
物 件 与 变 数 最 大 的 差 异 如 图 -1:<br>
<br>
图 -1 变 数 与 物 件 的 比 较<br>
<br>
比 较 特 别 的 是 物 件 的「具 体 物 件」部 分 , 当 我 们 宣 告 某一 物 件 变 数 时 (例 如 Dim X As Object), 具 体 物 件 还 不 存 在 ,直 到 执 行 建 立 物 件 的 叙 述 之 後 , 物 件 才 会 含 有 具 体 物 件 (详 阅 上 一 期 VB 专 栏 )。<br>
<br>
若 撇 开 具 体 物 件 的 部 分 , 物 件 与 变 数 在 记 忆 体 的 使 用上 是 完 全 相 同 的 , 所 以 我 们 可 以 把 重 心 放 在 具 体 物 件 上面 , 具 体 物 件 所 占 用 的 记 忆 体 通 常 会 跟 物 件 变 数 一 起 被归 还 给 系 统 , 例 如 :<br>
<br>
Sub SubX()<br>
    Dim X As Object<br>
    Set X = New 物 件 类 别 名<br>
<br>
    …<br>
End Sub<br>
<br>
则 程 式 执 行 到 End Sub 时 , X 所 占 用 的 记 忆 体 会 被 释 放 ,而 属 於 X 的 具 体 物 件 也 会 一 并 被 释 放 。<br>
<br>
但 并 非 每 一 种 物 件 的 具 体 物 件 都 具 有 以 上 特 性 , 有 些物 件 的 作 法 是 , 如 果 程 式 要 释 放 具 体 物 件 , 一 定 要 呼 叫释 放 物 件 的 方 法 , 如 果 程 式 忘 了 这 麽 做 , 则 即 使 程 式 结束 执 行 了 , 该 具 体 物 件 依 然 会 占 据 系 统 记 忆 体 , 还 好 的是 此 类 物 件 并 不 多 见 , 笔 者 提 出 此 一 状 况 , 只 是 想 提 醒您 一 点 , 当 我 们 使 用 某 一 种 新 的 物 件 的 , 须 查 阅 该 物 件的 说 明 文 件 以 了 解 
该 物 件 是 否 为 此 类 物 件 。<br>
<br>
变 数 与 参 数传 递<br>
<br>
当 我 们 将 一 个 大 程 式 分 成 多 个 模 组 或 程 序 之 後 , 为 了让 不 同 程 序 之 间 能 够 共 享 资 料 , 除 了 全 域 变 数 的 使 用 之外 , 另 一 个 方 法 则 是 程 序 呼 叫 时 的 参 数 传 递 。 诚 如 我 们前 面 在「选 择 变 数 类 型 的 基 本 原 则」段 落 中 的 说 明 , 全 域变 数 少 用 为 宜 , 因 此 参 数 的 传 递 在 程 式 设 计 中 就 益 形 重要 。<br>
<br>
在 VB 里 面 , 程 序 之 间 的 参 数 传 递 有 两 种 方 式 :「传 值 呼叫」(call by value)及「传 址 呼 叫」(call by address), 这 两 种 参 数传 递 方 式 在 表 面 上 很 容 易 让 人 忽 略 其 差 异 性 , 但 实 际 上却 会 影 响 程 式 执 行 的 结 果 , 以 下 先 以 一 个 例 子 来 说 明 这个 问 题 , 假 设 有 一 副 程 式 定 义 如 下 :<br>
<br>
Sub AddOne( x )<br>
    x = x + 1<br>
End Sub<br>
<br>
而 以 下 是 两 种 不 同 的 呼 叫 方 式 :<br>
<br>
i = 10<br>
Call AddOne( i )<br>
Print i i = 10<br>
Call AddOne( (i) )<br>
Print i<br>
<br>
结 果 呼 叫「Call AddOne(i)」之 後 , 所 得 到 的 i 值 等 於 11, 而呼 叫「Call AddOne( (i) )」之 後 , 所 得 到 的 i 值 却 等 於 10。<br>
<br>
注 : 在 以 上 的 呼 叫 格 式 中 , 往 往 会 省 略 Call 保 留 字 , 如果 省 略 Call 保 留 字 , 则「Call AddOne(i)」要 写 成「AddOne i」 (去掉 参 数 周 围 的 左 右 括 弧 ), 而「Call AddOne( (i) )」则 写 成「AddOne (i)」。<br>
<br>
上 述 例 子 会 有 不 同 的 输 出 结 果 , 是 因 为 参 数 传 递 方 式有 所 不 同 的 关 系 , 以 下 让 笔 者 来 解 说 上 述 两 种 参 数 传 递的 差 异 及 工 作 原 理 。<br>
<br>
实 际 参 数 与 形 式 参 数<br>
<br>
当 我 们 定 义 副 程 式 时 , 例 如 前 面 的 Sub AddOne( x ), 由 於我 们 并 不 知 道 将 来 呼 叫 者 会 传 入 哪 些 资 料 作 为 参 数 , 因此 只 好 给 这 个 参 数 取 一 个 暂 时 性 的 名 称 , 例 如 x, 而 将 来副 程 式 被 呼 叫 时 它 们 会 被 真 正 的 资 料 (常 数 值 或 变 数 )所取 代 , 所 以 这 些 参 数 都 只 是 形 式 上 的 , 故 称 之 为「形 式 参数」(formal parameter)。<br>
<br>
而 呼 叫 程 式 端 在 呼 叫 副 程 式 时 , 必 须 以 实 际 的 资 料 来替 代 形 式 上 的 参 数 , 使 得 副 程 式 能 够 拿 到 真 正 的 资 料 来运 算 , 这 真 正 的 资 料 就 叫 做「实 际 参 数」(actual parameter),例 如 Call AddOne( i ) 中 的 i。<br>
<br>
所 谓 参 数 传 递 的 方 式 , 就 是 在 呼 叫 副 程 式 的 过 程 中 ,编 译 器 (或 解 译 器 )如 何 以 实 际 参 数 来 替 代 形 式 参 数 的 方法 , 而 方 法 不 同 , 得 到 的 结 果 也 可 能 不 同 , 解 说 参 数 的传 递 方 式 以 前 , 让 我 们 先 以「变 数 的 四 个 组 成 元 素」来 表示 实 际 参 数 及 形 式 参 数 的 关 系 , 就 拿 前 面 程 式 为 例 吧 :<br>
<br>
图 -2 所 谓 传 递 参 数 , 传 的 到 底 是 名 称 、 资 料 型别 、 位 址 、 还 是 值 呢 ?<br>
<br>
就 图 -2来 看 , 变 数 有 四 个 元 素 , 所 谓 传 递 参 数 , 传 的到 底 是 名 称 、 资 料 型 别 、 位 址 、 还 是 值 呢 ?<br>
<br>
其 实 除 了 传 递「资 料 型 别」无 法 达 到 传 递 参 数 的 目 的 之外 , 其 他 叁 个 元 素 都 可 以 作 为 参 数 传 递 的 标 的 物 , 不 过 VB 并 不 支 援 传 递「名 称」的 方 式 , 以 下 笔 者 就 针 对 传 「值」及传「位 址」两 种 方 式 来 加 以 解 说 。<br>
<br>
传 值 呼 叫<br>
<br>
这 种 传 递 参 数 的 方 式 , 是 把 呼 叫 者 的 实 际 参 数 值 , 复制 一 份 到 副 程 式 的 形 式 参 数 位 址 内 , 尔 後 副 程 式 不 管 怎麽 对 形 式 参 数 进 行 运 算 , 完 全 不 会 对 实 际 参 数 的 变 数 值有 所 影 响 。<br>
<br>
图 -3 传 值 呼 叫<br>
<br>
以 前 面 的 例 子 来 说 , 呼 叫 程 式 端 在 实 际 参 数 的 前 後 加上 (), 例 如「Call AddOne( (i) )」, 其 传 递 方 式 就 是传 值 呼 叫 , 所 以 以 下 的 呼 叫 :<br>
<br>
i = 10<br>
Call AddOne( (i) )<br>
Print i<br>
<br>
变 数 i 的 值 不 会 因 执 行 了 AddOne() 而 被 改 变 , 因 此 输 出结 果 等 於 10。<br>
<br>
传 位 址 呼 叫<br>
<br>
所 谓 传 值 呼 叫 , 我 们 可 以 把 它 想 成「以 实 际 参 数 的 值 取代 形 式 参 数 的 值」, 而 传 位 址 呼 叫 则 是「以 实 际 参 数 的 位址 取 代 形 式 参 数 的 位 址」, 示 意 图 如 图 -4:<br>
<br>
图 -4传 址 呼 叫<br>
<br>
从 图 -4来 看 , 我 们 可 以 把 传 位 址 呼 叫 中 的 实 际 参 数 与形 式 参 数 想 成「同 一 个 变 数」(名 称 虽 不 同 , 但 实 际 所 占 用的 是 同 一 块 记 忆 体 )。<br>
<br>
以 前 面 的 例 子 来 说 , Call AddOne( i ) 由 於 未 在 变 数 i 的 前後 再 加 上 (), 被 视 为 传 位 址 呼 叫 , 因 此 呼 叫 之 後 的 i 值 将因 为 形 式 参 数 x(与 i 为 同 一 变 数 )的 改 变 而 跟 着 改 变 , 所以 以 下 的 叙 述 :<br>
<br>
i = 10<br>
Call AddOne( i )<br>
Print i<br>
<br>
i 的 输 出 结 果 等 於 11。<br>
<br>
ByVal 保 留 字 与 传 值 呼叫<br>
<br>
在 呼 叫 程 式 端 , 利 用 左 右 括 弧 将 参 数 框 起 来 , 可 使 参数 传 递 成 为 传 值 呼 叫 , 此 外 , 我 们 也 可 以 在 副 程 式 (函 数 )定 义 端 , 利 用 ByVal 保 留 字 将 参 数 传 递 设 定 成 传 值 呼 叫 ,例 如 副 程 式 定 义 如 下 :<br>
<br>
Sub AddOne( ByVal x )<br>
    x = x + 1<br>
End Sub<br>
<br>
则 不 管「Call AddOne( (i) )」或 是「Call AddOne( i )」均 被 视 为 传值 呼 叫 。<br>
<br>
传 值 呼 叫 的 限 制<br>
<br>
在 VB 里 面 ,「阵 列」的 传 递 是 不 可 以 采 用 传 值 呼 叫 的 ,例 如 以 下 的 呼 叫 会 产 生 错 误 :<br>
<br>
' SubX 副 程 式 的 定 义<br>
Sub SubX( data() As Integer ) ' data() 代 表 一 阵 列 参 数<br>
    …<br>
End Sub<br>
<br>
' 呼 叫 SubX 副 程 式<br>
Dim X(100) As Integer<br>
Call SubX( X ) ' 采 传 址 呼 叫 , 正 确<br>
Call SubX( (X) ) ' 采 传 值 呼 叫 , VB 不 接 受<br>
<br>
传 递 阵 列 时 , VB 之 所 以 不 接 受 传 值 呼 叫 的 理 由 是 , 传值 呼 叫 必 须「复 制」整 个 阵 列 , 这 对 於 大 型 阵 列 (例 如 含 有 30000 个 阵 列 元 素 ), 是 一 件 比 较 不 符 合 效 率 的 事 情 , 反 之, 若 采 用 传 址 呼 叫 , 以 上 面 的 程 式 为 例 , 只 要 将 X 阵 列的 位 址 设 定 给 data 参 数 即 可 , 而 不 必 大 量 复 制 阵 列 的 资料 。<br>
<br>
传 址 呼 叫 的 限 制<br>
<br>
就 像 传 值 呼 叫 有 其 限 制 一 样 , 传 址 呼 叫 也 有 其 限 制 。传 址 呼 叫 的 限 制 是「不 同 资 料 型 别 的 实 际 参 数 不 可 作 为 传递 的 参 数」, 例 如 :<br>
<br>
' SubX 副 程 式 的 定 义<br>
Sub SubX( I As Integer ) ' 参 数 宣 告 成 Integer<br>
    …<br>
End Sub<br>
<br>
' 呼 叫 SubX 副 程 式<br>
Dim L As Long<br>
Call SubX( L ) ' 采 传 址 呼 叫<br>
<br>
为 什 麽 不 接 受 呢 ? 请 参 考 图 -5:<br>
<br>
图 -5 传 址 呼 叫 不 接 受 不 同 型 别 的 资 料 传 递<br>
<br>
假 设「Call SubX( L )」是 正 确 的 , 那 麽 将 会 造 成 :「Integer 型 别 的 变 数 I, 其 位 址 却 指 向 一 块 型 别 为 Long 的 记 忆体」, 这 显 然 违 反 了 程 式 运 作 的 原 则 , 所 以 会 产 生 错 误 。<br>
<br>
不 过 , 如 果 我 们 在 副 程 式 定 义 端 , 将 形 式 参 数 宣 告 成 Variant(不 定 型 )或 者 不 宣 告 资 料 型 别 , 则 该 参 数 可 以 接 受任 何 型 别 的 资 料 , 因 为 Variant 的 资 料 型 别 (及 不 定 型 型 别 )可 随 着 资 料 来 改 变 , 如 图 -6:<br>
<br>
图 -6 传 址 呼 叫 不 接 受 不 同 型 别 的 资 料 传 递<br>
<br>
<br>
VB 程 式 设 计 内 功 讲 座 (叁) - 王 国 荣<br>
<br>
除 错 — 增 加 内 功 必 经 之 道<br>
<br>
--------------------------------------------------------------------------------<br>
几 乎 所 有 角 色 扮 演 的 电 动 都 有 一 个 共 通 的特 点 , 那 就 是 主 角 一 开 始 都 很 弱 , 但 随 着 打 败 的 敌 人 越来 越 多 , 主 角 的 功 力 也 会 越 来 越 强 , 程 式 设 计 的 道 理 也是 相 同 的 , 再 多 的 理 论 都 比 不 上 动 手 去 写 程 式 , 而 写 程式 所 面 临 的 主 要 敌 人 就 是 bug, 同 样 的 随 着 除 过 的 bug 越 来越 多 , 程 式 设 计 者 的 功 力 也 会 越 来 越 强 。<br>
<br>
Bug 是 什 麽 ? 有 一 句 名 言 最 能 诠 释 bug 的 意 义 :「电 脑 是按 照 指 令 行 事 , 而 不 是 人 的 意 志」, 当 人 将 其 意 志 转 化 成指 令 下 给 电 脑 之 後 , 而 电 脑 执 行 的 结 果 与 人 的 意 志 不 符时 , 便 是 bug。<br>
<br>
怎 样 下 指 令 给 电 脑 呢 ? 若 是 一 般 的 使 用 者 , 使 用 的 是作 业 系 统 所 提 供 的 指 令 (例 如 copy 指 令 )或 应 用 程 式 所 提 供的 操 作 介 面 (当 使 用 者 操 作 应 用 程 式 时 , 应 用 程 式 即 已 代替 使 用 者 下 指 令 给 电 脑 了 )。<br>
<br>
然 而 对 程 式 设 计 人 员 而 言 , 下 指 令 给 电 脑 的 过 程 就 比较 复 杂 了 , 首 先 必 须 选 取 适 当 的 程 式 语 言 , 然 後 将 自 己期 望 电 脑 做 的 事 情 表 示 成 程 式 语 言 , 接 着 再 利 用 程 式 开发 工 具 编 译 成 执 行 档 , 最 後 才 经 由 作 业 系 统 所 提 供 的 指令 载 入 执 行 档 , 由 电 脑 开 始 执 行 , 理 论 上 , 以 上 的 每 一个 过 程 都 可 能 发 生 错 误 , 例 如 程 式 语 言 选 错 了 、 程 式 写错 了 、 编 译 器 有 bug 
而 编 译 出 错 误 的 执 行 档 、 作 业 系 统 有 bug… , 想 一 想 还 真 可 怕 , 到 处 都 可 能 有 bug, 这 也 莫 怪 有人 要 说「软 体 是 高 风 险 的 事 业」。<br>
<br>
不 过 本 文 所 讨 论 的 范 围 仅 局 限 於「程 式 写 错」的 部 分 ,首 先 我 们 只 能 假 设 编 译 器 是 没 有 错 的 , 作 业 系 统 是 没 有错 的 , 这 就 好 像 我 们 搭 飞 机 以 前 必 须 假 设 飞 机 是 不 会 出事 的 一 样 , 如 果 您 十 分 在 乎 飞 机 、 编 译 器 、 作 业 系 统 的极 少 数 出 错 情 况 , 那 麽 笔 者 只 能 说 , 别 搭 飞 机 , 也 别 当个 程 式 设 计 人 员 。<br>
<br>
有 句 话 说 :「人 非 圣 贤 , 孰 能 无 过」, 而 笔 者 想 说 的 是「程式 设 计 无 圣 贤」, 从 开 始 写 第 一 行 程 式 就 不 会 出 错 , 笔 者未 曾 听 过 啊 ! 知 错 能 改 , 乃 程 式 设 计 之 根 本 大 法 也 。 记得 以 前 在 学 校 的 时 候 , 老 师 总 喜 欢 讲「知 错 能 改 , 善 莫 大焉」, 当 老 师 者 焉 知 数 学 题 作 错 了 , 就 是 不 懂 啊 ! 不 懂 者又 如 何 知 错 , 又 如 何 能 改 呢 ? 对 程 式 设 计 来 说 , 道 理 也是 相 同 的 
,「知 错 能 改」说 得 简 单 , 做 起 来 却 十 分 困 难 ,笔 者 写 了 十 几 年 的 程 式 , 还 是 必 须 面 临 bug 上 身 的 问 题 ,不 过 也 正 因 为 如 此 , 本 期 要 与 您 谈 一 谈 除 错 的 方 法 !<br>
<br>
肉 眼 除 错 法<br>
<br>
肉 眼 除 错 指 的 是 将 程 式 印 出 来 或 是 盯 着 萤 幕 一 行 一 行检 查 , 这 听 起 来 有 点 不 太 入 流 , 主 要 的 缺 点 是 这 个 方 法的 除 错 效 率 不 高 , 尤 其 对 於 自 己 写 的 程 式 , 总 认 为 程 式「应该」按 照 自 己 的 意 思 执 行 , 而 没 有 看 出 程 式「实 际 上」是 怎麽 执 行 的 。<br>
<br>
肉 眼 所 观 察 出 来 的 错 误 , 通 常 都 还 不 是 十 分 肯 定 , 因此 接 下 来 是 修 改 程 式 、 编 译 、 联 结 、 测 试 , 然 後 才 能 确定 是 否 找 到 了 错 误 , 如 果 肉 眼 除 错 一 直 无 法 找 出 错 误 ,那 麽「侦 错 、 修 改 程 式 、 编 译 、 联 结 、 测 试」等 动 作 就 得一 再 重 来 , 非 常 浪 费 时 间 。<br>
<br>
肉 眼 除 错 与 程 式 设 计 人 员 对 程 式 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -