Newsgroup: it.comp.lang.c
Titolo: Funzioni "dinamiche"

Salve ragazzi ho una domanda da farvi.
Osservate il seguente codice scritto in Turbo Pascal 7.0:
    procedure p1;
     begin
      Writeln('Esecuzione della procedura 1');
     end;
    var p2: procedure;
    begin
     p1;
     Addr(p2):=@p1;
     p2;
   end.
Esso da in output i messaggi:
    Esecuzione della procedura 1
    Esecuzione della procedura 1
che è proprio quello che volevo...
Qualcuno di voi sa come fare la stessa cosa in C++?
Grazie da Amleto.

 Qualcuno di voi sa come fare la stessa cosa in C++?
Certo, e` veramente simile:
    void p1() {
        printf("Esecuzione della procedura 1\n");
    }
    void (*p2)();
    int main() {
        p1();
        p2 = p1;
        p2();
        return 0;
    }
Alex


Eccolo qua...
void p1();
main()
{void (*p2)(void);
 clrscr();
 p1();
 p2=p1;
 (*p2)();
 getch();
}
void p1()
{
 printf("\n     ECCOLO     ");
}
Fai attenzione all'utilizzo dei puntatori a fuinzioni in C.Comunque sono
descritti bene su praticamente tutti i libri sul lunguaggio.
ciao
Zag
zag...@libero.it


Scusa, Alex, ma sei sicuro della chiamata a p2()? Io penso che debba
essere riscritta cosě: 
(*p2)();
Dimmi se sto sbagliando. Ciao!



Invece ha ragione Alex: quando dopo aver assegnato un puntatore a
funzione lo puoi usare tranquillamente come se fosse la funzione
stessa, quindi č giusto chiamare la funzione cosě:
p2()
Il metodo che proponi tu non č sbagliato, ma appesantisce il codice
con simboli inutili.
Credo perň che alcuni vecchi compilatori C non accettassero p2(), ma
fosse necessario indicare (*p2)().
Paolo

fosse necessario indicare (*p2)().
Grazie mille, Paolo! Ero rimasto ai tempi di Kernighan e Ritchie, sai...



... E allora non sei indietro. Le uniche modifiche sono state
apportate dall'ANSI.
Il libro "nuovo" di K&R si chiama "linguaccio c - ansi c" proprio
perché il linguaggio è stato standarizzato dall'ansi.
Paolo

 wrote:
[ snip ]
PP>Scusa, Alex, ma sei sicuro della chiamata a p2()? 
[root@fokhouse /root]# grep -A 23 ^4\.12 /usr/doc/FAQ/txt/C.FAQ
4.12:   I've seen different methods used for calling functions via
        pointers.  What's the story?
A:      Originally, a pointer to a function had to be "turned into" a
        "real" function, with the * operator (and an extra pair of
        parentheses, to keep the precedence straight), before calling:
                int r, func(), (*fp)() = func;
                r = (*fp)();
        It can also be argued that functions are always called via
        pointers, and that "real" function names always decay implicitly
        into pointers (in expressions, as they do in initializations;
        see question 1.34).  This reasoning, made widespread through pcc
        and adopted in the ANSI standard, means that
                r = fp();
        is legal and works correctly, whether fp is the name of a
        function or a pointer to one.  (The usage has always been
        unambiguous; there is nothing you ever could have done with a
        function pointer followed by an argument list except call the
        function pointed to.)  An explicit * is still allowed (and
        recommended, if portability to older compilers is important).
[root@fokhouse /root]#
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

(*p2)();
Non stai sbagliando, ma viene accettata anche la forma p2()...
Paolo
-----------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
-----------------------------------------------

 Dimmi se sto sbagliando. Ciao!
"Stai sbagliando", nel senso che la notazione che tu proponi funziona,
ma funziona anche quella che preferisco io.  L'operatore di "()"
(chiamata di funzione) applicato ad un puntatore a funzione ne
causa l'implicito de-referencing, quindi non occorre (anche se
non causa danni) porre un de-referencing esplicito come tu fai.
Questo vale "da sempre" in C++; in C, da quando esiste lo
standard ISO (in realta` da un po' prima, cioe` dal precedente
standard ANSI, e da varie implementazioni di C ancora piu`
vecchie).  Se uno deve compilare su di un compilatore C che
abbia piu` di 20 anni circa, allora la notazione che tu proponi
e` senza dubbio preferibile.
Alex

>abbia piu` di 20 anni circa, allora la notazione che tu proponi
mmhh...20 anni...Zortech C 1.0 ? :)
a pensarci bene, quale e' stato il primo compilatore C (e C++) 
commerciale? io non ho tanta memoria storica...
-- 
universe::earth::internet::albion->Greetz++;
 
darX...@tin.it
 
alb...@libero.it
  Fido 2:335/234.21   
http://darxstar.cjb.net
  ICQ UIN# 11151997 - eggdrop on demand
