Powerbuilder Динамическое управление массивами - PullRequest
8 голосов
/ 29 марта 2010
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?

Я думаю, что строка 'array [3]' неверна, но я думаю, что я прочитал, что это должно удалить ячейку массива.

Каким будет правильный способ удаления ячейки массива? Зависит ли это от типа объекта? (Строка против числа против объекта)

Или

Можно ли манипулировать значением UpperBound, чтобы оно работало?

т.е. после удаления элемента 3 я хочу, чтобы значение UpperBound или длина массива равнялось 2, поскольку это логически правильно.

Ответы [ 4 ]

9 голосов
/ 29 марта 2010

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

3 голосов
/ 29 марта 2010

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
2 голосов
/ 30 марта 2010

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

0 голосов
/ 30 марта 2010

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

...