44.asp

来自「ASPWeb数据库范例总览」· ASP 代码 · 共 702 行 · 第 1/2 页

ASP
702
字号
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
   <TITLE>变 数 与 参 数 的 传 递 </TITLE>
   <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=big5">
   <META NAME="Generator" CONTENT="Microsoft Word 97">
   <META NAME="GENERATOR" CONTENT="Mozilla/3.01Gold (Win95; I) [Netscape]">
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000EE" VLINK="#551A8B" ALINK="#FF0000">

<P>VB 程 式 设 计 内 功 讲 座 (二 )</P>

<P>  </P>

<P><FONT COLOR="#0000FF"><FONT SIZE=+3>变 数 (物 件)在 程 式 中 的 活 动
模 式</FONT></FONT></P>

<P>有 时 候 觉 得 写 程 式 的 工 作 跟 侦 探 差 不 多 , 因 为 在 程 式
的 开 发 过 程 中 , 总 免 不 了 會 有 bug 发 生 , 而 程 式 设 计 者 的
责 任 就 是 把 制 造 bug 的 元 凶 找 出 来 。 别 以 为 当 个 侦 探 很 好
玩 , 除 了 必 须 绞 尽 脑 汁 找 出 问 题 之 外 , 还 要 做 到 勿 枉 勿
纵 , 如 果 程 式 是 一 组 人 开 发 出 来 的 , 有 问 题 的 时 候 , 每
个 人 都 不 希 望 问 题 出 在 自 己 所 写 的 程 式 中 , 身 为 一 个 组
长 , 必 须 要 有 足 够 的 能 力 判 断 可 能 是 元 凶 的 程 式 是 哪 一
个 , 然 後 要 求 组 员 进 行 检 测 , 以 求 正 确 地 找 出 问 题 的 原
因 , 否 则 没 有 问 题 的 程 式 检 测 了 半 天 , 不 仅 劳 民 伤 财 ,
还 會 延 误 程 式 开 发 的 商 机 。 </P>

<P>程 式 错 误 的 原 因 很 多 , 但 根 本 道 理 却 在 资 料 (变 数 或 物
件 )上 面 。 我 们 可 以 把 程 式 简 单 地 分 成「程 式 码」(code)及 「资
料」(data)两 部 分 , 虽 然 两 者 都 可 能 是 造 成 错 误 的 原 因 , 但
程 式 码 的 部 分 在 执 行 阶 段 是 死 的 , 比 较 容 易 侦 测 , 而 资
料 的 部 分 则 會 随 著 程 式 执 行 的 状 况 来 改 变 , 是 比 较 难 掌
握 的 部 分 , 笔 者 作 个 比 喻 , 某 一 大 楼 发 生 了 窃 案 , 那 麼
侦 察 的 方 向 有 二 : (1) 检 查 保 全 系 统 是 否 有 漏 洞 : 由 於 保
全 系 统 是 固 定 的 , 所 以 比 较 容 易 检 查 , 如 果 与 程 式 作 个
比 较 , 它 像 是 程 式 码 的 部 分 , (2) 嫌 疑 犯 的 调 查 : 对 於 可
能 进 出 大 楼 的 人 员 进 行 调 查 , 但 由 於 人 的 行 为 是 自 由 的
, 所 以 这 个 部 分 的 调 查 工 作 要 比 保 全 系 统 的 检 查 来 得 困
难 , 如 果 与 程 式 作 个 比 较 , 它 像 是 资 料 的 部 分 。 </P>

<P>上 一 期 我 们 介 绍 了 变 数 的 组 成 元 素 , 藉 以 瞭 解 资 料 的
基 本 特 性 , 本 文 让 我 们 继 续 探 讨 资 料 在 程 式 中 的 活 动 模
式 , 藉 以 在 程 式 出 状 况 时 能 够 抓 出 造 成 程 式 错 误 的 元 凶
。 </P>

<P>  
<HR WIDTH="100%"><B><FONT COLOR="#0000FF"><FONT SIZE=+2>本 文 大 纲 </FONT></FONT></B></P>

<UL>
<TABLE>
<TR>
<TD WIDTH="250"><FONT COLOR="#0000FF"><FONT SIZE=+1><A HREF="#S1">变 数
的 活 动 范 围 </A></FONT></FONT></TD>

<TD><FONT COLOR="#0000FF"><FONT SIZE=+1><A HREF="#S3">变 数 与 系 统 记
忆 体 </A></FONT></FONT></TD>
</TR>

<TR>
<TD><FONT COLOR="#0000FF"><FONT SIZE=+1><A HREF="#S2">模 组 与 全 域 变
数 </A></FONT></FONT></TD>

<TD><FONT COLOR="#0000FF"><FONT SIZE=+1><A HREF="#S4">变 数 与 参 数 传
递 </A></FONT></FONT></TD>
</TR>
</TABLE>
</UL>

<P>
<HR WIDTH="100%"></P>

<P><A NAME="S1"></A><FONT COLOR="#0000FF"><FONT SIZE=+3>变 数 的 活 动
范 围 </FONT></FONT></P>

<P>  </P>

<P>记 得 有 一 种 活 动 , 是 在 湖 里 抓 鸭 子 , 别 小 看 鸭 子 笨 笨
的 , 水 中 的 鸭 子 其 实 是 很 难 抓 的 , 所 以 比 较 常 用 的 技 巧
是 将 鸭 子 赶 到 角 落 , 以 缩 小 鸭 子 的 活 动 范 围 , 最 样 子 就
比 较 容 易 抓 到 鸭 子 了 。 变 数 的 道 理 也 高 深 不 到 哪 里 去 ,
但 如 果 我 们 连 变 数 的 活 动 范 围 都 搞 不 清 楚 , 那 麼 就 别 想
抓 到 因 为 变 数 所 产 生 的 错 误 。 </P>

<P>  </P>

<P><FONT COLOR="#0000FF"><FONT SIZE=+1>区 域 变 数 </FONT></FONT></P>

<P>  </P>

<P>区 域 变 数 (local variable)顾 名 思 义 就 是 指 在 某 一 个 区 域 里
面 活 动 的 变 数 , 当 程 式 进 入 此 一 区 域 时 , 区 域 中 的 变 数
便 會 诞 生 , 但 是 当 程 式 执 行 过 此 一 区 域 时 , 变 数 即 告 消
失 , 典 型 的 例 子 是 程 序 (副 程 式 、 函 数 、 或 事 件 程 序 )中
的 变 数 , 例 如 : </P>

<P>  </P>

<DIR>
<DIR>
<P><FONT COLOR="#008000">Sub SubX()<BR>
    Dim x As Integer ' x 是 SubX 副 程 式 区 域 内 的 变 数 <BR>
    x = x + 100<BR>
    Print x ' 每 次 都 印 出 100<BR>
End Sub</FONT></P>

<P>  </P>
</DIR>
</DIR>

<P>以 上 面 这 个 SubX 副 程 式 为 例 , 每 次 呼 叫 进 入 时 , 变 数
x 才 會 诞 生 , 而 当 程 式 执 行 过 End Sub 叙 述 时 (也 就 是 程 式
结 束 此 一 区 域 的 执 行 时 ), 变 数 x 即 告 消 失 , 因 此 每 次 当
SubX 副 程 式 再 度 被 呼 叫 时 , 变 数 x 的 初 值 都 等 於 0。 </P>

<P>  </P>

<P>区 域 变 数 由 於 活 动 范 围 仅 局 限 於 某 一 程 序 , 因 此 只 要
这 个 程 序 不 是 写 得 太 大 , 变 数 的 变 化 情 形 就 很 容 易 掌 握
, 也 就 很 容 易 侦 错 了 , 这 是 程 式 设 计 中 最 常 使 用 的 变 数
类 型 。 </P>

<P>  </P>

<P><FONT COLOR="#0000FF"><FONT SIZE=+1>全 域 变 数 </FONT></FONT></P>

<P>  </P>

<P>所 谓 全 域 变 数 , 指 的 是 所 有 区 域 皆 可 使 用 的 变 数 , 也
就 是 说 不 受「程 序」范 围 所 限 制 的 变 数 。 在 VB 里 面 凡 是 撰
写 在 程 序 之 外 的 变 数 均 属 於 全 域 变 数 , 例 如 : </P>

<P>  </P>

<DIR>
<DIR>
<P><FONT COLOR="#008000">Dim x As Integer ' 全 域 变 数 , 可 供 多 个
程 序 共 用 <BR>
Sub SubX()<BR>
    … ' 可 以 使 用 变 数 x<BR>
End Sub<BR>
Sub SubY()<BR>
    … ' 也 可 以 使 用 变 数 x<BR>
End Sub</FONT></P>

<P>  </P>
</DIR>
</DIR>

<P>在 VB 里 面 , 全 域 变 数 又 可 分 成「模 组 私 用」全 域 变 数 、「模
组 公 用」全 域 变 数 、 及「专 案」全 域 变 数 , 稍 後 笔 者 會 有 更
一 进 步 的 说 明 。 </P>

<P>  </P>

<P><FONT COLOR="#0000FF"><FONT SIZE=+1>静 态 变 数 </FONT></FONT></P>

<P>  </P>

<P>所 谓 静 态 变 数 , 在 VB 里 面 是 指 利 用 Static 保 留 字 宣 告 的
区 域 变 数 , 例 如 : </P>

<P>  </P>

