明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2950|回复: 6

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

[复制链接]
发表于 2003-12-15 23:21:00 | 显示全部楼层 |阅读模式
使用 ReDim 语句为动态数组变量分配和重分配存储空间前, 必须使用 Dim 或 ReDim 来指定数组中元素的数目,但这个确定的“数目”又会时下一次运行程序时上一次运行程序时已改变的元素数不能保留,请问,如何把上一次用ReDim 语句改变的数组数目保留到下一次程序运行中?
发表于 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 函数”。关于对象数组,请参阅“用对象编程”。
 楼主| 发表于 2003-12-15 23:38:00 | 显示全部楼层
十分感谢 myfreemind老师的解答!请看下面的语句,其中若无第一行语句,运行时则提示“下标越界(错误 9)”,但若有此行,则在本次程序运行时通过第三行语句改变的数组中元素的数目在下一次程序运行时又被第一行语句改回来而不能保留,请问如何解决?
   ReDim Preserve TransformerDataArray(5, 0)
    ArrayUpperBound = UBound(TransformerDataArray, 2)
    ReDim Preserve TransformerDataArray(5, ArrayUpperBound + 1)
发表于 2003-12-16 11:47:00 | 显示全部楼层
你的真正意思是什么?
按你的思路应该是过程执行一遍完之后,数组的大小和值保存起来。第二次运行这个过程时,数组取出上一次保存时的状态。
如果是这样的话,还是使用其它方式来保存数据吧,比如将其保存在数据库中。如果定义一个全局的数组变量也可以,不过ReDim Preserve TransformerDataArray(5, 0)这一句在第二次时就不能再调用了。
 楼主| 发表于 2003-12-16 12:13:00 | 显示全部楼层
十分感谢 efan2000老师的解答!我正是这个意思。能请您再具体一点吗?
发表于 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
 楼主| 发表于 2003-12-23 20:51:00 | 显示全部楼层
十分感谢天涯孤客老师的解答!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-28 10:59 , Processed in 0.186430 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表