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

Ich denke, die Zeile 'Array [3]' ist falsch, aber ich denke, ich habe gelesen, dass dies die Array-Zelle entfernen sollte.Powerbuilder Dynamic Array Manipulation

Was wäre der richtige Weg, um eine Array-Zelle zu entfernen? Kommt es auf den Objekttyp an? (String vs Anzahl vs Object)

Oder

Kann man den Wert Upperbound manipulieren, damit es funktioniert?

, d. H. Nach dem Entfernen von Punkt 3 möchte ich, dass die UpperBound oder Arraylänge 2 ist, da dies logisch korrekt ist.

+1

Übrigens liefert LowerBound immer 1 mit einem Array variabler Größe. LowerBound wird verwendet, wenn Sie ein Array wie 'string foo [-7 TO 34]' deklarieren. LowerBound gibt -7 für dieses Array zurück. –

Antwort

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. Sie können jedoch den Trick mit einem anderen dynamischen Array ausführen.

string array2[] 
int i 

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

array = array2 

Dann Upperbound (array []) wird um 1

Dies funktioniert für Upperbound (array []) verringert werden - 1> 2, weil Powerbuilder zuordnet durch Standardspeichergröße für 3 Elemente, wenn a dynamisches Array ist deklariert.

+0

Seufz, ich dachte, ich müsste sowas machen. Danke gd047 – glasnt

3

Powerbuilder hat nicht wirklich gute Array-Manipulationsfunktionen eingebaut (die ich kenne).

Sie können erreichen, was Sie versuchen, indem Sie die Werte, die Sie behalten möchten, in ein neues ungebundenes Array kopieren.

Zum Beispiel

int i 
string array3[] = {'Item 1', 'Item 2', 'Item 3'}, array2[] 

for i = 1 to 2 
    array2[i] = array3[i] 
next 
UpperBound(array2[]) // = 2 

In Ihrem Beispiel nur den letzten Wert entfernen möchte - dies noch einfacher durch das Kopieren des gesamten Array in ein neuen, kleiner, wie so begrenzt Array durchgeführt werden kann:

string array3[] = {'Item 1', 'Item 2', 'Item 3'}, array2[2] 

array2 = array3 
UpperBound(array2[]) // = 2 
0

Anstatt das Array zu kopieren, wenn Sie eine sich ändernde obere Grenze des Arrays verfolgen müssen (zum Beispiel, wenn Sie versuchen, es wie einen Stapel zu verwenden), behalten Sie einfach eine separate Integer-Variable Gibt den Index des letzten realen Elements an? Scheint viel einfacher und effizienter als die oben vorgeschlagenen Kopierlösungen!

+0

Hauptgrund: Es ist ein weiterer Ort, um einen Fehler zu machen. Um sich selbst zu schützen, wickeln Sie das Array in ein Objekt und schon bald haben Sie eine Liste implementiert. In einer Sprache wie Java mit allen Arten von Unterstützung für Listen, können Sie sehr gut eine Art ArrayList wählen. Der PFC hat Listenunterstützung, aber ich hatte immer das Gefühl, die Implementierung sei klobig und ich habe sie nie benutzt. –

+0

Auch wegen des Umfangs des Arrays zwischen meinen Fenstern und Benutzerobjekten, ist es einfacher zu versuchen, 1 Element im Bereich zu behalten, dann muss man sich um eine separate Variable kümmern, die eine Ableitung der ersten ist. – glasnt

2

Als ich einen Kommentar für Dans Antwort schrieb, begann ich darüber nachzudenken, was ich benutze, da ich PFCs Listen nicht mag. Was ich benutze, ist ein DataStore, der, wenn Sie darüber nachdenken, der richtige Weg ist, wie eine Liste von Steroiden.