<DIR>
<DIR>
<P><FONT COLOR="#008000">Sub SubX()<BR>
<B>    Static</B> x As Integer ' 静 态 变 数 <BR>
    Dim y As Integer ' 区 域 变 数 <BR>
    x = x + 100<BR>
    y = y + 100<BR>
    Print x ' 印 出 值 依 序 是 100、 200、 300… <BR>
    Print y ' 每 一 次 都 是 印 出 100<BR>
End Sub</FONT></P>

<P>  </P>
</DIR>
</DIR>

<P>以 上 的 静 态 变 数 x 与 区 域 变 数 y 一 样 , 其 活 动 范 围 都 限
定 於 SubX 副 程 式 之 中 , 但 每 次 进 入 SubX 副 程 式 时 变 数 y 的
值 都 會 归 0, 而 x 则 保 有 其 原 来 之 数 值 , 所 以 SubX 副 程 式
中 的 Print x 每 次 列 印 的 数 值 都 會 累 加 100。 </P>

<P>  </P>

<P><FONT COLOR="#0000FF"><FONT SIZE=+1>选 择 变 数 类 型 的 基 本 原 则
</FONT></FONT></P>

<P>  </P>

<P>当 我 们 决 定 使 用 某 个 变 数 时 , 该 将 它 宣 告 成 区 域 、 静
态 、 还 是 全 域 变 数 呢 ? 请 参 考 以 下 的 基 本 原 则 : </P>

<P>  </P>

<P><FONT COLOR="#800000"><B><FONT SIZE=+1>1</FONT></B>.是 否 要 提 供 给
多 个 程 序 共 用 , 如 果 是 , 才 将 变 数 宣 告 成 全 域 变 数 。 </FONT></P>

<P>有 些 人 可 能 會 觉 得 将 变 数 宣 告 成 全 域 变 数 最 方 便 , 因
为 任 何 程 序 都 可 以 使 用 , 但 是 全 域 变 数 的 缺 点 是 不 容 易
侦 错 , 以 抓 鸭 子 的 活 动 为 例 , 鸭 子 的 活 动 范 围 越 大 , 就
越 难 抓 到 , 同 样 的 , 任 何 程 序 都 可 以 使 用 的 变 数 , 万 一
其 变 数 值 与 我 们 预 期 的 结 果 不 一 样 时 (这 当 然 是 bug), 就
必 须 逐 一 对 每 一 个 程 序 进 行 侦 错 , 无 形 中 增 加 了 程 式 侦
错 的 困 难 度 。 </P>

<P>  </P>

<P><FONT COLOR="#800000"><B><FONT SIZE=+1>2</FONT></B>.是 否 必 须 记 录
程 式 执 行 的 状 态 , 如 果 是 , 则 必 须 变 数 宣 告 成 静 态 变 数
, 因 为 区 域 变 数 每 次 进 入 程 序 的 值 都 會 归 </FONT>0, 所 以
无 法 一 直 纪 录 著 程 式 的 执 行 状 态 。 </P>

<P>  </P>

<P><FONT COLOR="#800000"><B><FONT SIZE=+1>3</FONT></B>. 如 果 不 属 於
情 况 </FONT><B><FONT SIZE=+1>1</FONT></B>、 <B><FONT SIZE=+1>2</FONT></B>,
则 将 变 数 宣 告 成 区 域 变 数 。 </P>

<P>  </P>

<P><FONT COLOR="#0000FF"><FONT SIZE=+1>Option Explicit</FONT>: 强 制 变
数 宣 告 </FONT></P>

<P>  </P>

<P>VB 允 许 我 们 在 不 必 事 先 宣 告 变 数 之 下 , 就 使 用 变 数 ,
例 如 : </P>

<P>  </P>

<DIR>
<P><FONT COLOR="#008000">Dim X As Integer ' 事 先 宣 告 变 数 X<BR>
Y = X + 2 ' Y变 数 未 事 先 宣 告 , 也 是 对 的 </FONT></P>

<P>  </P>
</DIR>

<P>但 这 样 的 程 式 撰 写 习 惯 却 可 能 引 起 一 些 不 容 易 侦 测 的
错 误 , 例 如 : </P>

<P>  </P>

<DIR>
<P><FONT COLOR="#008000">For i = 1 to 10<BR>
    Arr(i) = Arr<B>(j)</B>+10<BR>
Next I</FONT></P>

<P>  </P>
</DIR>

<P>以 上 程 式 中 的 Arr<B>(j)</B> 应 该 是 Arr<B>(i)</B> 才 对 , 但 由
於 VB 允 许 未 宣 告 而 直 接 使 用 变 数 , 以 致 j 被 视 为 合 法 的
变 数 , 但 j 在 回 圈 中 却 一 直 等 於 0。 </P>

