světNotes.cz |
Běžně není možné v LotusScriptovém poli definovat více než 32768 prvků v jednom rozměru, tj. např. prvek(32769) již je vyhodnocen jako chybný. Toto omezení je možné obejít definicí třídy IntegerArray, která vnitřně převede vektor na dvourozměrnou matici, což umožní získat 32768 x 32768 prvků (něco přes jednu miliardu), což je již počet pro naprostou většinu případů postačující (vždyť pole této velikosti v případě celých čísel zabere něco přes 2GB paměti).
Definici třídy pro pole typu Integer je následující (je samozřejmě možné ji upravit i pro jiné typy než Integer) - metoda sample je jen ilustrační a naplní všechny prvky pole náhodnou hodnotou z intervalu 0 až 32767:
Class IntegerArray
n As Long
i As Long
i1 As Integer
i2 As Integer
q As Integer
a() As Integer
Sub new(n0 As Long)
n=n0
q=Sqr(n)
Redim a(q-1,q-1) As Integer
End Sub
Sub putitem(n0 As Long,v As Integer)
i1=Int(n0/q)
i2=n0 Mod q
a(i1,i2)=v
End Sub
Function getitem(n0 As Long) As Integer
i1=Int(n0/q)
i2=n0 Mod q
getitem=a(i1,i2)
End Function
Sub Sample
For i=0 To n-1
putitem i,Rnd*32767
Next
End Sub
End Class
A příklad, jak se třída používá:
Sub Initialize
Dim a As New IntegerArray (16000000) ' alokujeme celočíselné pole s 16 milióny prvky - pozor, je to celých 32MB paměti
a.sample ' naplníme pole náhodnými hodnotami
MsgBox a.getitem(489392) ' přečteme prvek na pozici 489392
a.putitem(8349294,19293) ' a uložíme hodnotu 19293 na do prvku číslo 8349294
End Sub
Celý příklad je jen nastíněním možného řešení problému, bylo by vhodné ošetřit normalizaci indexů (aby nemusely začínat na 0 nebo 1 - podle nastavení Option Base - ale od libovolného čísla), rovněž by bylo možné řešit metody třídy obecně a ne jen pro celočíselné prvky. V každém případě je ale třída i v daném stavu pro daný účel použitelná.
Zdroj: ITkey