Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Out of string space

Ciao.
Ho un programmette su VB6 w WIN98se che in un loop "allunga" una stringa,
ovvero fa una roba del genere
stringa = stringa & stringa2
dopo un pò (quando stringa diventa più grossa di 3.500.000) mi dà un errore
14 Out of string space (Spazio stringa esaurito).
MSDN dice che sì, POTREBBE verificarsi su ALCUNI sistemi operativi, e
propongono per prova:
stringa="Hello"
for i=1 to 100
    stringa=stringa & stringa
next
questo sul mio win98 si incarta al passaggio 24, con la stringa lunga circa
80.000.000 (comunque ben meno del limite di 2^31 fissato per le stringhe)
msdn dice: "cambiate nome alla variabile".
Vi è già successo? ne sapete qualcosa?
Grazie.

 wrote in message
news:a1h6cr$qlr6d$1...@ID-77234.news.dfncis.de...


 msdn dice: "cambiate nome alla variabile".
???????????????
Eh?????
Ma che risposta é questa?
Quindi il nome della variabile in qualche maniera influisce????
NON HO PAROLE!!! :(((((((
                Ciao
                            Allanon

 ha scritto nel messaggio
news:a1h6cr$qlr6d$1...@ID-77234.news.dfncis.de...


 msdn dice: "cambiate nome alla variabile".
Sicuro che dica proprio così?
Comunque il messaggio mi sembra più che pertinente.
Ciao

 Ma poi... cha cavolo ci fai con una stringa del genere?
Questa è la domanda cardine!!!!
ciao
ugo

 wrote in message
news:MBW_7.768$G02....@news1.tin.it...


 Sicuro che dica proprio così?
non sono stato chiarissimo: dice di assegnare la stringa ad un'altra
variabile.
Visual Basic permits you to use very large strings. However, the
requirements of other programs and the way you manipulate your strings may
cause this error. This error has the following causes and solutions:
  a.. Expressions requiring that temporary strings be created for evaluation
may cause this error. For example, the following code causes an Out of
string space error on some operating systems:
MyString = "Hello"
For Count = 1 To 100
    MyString = MyString & MyString
Next Count
  Assign the string to a variable of another name.
eccolo qua

 Questa è la domanda cardine!!!!
Il problema non è cosa me ne faccio...
ho "trovato" il problema  perchè "qualcosa me ne faccio", cercavo una
soluzione, non è molto importante il perchè, no?

 MA CERTO!  ma ho 256M di ram, e mi si incarta dopo 3M.
Probabilmente durante l'allocazione dello spazio dovuto alla somma di
stringhe VB non fa nč garbage collect, nč la riorganizzazione dei blocchi di
memoria.
Se č cosě, nel momento in cui tu dichiari una variabile, lui gli assegna il
primo spazio libero che la contiene. Siccome la memoria puň essere
segmentata, ma una variabile stringa no, se la memoria disponibile sul tuo
PC č piena di buchi e tu hai la tua variabile in un buco da 3 mega, oltre i
3 mega non vai.
Cambiare variabile (come suggerisce MSDN) equivale ad allocare una nuova
area di memoria. Magari questa volta č sufficentemente ampia per contenere
quello che ti serve.
In assoluto, il sistema migliore dovrebbe essere quello di allocare lo
spazio che ti serve e poi liberarlo prima di creare la tua variabile. Questo
dovrebbe far swappare su disco tutto quello che non serve e liberare
abbastanza spazio contiguo.
Puoi provare a fare qualche esperimento con una GlobalAlloc seguita subito
da una GlobalFree, per liberare memoria prima di far partire il tuo ciclo
sulle stringhe.
Se fai la prova, facci sapere come č andata a finire.
Ciao
*Roby*


a titolo di interesse teorico, sì.
ciao
ugo

ho fatto la prova con Win2000 ed il problema c'č ancora.
Ho provato a fare una zozzata del tipo
temp=stringa & stringa
stringa=temp
temp=""
e FUNZIONA.
suppongo anche io sia un problema di "frammentazione". Lo risolverň cosě. Fa
schifo ma mi costa 3 minuti a metterlo in piedi, test compreso.
Grazie.

 di un file _non_ č la soluzione giusta.
Hai assolutamente ragione, ma credimi che la mia situazione č immensamente
piů incasinata di quanto ho descritto: ho un array di winsock che scrivono
in un array di stringhe che poi si pacioccano vicendevolmente.... lavorare
sui files temporanei sarebbe MOOOOOOOOOOLTO piů lento e, successivamente,
piů incasinato.
non so che altre soluzioni trovare, non sapendo in anticipo quanto deve
essere lunga questa cappero di variabile...
direi che la cosa che farň č mettere quella tremenda pezza della variabile
"temp"...
accetto suggerimenti, comunque. :-)
buona serata.

 più incasinato.
Puoi provare a scrivere in un array di array di bytes.
le WinSock scrivono anche in array di byte
quindi puoi fare:
Dim rez() As Byte
wock(Index).GetData rez(), vbByte
poi puoi accodare, per esempio, l'array rez() ad un altro in più modi,
per esempio, supponiamo di avere l'array tutto() che contiene la parte
precedente dello stream della WS:
redim preserve tutto(dimensione_rez+dimensione_tutto)
poi esegui un CopyMemory da rez() a tutto() nella posizione corretta.
se vuoi usare array di array basta sosituire le occorrenze di tutto() con
tutto(indice_Array,1)  (e ridimensionare opportunamente)
Nota:
Se ti serve fare parsing testuale sui dati che hai nell'array puoi usare
l'utile e veloce funzione StrConv per passare parte dei dati dell'array ad
una stringa:
dim s as string
s = StrConv(rez(), vbUnicode)
Un osservazione:
Se stai usando le Winsock per trasferire file, a mio avviso non puoi
prescindere dallo scrivere i flussi di dati su file, in quanto non puoi fare
supposizioni sulla lunghezza del flusso stesso (cioè esiste sempre un caso
in cui il flusso di dati ti impalla il PC).
Se sai invece che avrai un limite massimo alla dimensione dei file da
trasferire non ci sono problemi.
In ultimo,
se stai implementando il protocollo HTTP 1.1, nota che molti server
accettano il comando HEAD sui file, che ti consente di conoscerne a priori
la dimensione (e quindi allocare tutte le risorse necessarie, siano esse
file o array in memoria).
Saluti,
Luca Barbetta kck/skd