2010-03-29 5 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? 

줄 'array [3]'이 잘못되었다고 생각하지만 배열 셀을 제거해야한다고 생각했습니다.Powerbuilder 동적 배열 조작

어레이 셀을 제거하는 올바른 방법은 무엇입니까? 그것은 객체 유형에 달려 있습니까? (객체 대 수 대 문자열)

또는

하나는 그것이 작동되도록하는 UPPERBOUND 값을 조작 할 수 있습니까?

즉 항목 3을 삭제 한 후 논리적으로 올바른 UpperBound 또는 arraylength를 2로 설정합니다.

+1

그런데 LowerBound는 항상 가변 크기 배열로 1을 반환합니다. LowerBound는'string foo [-7 TO 34]'와 같은 배열을 선언 할 때 사용됩니다. LowerBound는이 배열에 대해 -7을 반환합니다. –

답변

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. 그러나 다른 동적 배열을 사용하여 트릭을 수행 할 수 있습니다.

string array2[] 
int i 

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

array = array2 
이어서 UPPERBOUND (배열 []) UPPERBOUND (배열 [])에 대해 작동 1.

이 감소한다

- 파워 빌더 3 개 요소의 기본 메모리 크기로 할당하기 때문에 1>이 때 동적 배열이 선언됩니다.

+0

한숨, 이런 일을해야한다고 생각했습니다. 감사합니다 gd047 – glasnt

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 
0

배열을 복사하는 대신 어레이의 상한 경계를 추적해야하는 경우 (예를 들어 스택과 같은 것으로 사용하려는 경우) 별도의 정수 변수 마지막 실제 요소의 인덱스를 나타내는가? 위에 제시된 복사 솔루션보다 훨씬 간단하고 효율적입니다!

+0

주된 이유 : 그것은 실수 한 번 더 장소입니다. 따라서 자신을 보호하기 위해 객체를 배열에 넣고 곧 목록을 구현했습니다. 모든 종류의 목록을 지원하는 Java와 같은 언어에서는 ArrayList와 같은 것을 선택할 수 있습니다. PFC는리스트를 지원하지만, 필자는 항상 구현이 어수선하고 결코 사용하지 않은 것처럼 느꼈다. –

+0

또한 내 창과 사용자 객체 사이의 배열 범위로 인해 범위에서 1 개의 항목을 유지하는 것이 더 쉽고 첫 번째 항목에서 파생 된 별도의 변수에 대해 걱정해야합니다. – glasnt

2

댄의 대답에 대한 의견을 쓸 때 PFC의 목록이 마음에 들지 않아서 내가 사용하는 것에 대해 생각하기 시작했습니다. 제가 사용하는 것은 DataStore입니다. 올바른 방법이라고 생각하면 스테로이드 목록과 같습니다.