Newsgroup: it.comp.lang.delphi
Titolo: Puntantori

Ehm avrei un problemino con i nostri simpatici amici puntantori.... in
pratica non ho capito a cosa servono e come e quando utilizzarli :°(
Non è che qualcuno mi può spiegare brevemente oppure dirmi dove trovare
qualcosa al riguardo?(possibilmente qualcosa in italiano almeno per
iniziare)
grazie e scusate la mia ignoranza :)

Iniziamo dal caso + semplice in Delphi: gli eventi.
Tutti gli eventi dei componenti delphi non sono altro che puntatori a procedure che possono essere ad esempio salvati e ripristinati.
Immagina di avere una query con un qualcosa da fare sull'evento AfterScroll.
Ora, potrebbe esserci una qualche operazione che tu desideri fare durante la quale del blocco associato all'after scroll non te ne frega un kakkio, quindi puoi scrivere una cosa del genere:
procedure OperazioneSuQuerySenzaAfterScroll;
var
ExEventoAfterScroll : TDataSetNotifyEvent;
begin
With Query1 do
begin
ExEventoAfterScroll := AfterScroll
// Fai qualcosa sulla query
AfterScroll := ExEventoAfterScroll
end;
Questo è un caso dei + pratici e semplici, ma ti apre una serie di prospettive per gli utilizzi + fantasiosi.
Questo principio viene applicato nella creazione a runtime di oggetti;
si dichiara una procedura che rispetti il prototipo che il componente si aspetta e poi:
procedure GenericAfterScroll(DataSet: tdataset);
begin
// qualcosa
end;
procedure CreaQueryARunTime;
begin
Query := TQuery.Create(Application);
Query.Sql.Add('select * from tabella where condizione=true');
Query.AfterScroll := GenericAfterScroll;
...
end;
Ti basta per ora?
Saluti & buon lavoro
"Se è Microsoft non funziona"
-- 
Posted from 
ammi.mclink.it
 [195.110.128.1] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 "Se č Microsoft non funziona"


 grazie e scusate la mia ignoranza :)
Non è ignorante chi non sa, ma chi non vuol sapere... :=)
Andrea


wrote:

Sai che non ho capito niente (e il mio secondo nome e' puntatore :-)
)? 
A parte gli scherzi, io non ci provo neppure a spiegare cos'e' un
puntatore -- sono famoso per le mie capacita' descrittive -- pero'
detto cosi' non si capisce nulla.
Ehehheeh, non te la prendere....
Massimo.

(possibilmente qualcosa in italiano almeno per iniziare)
ti va bene qualcosa in ... pascal ;-)
un esempietto scritto al volo:
procedure TForm1.Button1Click(Sender: TObject);
var p:   ^integer;   // puntatore a integer
    a, b: integer;   // integer 8)
begin
 p  := @a;  // p punta a "a"
 p^ := 1;   // la zona di memoria puntata da p  viene messa a 1
 ShowMessage( 'a=' + IntToStr(a) );
 p  := @b;  // idem con b
 p^ := 2;   // idem con b
 ShowMessage( 'b=' + IntToStr(b) );
 a  := p^;  // a prende il valore della zona di memoria puntata da p
 ShowMessage( 'a=b=' + IntToStr(a) );
end;
Spero di averti fatto chiarezza ...
Ciao,
Alan Solo

Cerchero' di essere + chiaro...
Il "Dove" non ha moto senso.
Diciamo che il puntatore stesso è il "dove".
Un puntatore non è altro che un indirizzo.
Il tipo + semplcie di puntatore è l'indice di un array.
Se scrivo a[1], 1 è in pratica un puntatore, ahce se di tipo molto semplice.
Che significa a[1]?
Significa che da qualche parte in RAM esiste una serie di locazioni di memoria occupate da un array (a), tra le quali una parte sono utilizzate per memorizzare un valore nella posizione 1 dell'array.
Quando scrivi a[1] in pratica dici al programma:
"trovami il valore registrato nella posizione 1 dell'array A."
In questo contesto 1 rappresenta in pratica un puntatore ad una precisa area di memoria.
Ora, siccome tutto quanto sta in memoria RAM ha per forza di cose un indirizzo, potremmo avere un puntatore ad ogni array, oggetto, variabile, array, funzione, metodo, procedura etc etc etc.
In pratica, alcuni di essi non servono, ma molti di essi ci permettono di gestire alcune situazioni simpatiche.
Questo per iniziare.
Se hai capito questo primo passaggio, andiamo avanti, altrimenti fai qualche domanda mirata, ok?
AS


 ha scritto nel messaggio
news:oKQeO+HP3+qY=JZ6pO0o...@4ax.com...


 pratica non ho capito a cosa servono e come e quando utilizzarli :°(
I puntatori sono utilizzati per tantissimi compiti. Ti riassumo brevemente i
compiti più importanti:
- Quando devi gestire la memoria in maniera dinamica, ovvero non sai quanta
memoria ti serve per uno specifico scopo fino a quando il programma non sarà
in esecuzione. Per esempio l'allocazione dei buffers di i/o e degli array.
- In aggiunta a quanto detto sopra, vengono utilizzati per gestire e
manipolare le strutture dinamiche quali, liste, code, deque, alberi binari,
ecc, ecc
- vengono utilizzati per passare le variabili alle funzioni senza farne la
copia (passaggio per riferimento). Questo evita l'onere di copiare grosse
strutture dati e conserva le modifiche anche dopo il termine dell'esecuzione
della funzione.
- Possono essere utilizzati per rendere dinamica l'esecuzione del codice
(puntatori a funzione e polimorfismo)
- Rendono possibili molti dei meccanismi alla base della programmazione ad
oggetti (RTTI, Polimorfismo, VTable, ecc)
- Ti permettono di poter manipolare "direttamente" alcune zone di memoria
(laddove il SO lo consenta). Ad esempio, con il DOS, "puntando" all'area di
memoria B800h potevi gestire direttamente la memoria video.
- Rendono possibile il dialogo tra processi diversi e, talvolta, tra Thread
diversi.
- Fa funzionare la VCL a compile-time (dialoghi con l'IDE) e a run-time.
HO fatto soltanto una rapida e assolutamente non esaustiva carrellata di
alcuni dei campi in cui i puntantori sono vitali. Ti consiglio di cercare
qualche buon articolo in rete, anche in C/C++ (ce ne sono molti di + che in
Delphi) e provare a scrivere codice di esempio.
Saluti, il BiONDO

ok grazie