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

Creo que la línea 'array [3]' está mal, pero creo que he leído que esto debería eliminar la matriz de la matriz.Powerbuilder Dynamic Array Manipulation

¿Cuál sería la forma correcta de eliminar una celda de matriz? ¿Depende del tipo de objeto? (Cadena vs vs Número de objetos)

O

Se puede manipular el valor del límite superior para hacer que funcione?

es decir, después de eliminar el elemento 3, quiero que el UpperBound, o la longitud de la matriz, sea 2, ya que esto es lógicamente correcto.

+1

Por cierto, LowerBound siempre devolverá 1 con una matriz de tamaño variable. LowerBound se usa cuando declaras una matriz como 'string foo [-7 TO 34]'. LowerBound devuelve -7 para esta matriz. –

Respuesta

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. Sin embargo, puedes hacer el truco usando otra matriz dinámica.

string array2[] 
int i 

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

array = array2 

Entonces límite superior (array []) se reduce en 1.

Esto funcionará para límite superior (array []) - 1> 2 porque powerbuilder asigna por tamaño de la memoria por defecto de 3 elementos cuando una matriz dinámica es declarada.

+0

Suspiro, pensé que tendría que hacer algo como esto. Gracias gd047 – glasnt

3

Powerbuilder realmente no tiene ninguna buena función de manipulación de matrices integrada (que yo sepa).

Puede lograr lo que está tratando de hacer copiando los valores que desea conservar en una nueva matriz ilimitada.

Por ejemplo

int i 
string array3[] = {'Item 1', 'Item 2', 'Item 3'}, array2[] 

for i = 1 to 2 
    array2[i] = array3[i] 
next 
UpperBound(array2[]) // = 2 

En su ejemplo va a extraer sólo el último valor - esto se puede hacer aún más simplemente copiando toda la matriz a una nueva matriz más pequeña, delimitada así:

string array3[] = {'Item 1', 'Item 2', 'Item 3'}, array2[2] 

array2 = array3 
UpperBound(array2[]) // = 2 
0

En lugar de copiar la matriz, si necesita realizar un seguimiento de un límite superior cambiante de la matriz (por ejemplo, si está tratando de usarlo como una pila), ¿por qué no mantener una variable entera separada? que indica el último índice del elemento real? ¡Parece mucho más simple y más eficiente que las soluciones de copia sugeridas arriba!

+0

Motivo principal: es un lugar más para cometer un error. Entonces para protegerse, envuelve la matriz en un objeto y muy pronto implementa una lista. En un lenguaje como Java con todo tipo de soporte para listas, muy bien puede elegir algo así como una ArrayList. El PFC tiene soporte para la lista, pero siempre he sentido que la implementación era torpe y nunca la había usado. –

+0

También debido al alcance de la matriz entre mis ventanas y los objetos del usuario, es más fácil tratar de mantener 1 elemento en el alcance y luego tener que preocuparse por una variable separada que es una derivada de la primera. – glasnt

2

Cuando estaba escribiendo un comentario para la respuesta de Dan empecé a pensar en lo que uso, ya que no me gustan las listas de PFC. Lo que uso es una tienda de datos, que, si lo piensas bien, es como una lista de esteroides.