<P>在 不 必 事 先 宣 告 变 数 之 下 就 使 用 变 数 , 就 好 像 变 数 随
时 随 地 都 會 冒 起 来 , 跑 到 我 们 的 程 式 中 , 而 从 以 上 的 例
子 中 , 我 们 发 现 这 种 作 法 其 实 是 有 缺 点 的 , 为 了 改 善 这
个 缺 点 , VB 提 供 给 我 们 另 一 种 选 择 , 那 就 是 在 所 有 程 序
之 外 加 上 Option Explicit 的 叙 述 , 加 上 Option Explicit 的 作 用
是 :「要 求 VB 把 未 事 先 宣 告 的 变 数 视 为 错 误」, 因 此 以 上
程 式 若 修 改 成 : </P>

<P>  </P>

<DIR>
<P><FONT COLOR="#008000">Option Explicit<BR>
Dim i As Integer ' 事 先 宣 告 i<BR>
For i = 1 to 10<BR>
    Arr(i) = Arr(j)+10<BR>
Next I</FONT></P>

<P>  </P>
</DIR>

<P>则 由 於 j 变 数 未 事 先 宣 告 , 會 被 VB 视 为 错 误 , 因 此 可
在 编 译 阶 段 提 早 被 侦 察 出 来 。 </P>

<P>  </P>

<P><A NAME="S2"></A><FONT COLOR="#0000FF"><FONT SIZE=+3>模 组 与 全 域
变 数 </FONT></FONT></P>

<P>  </P>

<P>对 VB 而 言 , 一 个 专 案 可 以 含 有 多 个 模 组 , 如 果 我 们 在
某 一 个 模 组 之 中 宣 告 了 全 域 变 数 , 那 麼 这 个 全 域 变 数 可
以 提 供 给 该 模 组 的 所 有 程 序 使 用 , 是 无 庸 置 疑 的 事 , 但
是 在 多 模 组 的 专 案 中 , 我 们 则 要 考 虑 另 一 个 问 题 : 某 一
个 模 组 的 全 域 变 数 可 以 给 其 他 模 组 使 用 吗 ? </P>

<P>  </P>

<P><FONT COLOR="#0000FF"><FONT SIZE=+1>模 组 私 用 全 域 变 数 </FONT></FONT></P>

<P>  </P>

<P>在 表 单 模 组 或 一 般 模 组 中 , 如 果 我 们 利 用 <B>Private</B>
或 <B>Dim</B> 保 留 字 来 宣 告 全 域 变 数 , 例 如 : (注 : 一 般 模
组 指 的 是 利 用 功 能 表 的「专 案 /新 增 模 组」而 加 入 於 专 案 之
中 的 模 组 , 此 类 模 组 将 来 會 以 .bas 的 副 档 名 来 储 存 )</P>

<P>  </P>

<DIR>
<P><B>Private</B> x As Integer <BR>
Sub SubX()<BR>
… <BR>
End Sub</P>

<P>  </P>
</DIR>

<P>则 此 一 变 数 为「模 组 私 用」全 域 变 数 , 也 就 是 说 , 此 一
全 域 变 数 只 有 该 模 组 的 程 序 可 以 使 用 , 其 他 模 组 则 不 可
以 使 用 。 </P>

<P>  </P>

<P><FONT COLOR="#0000FF"><FONT SIZE=+1>模 组 公 用 全 域 变 数 </FONT></FONT></P>

<P>  </P>

<P>在 表 单 模 组 中 , 如 果 我 们 利 用 <B>Public</B> 保 留 字 来 宣
告 全 域 变 数 , 例 如 : </P>

<P>  </P>

<DIR>
<P><FONT COLOR="#008000"><B>Public</B> x As Integer <BR>
Sub SubX()<BR>
… <BR>
</FONT>End Sub</P>

<P>  </P>
</DIR>

<P>则 此 一 变 数 为「模 组 公 用」全 域 变 数 , 也 就 是 说 , 此 一
全 域 变 数 也 可 以 给 其 他 模 组 使 用 。 但 请 注 意 , 使 用 的 语
法 必 须 在 变 数 之 前 冠 上 表 单 名 称 , 假 设 以 上 例 子 中 的 全
域 变 数 宣 告 在 Form1 之 中 , 则 以 下 是 Form1 模 组 中 的 程 序 与
Form2 模 组 中 的 程 序 , 在 使 用 变 数 x 上 的 差 异 : </P>

<P>  </P>

<DIR>
<DIR>
<P><FONT COLOR="#008000">' Form1 模 组 <BR>
</FONT>Sub SubX()<BR>
    x = x + 100 ' 像 平 常 使 用 变 数 的 方 法 一 样 <BR>

⌨️ 快捷键说明

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