2010-03-29 71 views
7
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? 

我認爲行'數組[3]'是錯誤的,但我想我已經讀過這應該刪除數組單元格。Powerbuilder Dynamic Array Manipulation

什麼是刪除數組單元格的正確方法?它取決於對象類型嗎? (字符串VS號碼VS對象)

或者

一個可以操縱的上界值,使其工作?

即刪除項目3後,我希望UpperBound或arraylength爲2,因爲這在邏輯上是正確的。

+1

順便說一句,LowerBound將總是返回1與一個可變大小的數組。當你聲明一個像'string foo [-7 TO 34]'這樣的數組時,使用LowerBound。 LowerBound返回-7這個數組。 – 2010-03-29 16:59:01

回答

8

For variable-size arrays, memory is allocated for the array when you assign values to it. UpperBound returns the largest value that has been defined for the array in the current script。但是,您可以使用另一個動態數組來完成這個技巧。

string array2[] 
int i 

for i = 1 to UpperBound(array[]) - 1 
    array2[i] = array[i] 
next 

array = array2 

然後UPPERBOUND(陣列[])將被加1。

這種減小將用於UPPERBOUND(陣列[])的工作 - 1> 2,因爲powerbuilder的3個元素分配默認存儲器大小時動態數組被聲明。

+0

感嘆,我想我必須做這樣的事情。謝謝gd047 – glasnt 2010-03-29 21:28:04

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 
0

如果您需要跟蹤數組的變化上限(例如,如果您嘗試將它用作堆棧之類的東西),那麼不要複製數組,而是爲了不保留單獨的整數變量表明最後一個真實元素的索引?看起來比上面提到的複製解決方案簡單得多,效率更高!

+0

主要原因:這是另一個犯錯的地方。所以爲了保護你自己,你將數組包裝在一個對象中,很快你實現了一個列表。在像Java這樣的支持列表的各種類型的語言中,你很可能會選擇像ArrayList這樣的東西。 PFC有列表支持,但我一直覺得執行很笨重,我從來沒有使用它。 – 2010-03-30 13:15:35

+0

也因爲我的窗口和用戶對象之間的數組的範圍,它更容易試圖保持1範圍內的項目,然後不必擔心一個單獨的變量,這是第一個的衍生物。 – glasnt 2010-03-30 21:46:23

2

當我爲Dan的回答寫評論時,我開始考慮我的用途,因爲我不喜歡PFC的列表。我使用的是一個DataStore,如果您以正確的方式思考它,就像是一個類固醇列表。