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]」という行は間違っていると思いますが、これにより配列セルが削除されるはずだと読んだ気がします。
配列セルを削除する正しい方法は何でしょうか?オブジェクトの種類に依存するのでしょうか?(文字列 vs 数値 vs オブジェクト)
または
UpperBound 値を操作して機能させることはできますか?
つまり項目 3 を削除した後、論理的に正しいので、UpperBound または arraylength を 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のリストのようにしていないので、私が使用することを何をすべきかについて考え始めました。私は何を使用すると、あなたはそれについて正しい方法を考える場合、ステロイドのリストのようなものです、データストア、である。
むしろあなたは、上の配列のバインド変更を追跡する必要がある場合は、配列をコピーするよりも、なぜ単に示す別の整数の変数を保持していません最後の本当の要素のインデックス?上記で示唆したコピーのソリューションよりも多くは簡単でより効率的なようです!