[zxspectrum] Re: R: Fw: tie'...

  • From: Alfonso Martone <a.martone@xxxxxxxxxxx>
  • To: zxspectrum@xxxxxxxxxxxxx
  • Date: Fri, 10 Oct 2003 14:55:36 +0200

> Questo significa che anche la versione per Z80 dell'MBASIC (io mi
> sono appoggiato al BASIC del NASCOM per il mio port) soffre di
> questo problema, e quindi probabilmente anche le prime versioni
> 8080 e le "ultime" per CP/M  (chissà che fanno gli MSX e gli MSX2
> ?).

Certo. Il guaio della FRE(0) e' che e' un algoritmo di complessita' 
quadratica (o peggio). Occorrerebbe riscrivere tutta la sezione della 
gestione delle stringhe... ;-) Temo che quel meccanismo diabolico sia 
assai piu' diffuso del previsto. Forse non si nota solo sui basic con 
poca RAM utile (per esempio macchine con 16k RAM totali).

Quello che avviene, in quei Basic, quando fai A$(I)="#"+STR$(I) e':
- crea la stringa "#" sul pool delle stringhe
- crea la stringa STR$(I) sul pool
- crea una nuova stringa e copiaci le due precedenti
- marca le prime due come "unused space" e fai finta di niente.

Per cui dopo un po' di assegnamenti, lo spazio delle stringhe e' 
mostruosamente frammentato. Quando non c'e' piu' spazio, viene 
chiamata (dal sistema, se prima non ci ha pensato l'utente) la FRE(0) 
a riordinare (per cui in teoria basterebbe chiedere un FRE(0) dopo 
ogni assegnazione, cosicche' il pool stringhe e' sempre pulito). E 
piu' buchi vuoti ci sono e peggio sara'...!

Sullo Spectrum, invece, questo problema non c'e', perche' l'area delle 
variabili non contiene "buchi" e frammentazione. Le stringhe sono 
dinamiche (anche piu' di 255 caratteri) e nella DIM si specifica la 
loro larghezza fissa (come dei "campi" di un file di dati). Il 
programmino:

10 DIM a$(4600,5)
20 FOR n=1 to 4600
30 LET a$(n)="#"+STR$ n
40 PRINT AT 15,15;a$(n)
50 NEXT n

non solo NON riempie la memoria (il vettore a$ occupa 23k anziche' 
35-40k: non ci sono infatti le terzine di bytes che dicono la 
posizione e la lunghezza), ma finisce in appena due minuti e mezzo, 
senza alcuna interruzione...!

p.s.: c'era una PRINT USR nella ROM che restituiva la memoria 
attualmente occupata (per cui sottraendola da 65536 si otteneva la 
memoria libera), qualcuno se la ricorda?

Other related posts: