Newsgroup: it.comp.appl.notes-domino
Titolo: LotusScript, stringhe ed array.....

Ciao a tutti.
Sto cercando di capire come sono strutturate alcuni tipi di dati in
LotusScript, in particolare stringhe ed array.
Dato che si tratta di un linguaggio VBA mi sembra lecito pensare che
ragioni in modo simile a Visual Basic.
In VB una stringa è una BSTR, ossia quando creo una stringa con
dim a as string
a = "pippo"
viene creata una variabile "a" di 32 bit , che contiene l'indirizzo di
una struttura formata dal descrittore della stringa (32 bit, dove viene
memorizzata la len della stringa), immediatamente seguito dal buffer
contenente la stringa stessa. Dato che la stringa è in formato Unicode,
ogni carattere occupa 2 byte. La variabile "a" contiene l'indirizzo del
primo carattere del buffer e i 4 byte precedenti in memoria sono
occupati dal descrittore.
Quindi:
Len(a) vale 5
LenB(a) vale 10
CLng(VarPtr(Stringa)) restituisce l'indirizzo della variabile "a"
e se eseguo questo codice:
CopyMemory Dati, ByVal (CLng(StrPtr(Stringa) - 4)), 4 
copio nella variabile "Dati" il valore contenuto nei 4 byte
immediatamente precedenti il buffer della stringa. E correttamente in
"Dati" troverò il valore 10, cioè LenB(a). Ho omesso la Declare delle
API ovviamente.
In VB una stringa non fissa è dimensionabile fino ad oltre 2 gb.
Immagino che questo viene consentito dal fatto che il descrittore è un
long.
Il LotusScript invece una stringa è limitata a 32kb (ossia a 64kb in
Unicode).
A cosa è dovuto questo limite? Al fatto che il descrittore occupa un
integer (2 byte)?
Oppure è un problema di pagine di memoria o roba simile?
Stesso discorso gli array, che sono limitati a 64 kb. Un array di
stringhe ad esempio dovrebbe contenere solamente i puntatori alle
stringhe stesse, o meglio i puntatori al primo char della stringa
stessa. Da dove nasce la limitazione a 64 kb????
Purtroppo con i motori di ricerca non ho trovato documentazione
soddisfacente a riguardo.
Sono graditissime dritte e link...  :-))
Ciao a tutti da
CICCIO
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 stessa. Da dove nasce la limitazione a 64 kb????
Allora, gli array contengono solamente i puntatori ai valori e non i
buffer, quindi è solamente la sizeof(puntatore) a determinare il numero
di elementi possibili e non i dati. Ho fatto le seguenti prove:
dim A_int() as Integer  ' MAX elementi 32739   differenza= 29
dim A_int() as Long     ' MAX elementi 16369   differenza= 15 
dim A_int() as Double   ' MAX elementi 8184    differenza= 8
dim A_int() as String   ' MAX elementi 16369   differenza= 15
dim A_int() as Variant  ' MAX elementi 4096    differenza= 4
La differenza è riferita al limite teorico (2^16 = 32768...  ecc.)
ed è proporzionale al numero degli elementi. A che sarà dovuta? 
Ad un qualche header dell'array che consuma circa un byte per ogni 
1000 elementi...  mah...
Però ancora non ho capito il perchè de limite...


Ma perchè?
Per sopportare windows, direi.
Obelix

 Per sopportare windows, direi.
Correggerei in "per essere multiplatform".
--
Juda of 3AM - juda(strudel)
despammed.com
/---------------/
Il coraggio non mi manca. E' la paura che mi frega.

Correggerei in "per essere multiplatform".
No, no, per sopportare windows. Essere multiplatoform e' diverso. Il
limite di 64k e' *solo* di windows.
Obelix

 Obelix
Ehm...  ma in VisualBasic le stringhe potevano essere lunghe 2 gigabyte
quando mia nonna era ancora una bonazza.....


quando mia nonna era ancora una bonazza.....
Stringhe Unicode! Altrimenti 4 GBytes :-))

quando mia nonna era ancora una bonazza.....
Devi esser euno spermatozoo, allora. 6 anni fa il limite era 64k 'in
the whole MsUniverse'.
Obelix