Newsgroup: it.comp.lang.vo-clipper
Titolo: Variabili di tipo static, come liberare la memoria occupata.......

Mi sorge un dubbio e Mi spiego :=
se ho una "DATA TYPE" di tipo "STATIC ARRAY STRING":
     //
     LOCAL lpDAta as PSZ PTR
     LOCAL i           as byte
     //
     lpData := memalloc(10 *_sizeOF( PSZ ))
    FOR  i := 1 to 10
          lpData[i-1] := asstring(i)
    next
Nel momento in cui devo liberare la memoria di lpData, SECONDO voi basta :
                memfree( lpData )
Oppure :
               for i :=1 To 10
                    memfree( lpData[i-1]
               next
Regards Luigi De Palma


Secondo me basta memfree()
Ciao,
    Fabrizio Malaguti


               next
C'è un esempio nel manuale "New Features 2.5" in formato pdf
(vo25nf.pdf) che utilizza la seconda soluzione che indichi.
ciao

               next
Nel tuo caso dovrebbe bastare memfree (non ho provato), pero' tieni
conto che se il puntatore, punta ad un insieme di strutture, č
necessario il ciclo FOR per scaricare le singole strutture.
Ad esempio, l'editor OLE di VO, genera codice che non libera
completamente le risorse, proprio perchč scarica solo l'ultimo
elemento.
Spero di essere stato di aiuto.
===============================================
Antonello Negrone - Biella - Italy
anto...@anc-software.it
www.anc-software.it

 completamente le risorse, proprio perchè scarica solo l'ultimo


 ha scritto nel messaggio
news:c014bu88foeal4mk8...@4ax.com...


                next
questo dovrebbe incasinare il garbage-collector in quanto per un alloc
corrispondono dei free multipli...

Anche io concordo.... anzi, usando il secondo sistema ti perdi pure 40 Byte
ad ogni esecuzione della sezione perche' non liberi mai la memoria dedicata
ad  lpData.
"pimpa" <xxx@xx.x> ha scritto nel messaggio
news:BGys8.5019$m41.1...@twister2.libero.it...


 ad  lpData.
infatti...
    lpData[i-1] := asstring(i)
e' una allocazione dinamica gestita dal GarbageCollector
mentre con la memalloc ho una allocazione diretta che richiede
esplicitamente un memfree.
Mettete io tutto in un loop da 100.000 volte e verificate l'occupazione se
cresce.

               Mi avete convinto, anche se a parte "asstring(i)" alloca un
stringa anzichè un PSZ"STRING+"0", normalemente le var di tipo psz si
consiglia di pulirle con memfree o addirittura vedo esempi di codici dove
utilizzano un := NULL_PSZ.
               Il problema maggiore è secondo me quando hai un risultato di
query di 50.000 righe che contengono anche dati Binary, nel formato di
lpData[i], Là diventa effettivamente oneroso pulire prima i psz e poi il
ptr, spero che il memfree(PTR), risolva il tutto ancHE se contiene diverse
strutture di dati.
              CONSIDERANDO CHE HO TROVOTA MOLTA SOLIDARIETA IN QUESTO THREAD
:
              Avrei piacere che mi aiutaste a sciogliere un'altra matassa
che mi sta turbando non poco
              Premetto che attualmente sto sudiando mySQL, e precisamente ho
scaricato dal sito del mitico fabrice Foray la libreria che contiene i
collegamenti dinamici alla dll del API(C) per interfacciare direttamente
mySQL a VO per poi sviluppare delle classi in VO per dialogare con mySQL.
             Attualmente mi trovo nella fase di gestire i risultati delle
query, che in pratica sono stored in una struttura di questo tipo :
             structure mysqlROWS
                           member _next    as  mysqlROWS
                           member lpData  as  PSZ PTR
             Ora, il mio problema è il seguente, premetto ( per chi è a
conoscenza delle funzioni C presenti nella libreria di mySQL)che la mia
intenzione è quella di non voler utilizzare la funzione
                        mysql_data_Seek(mysqlROWS,  iRow) := RETURN VALUE
mysqlROWS
            Ora i miei problemi sono i seguenti:
                     CERCARE -  INSERIRE - CANCELLARE    := UNA ROW
             CERCARE UNA ROW :
                                for    i := 1 to nRow
                                       Row  := strROWS.:next
                                next i
                                ma se devo ricercare la 100 row e mi trovo
con il cursore a 1000, non mi sembra opportuno ricominciare da una variabile
( cursore ) che abbia il puntatore iniziale della strROWS, secondo me in
questo modo si perde molto tempo, sopratutto quando i risultati sono di
diverse migliaia di rows, SECONDO VOI COME POTREI ARGINARE IL PROBLEMA ?
           INSERIRE UNA ROW :
                              Spero che basti trovarsi alla fine della
struttura e poi inizializzarla
                             strROWS._next  := memalloc(_sizeOF(mySQLROWS))
                             strROWS.lpData :=
memalloc(_sizeOF(PSZ)*NUMCOLS)
           CANCELLARE UNA ROW :
                                     Come cacchio Fare ....?
         E' inutile dire che per chi voglia darmi Un aiutino, posso solo
inserirlo nel libro degli amici virtuali a cui con molto affetto spero di
poter ricambiare in futuro, o addirittura per chi si trovi a napoli e
d'intorni un caffè con una bella sfogliatella offerta da Luigi De Palma
        Grazie, in ogni caso.
        Luigi De Palma
"pimpa" <xxx@xx.x> ha scritto nel messaggio
news:BGys8.5019$m41.1...@twister2.libero.it...


                                      Come cacchio Fare ....?
Entrambe le operazioni si possono tranquillamente fare con istruzioni
SQL come INSERT e DELETE.
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

 sopra, bensě l'esatto contrario: chiedi al motore di darti le sole righe


 strutture di dati.
Non dirmi che esegui la copia della query in un vettore da 50.000
elementi...?
Non penso sia una buona idea dal punto di vista del buon senso.

                          SELF:lpRowsResult._next  :=  tmp
Se fosse C (ma non lo è) andresti in contro ad una memory-leak. Devi
probabilmente rilasciare il record che sganci dalla lista.
