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]' является неправильной, но я думаю, что считал, что это должно удалить элемент массива.
Каков был бы правильный способ удалить элемент массива? Это зависит от типа объекта? (Строка по сравнению с Числом по сравнению с Объектом)
Или
Можно управлять значением 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. Я использую хранилище данных, которое, если вы правильно подумаете, похоже на список стероидов.
Вместо копирования массива, если вам нужно отслеживать изменение верхней границы массива (например, если вы пытаетесь использовать его как что-то вроде стека), почему бы просто не сохранить отдельную целочисленную переменную, указывающую индекс последнего реального элемента? Кажется, намного проще и эффективнее, чем решения для копирования, предложенные выше!