Управление динамическим массивом Powerbuilder

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, так как это логически корректно.

8
задан glasnt 29 March 2010 в 05:56
поделиться

4 ответа

Для массивов переменного размера память выделяется для массива, когда вы присваиваете ему значения. 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 элементов при объявлении динамического массива.

9
ответ дан 5 December 2019 в 12:09
поделиться

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
3
ответ дан 5 December 2019 в 12:09
поделиться

Когда я писал комментарий к ответу Дэна, я начал думать о том, что я использую, поскольку мне не нравятся списки PFC. Я использую хранилище данных, которое, если вы правильно подумаете, похоже на список стероидов.

2
ответ дан 5 December 2019 в 12:09
поделиться

Вместо копирования массива, если вам нужно отслеживать изменение верхней границы массива (например, если вы пытаетесь использовать его как что-то вроде стека), почему бы просто не сохранить отдельную целочисленную переменную, указывающую индекс последнего реального элемента? Кажется, намного проще и эффективнее, чем решения для копирования, предложенные выше!

0
ответ дан 5 December 2019 в 12:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: