Domanda

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?

Credo che il 'array [3]' linea è sbagliato, ma credo di aver letto che questo dovrebbe rimuovere la cella di matrice.

Quale sarebbe il modo giusto per eliminare una cella di matrice? Dipende dal tipo di oggetto? (String vs Number vs Object)

o

Si può manipolare il valore limite superiore per farlo funzionare?

vale a dire. dopo aver rimosso punto 3, voglio l'upperbound, o arraylength, per essere 2, dal momento che questo è logicamente corretta.

È stato utile?

Soluzione

per gli array di dimensione variabile, la memoria viene allocata per la matrice quando si assegnano valori ad esso. Upper bound restituisce il valore più grande che è stato definito per la matrice nello script corrente . Tuttavia, è possibile fare il trucco utilizzando un altro array dinamico.

string array2[]
int i

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

array = array2

Poi upper bound (array []) sarà ridotto dell'1.

Questo lavoro per upper bound (array []) -. 1> 2 perché powerbuilder alloca alla memoria di default per 3 elementi quando un array dinamico viene dichiarato

Altri suggerimenti

Powerbuilder in realtà non ha nessun buone funzioni di manipolazione di array costruiti in (che io sappia).

È possibile ottenere ciò che si sta cercando di fare copiando i valori che si desidera mantenere per un nuovo array illimitata.

Ad esempio

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

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

Nel tuo esempio si sta rimuovendo solo l'ultimo valore - questo può essere fatto anche più semplicemente copiando l'intero array ad un nuovo più piccolo, un array delimitata in questo modo:

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

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

Quando stavo scrivendo un commento per la risposta di Dan ho iniziato a pensare a quello che io faccio uso, dal momento che non mi piace liste di PFC. Quello che uso è un archivio dati, che, se si pensa a questo proposito la strada giusta, è come una lista di steroidi.

Invece di copiare la matrice, se avete bisogno di tenere traccia di un cambio limite superiore della matrice (per esempio, se si sta cercando di usarlo come qualcosa di simile a una pila), perché non solo a mantenere una variabile integer separato con la menzione Indice l'ultimo vero dell'elemento? Sembra molto più semplice e più efficiente rispetto alle soluzioni di copiatura suggerite sopra!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top