Newsgroup: it.comp.lang.vo-clipper
Titolo: Array di puntatori a variabili globali

Problema: Array di puntatori a variabili globali.
Ho la necessità di realizzare un array di puntatori a variabili globali che,
una volta impostate con i valori opportuni (caricati dal registry o da un
file ini), devo poter salvare all'uscita del programma senza bisogno di
utilizzarne il nome.
Utilizzo variabili globali per comodità e il vettore per eseguire una
semplice scansione ricavando i valori memorizzati nelle variabili stesse.
Chiamo la funzione ipotetica nel seguente modo realizzando un subarray.
LoadIniString ( IniFile, aIni, {"Sezione", "NomeChiave", "TipoDati",
@VariabileGlobale}, @VariabileGlobale)
FUNCTION LoadIniString ( oIni, aIni, aRow, varref ) AS PSZ
    LOCAL var AS STRING
    IF ( UsualType ( aRow ) =ARRAY )
        // ricavo la variabile dal file ini
        var := oIni:GetString ( aRow [ 1], aRow [ 2] )
        // allocazione della stringa
        varref := StringAlloc ( var )
        // aggiungo la riga al vettore
        // il riferimento alla variabile era già inserito in aRow
        AAdd ( aIni, aRow )
        ENDIF
RETURN varref
Il tutto mi funziona solo se la VariabileGlobale è precedentemente
inizializzata, prima della chiamata a LoadIniString. Il compilatore non mi
supporta il concetto di puntatore a puntatore (?) se non precedentemente
inizializzato.
Non mi è possibile risolvere tutto in una sola chiamata, devo sempre
assegnare la variabile e poi, un una seconda riga, aggiungerla al vettore.
Avete una soluzione più elegante?

Mi sembra un po' complicato.
Potresti usare direttamente un array global di elementi o di
strutture adatte a contenere i pochi elementi di cui hai bisogno.
Un'altra soluzione piu' vicina ai criteri degli ex clipperisti
e' quella di aprire un DBF idoneo ed archiviare le informazioni
recuperate dal programma e scaricarle automaticamente alla
chiusura.
Saluti
Paolo Cherubini
* Sent from RemarQ 
http://www.remarq.com
 The Internet's Discussion Network *
The fastest and easiest way to search and participate in Usenet - Free!

Daccordo, potrebbe essere complicato ma mi chiedo come risolvere questo
problema di puntatori che in linguaggio "C" è banale.
"Paolo Cherubini" <cherubin...@ancitel.it.invalid> ha scritto nel
messaggio news:249fda2c...@usw-ex0106-047.remarq.com...


Non credo siano rimaste molte cose che si possono fare
facilmente in C e non in VO.
Per estrarre l'indirizzo di una variabile puoi procedere in
questo modo:
// Dichiarazione della variabile globale
GLOBAL nVar1:=100 AS DWORD
In una funzione o in un metodo qualunque:
// Dichiara un puntatore tipizzato coerente con la "Global"
LOCAL hPTR AS DWORD PTR
// Stampa il valore della "Global" => 100
? nVar1
// Memorizza nel puntatore l'indirizzo di nVar1
hPTR:=@nVar1
// Stampa l'indirizzo di memoria in esadecimale
? hPTR
// Converte in DWORD un l'indirizzo di memoria definito in hPTR
=> 100
? PTR(hPTR)
In questo piccolo esempio hPTR e' un puntatore che contiene un
indirizzo ad una variabile "Global" e puoi farne qualunque uso,
incluse le operazioni algebriche sulle locazioni di memoria!
Se ti serve un vettore la dichiarazione del puntatore e':
LOCAL DIM ahPTR[xx] as DWORD PTR
