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 に答える