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? 

Myślę, że linia 'array [3]' jest niepoprawna, ale myślę, że przeczytałem, że powinno to usunąć komórkę tablicową.Mechanizm dynamicznej manipulatora agregatora

Jaki byłby właściwy sposób na usunięcie komórki tablicowej? Czy zależy to od typu obiektu? (String vs vs Number Object)

Albo

Czy można manipulować wartość górna granica, aby to działało?

tj. Po usunięciu pozycji 3, chcę, aby górna granica, lub długość pola, wynosiła 2, ponieważ jest to logicznie poprawne.

+1

Nawiasem mówiąc, funkcja LowerBound zawsze zwróci wartość 1 z tablicą o zmiennych rozmiarach. LowerBound jest używany, gdy zadeklarujesz tablicę typu 'string foo [-7 TO 34]'. LowerBound zwraca -7 dla tej tablicy. –

Odpowiedz

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. Można jednak zrobić lewę przy użyciu innej tablicy dynamicznej.

string array2[] 
int i 

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

array = array2 

Następnie górny (tablica []), zostanie zmniejszona o 1.

ten działa na górny (tablica []) - 1> 2, ponieważ PowerBuilder rozdziela według wielkości pamięci domyślny dla 3 elementów, gdy tablica dynamiczna jest zadeklarowana.

+0

Westchnienie, myślałem, że będę musiał zrobić coś takiego. Dzięki gd047 – glasnt

3

Powerbuilder tak naprawdę nie ma wbudowanych żadnych dobrych funkcji manipulowania tablicą (o których wiem).

Możesz osiągnąć to, co próbujesz zrobić, kopiując wartości, które chcesz zachować do nowej nieograniczonej tablicy.

Na przykład

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

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

W przykładzie usuwanego tylko ostatnią wartość - można to zrobić jeszcze prościej, kopiując całą tablicę do nowego mniejszego, ograniczonego tablicy tak:

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

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

Zamiast kopiować tablicę, jeśli chcesz śledzić zmianę górnej granicy tablicy (na przykład, jeśli próbujesz użyć go jako coś w rodzaju stosu), dlaczego nie po prostu zachować oddzielną zmienną całkowitą wskazując ostatni indeks elementu rzeczywistego? Wydaje się dużo prostsze i wydajniejsze niż sugerowane powyżej rozwiązania do kopiowania!

+0

Główny powód: To jeszcze jedno miejsce, w którym popełnisz błąd. Aby się zabezpieczyć, owijamy tablicę w obiekt i niedługo zaimplementowaliśmy listę. W języku takim jak Java z wszelkiego rodzaju obsługą list bardzo dobrze możesz wybrać coś takiego jak ArrayList. PFC ma wsparcie dla list, ale zawsze czułem, że implementacja była nieporęczna i nigdy jej nie używałem. –

+0

Również ze względu na zakres tablicy między moimi oknami a obiektami użytkownika, łatwiej jest zachować 1 przedmiot w zakresie, a następnie martwić się o oddzielną zmienną, która jest pochodną pierwszego. – glasnt

2

Kiedy pisałem komentarz do odpowiedzi Dana, zacząłem myśleć o tym, czego używam, ponieważ nie lubię list PFC. Używam DataStore, który, jeśli myślisz o tym we właściwy sposób, jest jak lista na sterydach.