<the trees that whisper in the evening...>

Su DOS che io ricordi, Lattice C, poi Microsoft C. Io devo averlo
incontrato intorno a '85-'86. Il primo in assoluto probabilmente risale
al primo UNIX commerciale, forse Interactive, che io sappia dell'inizio
degli '80.
Per il C++ si puo' dedurre da "Design & Evolution..." di B. Stroustrup.
Io ne ho incontrato uno su SCO Unix intorno al '93, ma potrebbero
essercene stati di precedenti.
Ciao,
Nicola

 commerciale? io non ho tanta memoria storica...
I primi compilatori C (e, separatamente, i primi compilatori
C++, qualche anno dopo) furono tutti prodotti dalla AT&T.
Non sono sicuro di cosa tu intenda per "commerciali", ma
tipicamente essi venivano distribuiti per il semplice costo dei
nastri, pur essendo AT&T una azienda commerciale.
Naturalmente, i primi compilatori C non giravano su PC (che
ancora non esisteva), bensi` su macchine come il glorioso
mini "PDP-11" della Digital Equipment.
Alex

 essercene stati di precedenti.
Usavo un compilatore C++ (su mainframe IBM) nel 1984 (decidemmo
che non era ancora un linguaggio maturo per le nostre esigenze, ma
poteva forse avere promessa per il futuro:-).
Alex

 commerciale? io non ho tanta memoria storica...
Io ho il compilatore HiSoft C per lo Spectrum che è del 1984.
Decisamente pre-ANSI e non supporta neanche i float/double, solo interi.
:-)
EMG

 
Pero'...
Ciao,
Nicola

 io UNIX si e' cominciato a venderlo all'inizio degli anni 80.
Mi pare invece che si vendessero degli Unix gia` negli anni '70.
Specificamente, dal 1978 (Unix version 7).  Penso che, gia`
l'anno prima, si potesse comprare la versione "Programmers'
Workbench" di Unix (solo per PDP-11, credo), ma non ne
sono sicuro.  Il "Portable C Compiler" di Johnson (la prima
implementazione di C alternativa ai compilatori di Ritchie e
Thomson) data dagli stessi anni (fine dei '70).
Le versioni di C per computer come ad esempio i mainframe
IBM (370) sono un po' precedenti, anche se e` discutibile in 
che senso fossero "commerciali" (all'epoca, il software per i
mainframe normalmente non si _vendeva_ -- piuttosto, si
_noleggiava_ come parte del noleggio del mainframe stesso).
Alex

Mi sa che devo rispolverare il diavoletto...
Ciao,
Nicola

Specificamente, dal 1978 (Unix version 7).  Penso che, gia`
Nel 1975, la sesta revisione di Unix fu messa ufficialmente in
commercio.
La famigerata Settima Edizione, invece, nel 1979, riscritta
interamente per i processori a 32 bit.
Xenix, invece, usci' in commmercio con l'avvento dei processori 386.
--
Andrea Laforgia        (
andrea_...@bigfoot.com
)

 Specificamente, dal 1978 (Unix version 7).  Penso che, gia`
SNIP
Posso confermare, unix era commerciale già nel 78 (al momento non riesco a
trovare notizie su date precedenti, ma giurerei di aver letto qualcosa al
riguardo). Però non so se era già incluso un compilatore C, anche se credo
di si...
San Vegeta



Unix e' stato scritto da Dennis Ritchie e Ken Thompson nel 1969 ai
Bell Labs su un PDP-7.  Nel periodo 1972-74 e' stato riimplementato
in C, rendendolo cosi' "portabile"; il linguaggio C data, credo, al
1971: ma di questa data non sono sicuro (delle altre due si).
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Univ. of Padova, Dept. of Physics - Padova, Italy            
lor...@pd.infn.it

Bell Labs su un PDP-7.
Se volete vedere com'era fatto un PDP7 :
http://www.digital.com/timeline/1964-3.htm
Mentre per il PDP11 (altro computer d'importanza storica) :
http://www.digital.com/timeline/1970-2.htm
La storia completa del C invece e' alla pagina :
http://www.cs.bell-labs.com/~dmr/chist.html
ed e' scritta dal suo autore (Dennis M. Ritchie)
ciao

>mini "PDP-11" della Digital Equipment.
E cosi' il PDP11 aveva uno (o piu') compilatori C? non lo sapevo...molto 
interessante
-- 
  . 
darX...@tin.it
      . 
darx...@wappi.com
 (GSM SMS)
   . Fido 2:335/241.5     . 
http://darxstar.cjb.net
  ICQ UIN# 11151997 -   
  trough Britannia: Gwydion the Mage <UO: EUROPA,now in Trisinc>
---
I don't want my freedom: there's no reason for living, with a broken heart
 -- The Queen

 interessante
E' una delle prime cose che si imparano del C dato che ne parlano K&R
nell'introduzione del loro libro. :-)
EMG