světNotes.cz

Jak obejít limit max. 32768 prvků v LotusScriptovém poli?
Novinky
01.06.2001 - Zdeněk Michálek

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