8
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]'行是错误的,但我认为我已经读过这应该删除数组单元格。

删除数组单元格的正确方法是什么?它取决于对象类型吗?(字符串 vs 数字 vs 对象)

或者

可以操纵 UpperBound 值使其工作吗?

即在删除第 3 项之后,我希望 UpperBound 或 arraylength 为 2,因为这在逻辑上是正确的。

4

4 回答 4

9

对于可变大小的数组,当您为数组赋值时,会为其分配内存。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 个元素分配内存大小。

于 2010-03-29T12:15:51.303 回答
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
于 2010-03-29T11:40:55.397 回答
2

当我为 Dan 的回答写评论时,我开始思考我使用的是什么,因为我不喜欢 PFC 的列表。我使用的是一个 DataStore,如果你以正确的方式思考它,它就像一个类固醇列表。

于 2010-03-30T13:24:43.757 回答
0

而不是复制数组,如果您需要跟踪数组的变化上限(例如,如果您尝试将其用作堆栈之类的东西),为什么不只保留一个单独的整数变量来指示最后一个实数元素的索引?似乎比上面建议的复制解决方案更简单、更有效!

于 2010-03-30T11:39:12.617 回答