乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 94|回复: 6

请问,如何把上一次用ReDim 语句改变的数组数目保留到下一次程序运行中?

[复制链接]

15

主题

37

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
97
发表于 2003-12-15 23:21:00 | 显示全部楼层 |阅读模式
使用 ReDim 语句为动态数组变量分配和重分配存储空间前, 必须使用 Dim 或 ReDim 来指定数组中元素的数目,但这个确定的“数目”又会时下一次运行程序时上一次运行程序时已改变的元素数不能保留,请问,如何把上一次用ReDim 语句改变的数组数目保留到下一次程序运行中?
回复

使用道具 举报

41

主题

657

帖子

9

银币

中流砥柱

Rank: 25

铜币
821
发表于 2003-12-15 23:24:00 | 显示全部楼层
保留动态数组的内容
每次执行 ReDim 语句时,当前存储在数组中的值都会全部丢失。Visual Basi 重新将数组元素的值置为 Empty(对 Variant 数组)、置为 0(对 Numeric 数组)、置为 零长度字符串(对 String 数组)或者置为 Nothing(对于对象的数组)。
在为新数据准备数组,或者要缩减数组大小以节省内存时,这样做是非常有用的。有时希望改变数组大小又不丢失数组中的数据。使用具有 Preserve 关键字的 ReDim 语句就可做到这点。例如,使用 UBound 函数引用上界,使数组扩大、增加一个元素,而现有元素的值并未丢失:
ReDim Preserve DynArray (UBound (DynArray) + 1)
在用 Preserve 关键字时,只能改变多维数组中最后一维的上界;如果改变了其它维或最后一维的下界,那么运行时就会出错。所以可这样编程:
ReDim Preserve Matrix (10, UBound (Matrix, 2) + 1)
而不可这样编程:
ReDim Preserve Matrix (UBound (Matrix, 1) + 1, 10)
详细信息 关于动态数组的更详细信息,请参阅语言参考中的“ReDim 函数”。关于对象数组,请参阅“用对象编程”。
回复

使用道具 举报

15

主题

37

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
97
发表于 2003-12-15 23:38:00 | 显示全部楼层
十分感谢 myfreemind老师的解答!请看下面的语句,其中若无第一行语句,运行时则提示“下标越界(错误 9)”,但若有此行,则在本次程序运行时通过第三行语句改变的数组中元素的数目在下一次程序运行时又被第一行语句改回来而不能保留,请问如何解决?
   ReDim Preserve TransformerDataArray(5, 0)
    ArrayUpperBound = UBound(TransformerDataArray, 2)
    ReDim Preserve TransformerDataArray(5, ArrayUpperBound + 1)
回复

使用道具 举报

26

主题

589

帖子

10

银币

中流砥柱

Rank: 25

铜币
693
发表于 2003-12-16 11:47:00 | 显示全部楼层
你的真正意思是什么?
按你的思路应该是过程执行一遍完之后,数组的大小和值保存起来。第二次运行这个过程时,数组取出上一次保存时的状态。
如果是这样的话,还是使用其它方式来保存数据吧,比如将其保存在数据库中。如果定义一个全局的数组变量也可以,不过ReDim Preserve TransformerDataArray(5, 0)这一句在第二次时就不能再调用了。
回复

使用道具 举报

15

主题

37

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
97
发表于 2003-12-16 12:13:00 | 显示全部楼层
十分感谢 efan2000老师的解答!我正是这个意思。能请您再具体一点吗?
回复

使用道具 举报

26

主题

589

帖子

10

银币

中流砥柱

Rank: 25

铜币
693
发表于 2003-12-16 12:47:00 | 显示全部楼层
1、定义一个全局变量或者模块变量TransformerDataArray,注意不能在过程中定义,否则会重定义而不能保存数值。
2、第一次调用ArrayUpperBound = UBound(TransformerDataArray, 2)时会发生错误,因为此时动态数组还未重定义,不能取得它的大小。故使用On Error Resume Next来检测错误,发生错误时重定义数组。
  1. Option Explicit
  2. Private TransformerDataArray() As Integer
  3. Sub test()
  4.     Dim ArrayUpperBound As Integer
  5.     On Error Resume Next
  6.     ArrayUpperBound = UBound(TransformerDataArray, 2)
  7.     If Err Then
  8.         Err.Clear
  9.         ReDim Preserve TransformerDataArray(5, 0)
  10.     End If
  11.     ReDim Preserve TransformerDataArray(5, ArrayUpperBound + 1)
  12.     MsgBox UBound(TransformerDataArray, 2)
  13. End Sub
回复

使用道具 举报

15

主题

37

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
97
发表于 2003-12-23 20:51:00 | 显示全部楼层
十分感谢天涯孤客老师的解答!
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-15 07:39 , Processed in 0.350355 second(s), 66 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表