Вопрос

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]' неверна, но, по-моему, я читал, что при этом следует удалить ячейку массива.

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

Или

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

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

Это было полезно?

Решение

Для массивов переменного размера память выделяется для массива, когда вы присваиваете ему значения.upperBound возвращает наибольшее значение, которое было определено для массива в текущем скрипте.Однако вы можете проделать этот трюк, используя другой динамический массив.

string array2[]
int i

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

array = array2

Тогда верхний предел (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.То, что я использую, - это хранилище данных, которое, если вы правильно об этом подумаете, похоже на список стероидов.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top