Newsgroup: it.comp.lang.delphi
Titolo: Cultura generale [parte3]

Ecco altre 3 domandine sul Delphi
1-che differenza c'e' tra funzione Ord e Integer?
 fare   ord('A') non e' la stessa cosa di integer('A')?
2-differenza tra  GetMem( ), AllocMem( ), New( ) ?
3- Come faccio a sapere se ad un puntatre e' stata allocata della
memoria? esiste una funzione ad hoc?
  Non credo che  il semplice  < IF puntatore=Nil> sia corretto  visto
che un puntatore che sia stato semplicemente <dichiarato> ha valore
diverso da NIL anche se non porta con se utilizzo di memoria...
Grazie
~Guybrush~

 diverso da NIL anche se non porta con se utilizzo di memoria...
Gia' non credo neanche io :)
Comunque penso sia meglio tenere traccia dei puntatori usati nel programma
piuttosto che "risalire" al fatto se sono assegnati o no..
Ciao !! :)

piuttosto che "risalire" al fatto se sono assegnati o no..
Infatti... if Assigned(P) e' corrispondente a if P <> nil e non esiste
alcun modo per sapere se un puntatore o una variabile procedurale sia
stata inizializzata. L'unico modo per essere sempre sicuri che i
puntatori siano stati assegnati e rilasciati e' quello di
inizializzarli sempre a nil a inizio programma e ogni volta che
vengano rilasciati. Se usi D5 esiste una procedura ad hoc
FreeAndRelease (credo si chiami cosi', non uso D5) che rilascia la
memoria e mette la variabile a nil.
Ciao,
Massimo.
-- 
"Ciao Rex, che cavolo di situazione eh? Due dentro, due fuori, puo' succedere di tutto!"


La funzione Assigned() di Delphi restituisce lo stesso valore di un
confronto della variabile puntatore con 'nil', e non determina in ogni caso
se il puntatore è effettivamente valido (cioè che punta ad una struttura
dati allocata) oppure no; l'unico sistema è preoccuparsi di assegnare a
'nil' ciascuna variabile puntatore a istanze di classi o tipi di dati dopo
averle distrutte, ad eccezione di alcuni casi in cui l'assegnamento è
superfluo (ad esempio, se la variabile puntatore è locale ad una procedura e
non viene più utilizzata dopo aver distrutto l'istanza che rappresenta).
Ciao!
===============================
Marco Breveglieri (
br...@sintesi.com
)
SINTESI S.r.l. (
www.sintesi.com
)

memoria?
Non puoi, a meno di scriverti una classe puntatore (sul modello degli
"smart pointer" del C++) ed utilizzare sempre e solo quella al posto
del tipo puntatore.
Purtroppo l'Object Pascal gestisce le classi in modo pessimo e non ti
consente di fare cio' che e' invece fattibile in C++, ovvero avere una
classe puntatore che dealloca automaticamente la memoria allocata
all'atto della creazione, quando esce dallo scope in cui e'
utilizzata.
Un modello simile, in Delphi, e' il seguente :
type Puntatore = class
                    private
                       P : Pointer ;
                    public
                       constructor Create ;
                       procedure AllocaMemoria( Size : Cardinal ) ;
                       destructor Destroy ; override ;
                 end ;
     constructor Puntatore.Create ;
     begin
       P := nil ;
     end ;
     procedure Puntatore.AllocaMemoria ;
     begin
       P := AllocMem( Size ) ;
     end ;
     destructor Puntatore.Destroy ;
     begin
       if ( Assigned( P ) ) then
         FreeAndNil( P ) ;
     end ;
Ma e' del tutto inefficace peche' devi comunque forzare la chiamata a
"Free" dell'istanza della classe.
Questo e' uno dei tanti punti deboli della OOP implementata con
Delphi.
--
Andrea Laforgia (ICQ 87230455)
http://www.geocities.com/AndreaLaforgia
"ci sono tre tipi di persone nel mondo : quelli che
 sono bravi in matematica e quelli che non lo sono."

memoria e mette la variabile a nil.
FreeAndNil


sia meno indicata da utilizzare rispetto a AllocMem();
Che tipo di problemi hai riscontrato ?


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

 l'uso della AllocMem() che ho sempre utilizzato con successo.
Ciao! questo mi fa venire in mente un problema particolarissimo segnalato da
un mio Cliente, che usa NT 4 Workstation, e che mi segnalava, su un mio
software (che funzionava perfettamente in ambiente W9x/ME/2K), errori del
genere all'avvio. Ricontrollando il software, ho visto che usa la Getmem in
alcune procedure legate alle risorse embedded nell'exe e alla gestione
stampanti.
MMMMhh.. che sia il caso di sostituirla? :) Ora provo :)
Ciao, Sandro

 ha scritto nel messaggio
news:97dod4$oh2c9$1...@ID-43509.news.dfncis.de...


uso della GetMem(), ma non escludo di certo la possibilità.
Mi sembra molto strano che la cosa dipenda dalla GetMem.
Io onestamente uso NT 4.0 e non mi e' mai capitata una cosa del
genere.
