Powerbuilder 动态数组操作
-
22-09-2019 - |
题
string array[]
long lBound, uBound
lBound = LowerBound(array[]) // = 1, empty array value
uBound = UpperBound(array[]) // = 0, empty array value
array[1] = 'Item 1'
array[2] = 'Item 2'
array[3] = 'Item 3'
lBound = LowerBound(array[]) // = 1
uBound = UpperBound(array[]) // = 3
array[3] = '' //removing item 3
lBound = LowerBound(array[]) // = 1, still
uBound = UpperBound(array[]) // = 3, still (but array[3] is nulled?
我认为“array[3]”行是错误的,但我想我已经读到这应该删除数组单元格。
删除数组单元格的正确方法是什么?它取决于对象类型吗?(字符串、数字、对象)
或者
可以操纵 UpperBound 值使其发挥作用吗?
IE。删除第 3 项后,我希望 UpperBound 或数组长度为 2,因为这在逻辑上是正确的。
解决方案
对于可变大小数组,当您为其赋值时,就会为该数组分配内存。UpperBound 返回当前脚本中为数组定义的最大值. 。但是,您可以使用另一个动态数组来实现这一点。
string array2[]
int i
for i = 1 to UpperBound(array[]) - 1
array2[i] = array[i]
next
array = array2
那么 UpperBound(array[]) 将减 1。
这适用于 UpperBound(array[]) - 1 > 2,因为在声明动态数组时,powerbuilder 默认为 3 个元素分配内存大小。
其他提示
Powerbuilder中并没有真正有内置在任何好的阵列操作函数(即我知道的)。
您可以实现你试图通过复制要保留到一个新的无界数组中的值做。
例如
int i
string array3[] = {'Item 1', 'Item 2', 'Item 3'}, array2[]
for i = 1 to 2
array2[i] = array3[i]
next
UpperBound(array2[]) // = 2
:简单地通过整个阵列复制到新的更小,有限阵列像这样这样更能做到 - 在您的例子只卸下最新值
string array3[] = {'Item 1', 'Item 2', 'Item 3'}, array2[2]
array2 = array3
UpperBound(array2[]) // = 2
当我在写丹的回答评论我开始思考我做什么用的,因为我不喜欢PFC的名单。我用的是数据存储,其中,如果你认为它正确的方式,就像是对类固醇的列表。
而不是复制阵列,如果需要跟踪的改变的上限的阵列(例如,如果你想使用它作为类似的叠层),为什么不保持一个单独的整数变量,指示最后一个真正的元素的索引?似乎很多比上述建议的解决方案复制更简单,更高效!
不隶属于 StackOverflow