DISKUSE
Sametime (8)
23.04.2021 09:41

Agent který je spuštený čtenářem by měl modifikova... (3)
16.04.2021 16:07

LCConnection - Oracle (2)
08.04.2021 11:16

RTF Scrollbar (2)
21.01.2021 23:27

Export textu do hlavičky MS Word dokumentu pomocí ... (2)
21.01.2021 18:48

Nemá created (2)
09.01.2021 08:46

Problém s polem From v mailech posílaných přes SMT... (1)
30.11.2020 14:30

Agent log (1)
04.08.2020 13:17


ŠKOLENÍ


REKLAMA


KOMENTÁŘE

Jak obejít limit max. 32768 prvků v LotusScriptovém poli?

Vytisknout článek

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.


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


Autor: Zdeněk Michálek
Datum: 01.06.2001


Sdílet článek Seznam komentářů

Zatím nebyl přidán žádný komentář. Buďte první!