> 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?