2009-05-24 26 views
5

Il migliore che ho inventato finora è che un catalogo di carte contenga istruzioni su come cucinare diversi tipi di cibo. Non contiene le informazioni su come cucinare il cibo, né le istruzioni su come cucinare il cibo stesso, ma può indicarti le istruzioni pertinenti che si trovano altrove. È una buona analogia perché dimostra la flessibilità di poter cucinare diversi tipi di cibo (messicano, vegetariano, indiano, ecc.) Ma la nozione di un catalogo di carte viene rapidamente sostituita con ricerche computerizzate. Mi è stato chiesto il temuto "Cos'è un catalogo di carte?" Usare Google come esempio di trovare le istruzioni di cottura è OK, ma non c'è una chiara distinzione di andare in un luogo fisico, trovare le istruzioni e "eseguirle". Qualcuno ha qualche analogia che ha funzionato per loro?Buone analogie con i puntatori a funzione?

+0

Ricordo una buona analogia in TAOCP nell'introduzione MIX che potrebbe essere leggermente modificata. –

risposta

0

Il catalogo delle schede sembra un po 'strano comunque. Andando con il tuo tema, una migliore analogia per i puntatori di funzione IMO sarebbe che sono una voce nell'indice di un libro di cucina. "Cajun ...... 39", quindi vai a pagina 39, e ci sono le istruzioni per cucinare Cajun.

+0

Mi piace soprattutto perché la semplicità di un numero di pagina è un indirizzo in cui risiede un set di istruzioni. – ojblass

5

Questa analogia sembra eccessivamente complessa.

Un puntatore di funzione è proprio come un numero di telefono di qualcuno che può ottenere il lavoro per te.

+0

Questo sembra astrarre la serie di istruzioni che si trovano altrove. – ojblass

+1

Ma qualsiasi analogia con qualcosa che contiene istruzioni (ad esempio un libro, manuale) mancherà "azione" (cioè che qualunque sia il puntatore della funzione che punta a fare effettivamente il lavoro per voi, in un modo). Quindi continuo a pensare che l'analogia dovrebbe essere con qualche tipo di agente. Cioè, puoi fare il lavoro da solo o puoi indicare qualcun altro che può fare il lavoro per te. –

0

Direi che un puntatore a funzione è come "L'indirizzo dell'implementazione" a una specifica "specifica dichiarata" (a meno che i vuoti di gestione non vengano gestiti). Spiega che il compilatore esamina il tipo di puntatore per verificare che stai utilizzando le specifiche con l'implementazione corretta e che l'implementazione è solo un blocco di istruzioni che prevedono una determinata convenzione di chiamata.

non un'analogia ma probabilmente più semplice.

+0

Mi sento come riccioli d'oro ... questo è troppo complicato. – ojblass

+0

Sono l'orso papà: P –

+0

C'era un lupo in quello o sto mescolando le mie storie? – ojblass

0

.NET li chiama delegates, forse questo è utile per le analogie.

Si potrebbe solo dire che un puntatore a funzione è l'indirizzo di qualcuno (un lavoratore, una società) a cui delegare il proprio lavoro.

+2

Bingo di buzzword .NET ... full-house. –

+0

Penso che estrae la serie di istruzioni da trovare altrove. – ojblass

1

Estendere l'idea della carta: immagina di giocare, in cui devi fare ciò che è scritto sul biglietto che ti è stato dato. Tutte le carte sono scritte prima del gioco e tu conosci l'elenco completo ma non conosci la carta che sceglierai.

+0

Mi sento come riccioli d'oro ... questo è troppo inventato. – ojblass

15

Non penso sia una buona idea provare e insegnare un concetto molto tecnico attraverso analogie non tecniche - presumibilmente le persone che insegni NON hanno bisogno di una vaga comprensione del "sommario di gestione", alla fine avranno bisogno di applicare concretamente il concetto, quindi perché tale deviazione?

Perché non spiegarlo con un semplice esempio di programmazione? Forse il migliore sarebbe un algoritmo di ordinamento generico (presumibilmente gli studenti hanno già imparato a ordinare).

"Un puntatore a funzione è fondamentalmente un modo per passare un pezzo di codice in giro per essere chiamato da un altro codice che non ha bisogno di conoscerlo in anticipo.Ad esempio, un algoritmo di ordinamento come quicksort o mergesort ha solo bisogno di sapere una cosa riguarda le cose che ordina: come confrontarle, ma se costruisci il confronto nell'algoritmo di ordinamento, sarà solo in grado di confrontare una cosa, come ints. Passando la logica di confronto come puntatore a funzione dell'algoritmo di ordinamento , per essere chiamato ogni volta che l'algoritmo ha bisogno di confrontare gli elementi, ora l'algoritmo può essere usato per ordinare qualsiasi cosa senza dover cambiare il suo codice - se vuoi usarlo per confrontare mele e arance, devi solo scrivere un frutto- funzione di comaprison e passare un puntatore ad esso all'algoritmo di ordinamento, insieme al frutto da ordinare. "

+0

Seguirò sicuramente gli esempi di codice ma il concetto di un puntatore è di per sé difficile e un puntatore a una funzione è un'astrazione extra. – ojblass

+3

Stavo per pubblicare qualcosa del genere. Per esperienza personale so che non imparo nulla dalle analogie (il fiume, la cascata, l'analogia con la pressione dell'acqua sulla corrente, la resistenza e la tensione mi danno ancora incubi :)). Anche se è una cosa difficile da capire, è meglio dirmi sempre la stessa cosa tecnica piuttosto che farmi un'analogia che non so se posso fidarmi di tutti i casi speciali :) – cwap

+0

Questo è un consiglio molto eccellente. – alex

0

Penso sempre ai puntatori di funzione che forniscono il meccanismo per passare le funzioni come argomenti (tra gli altri usi). Quindi se chiedi "come posso passare questa funzione ad un'altra funzione" la risposta sarebbe usare un riferimento (puntatore) ad essa. Non so se questo aiuta o no.

1

Un puntatore a funzione è come una carta di credito.:)

di fare un pagamento che non c'è bisogno di portare i soldi per fare la transazione da soli, basta strisciare la carta e lo fa la transazione per voi.

L'operazione può essere fatto da diverse banche un in modi diversi, ma una carta di credito sembra ancora allo stesso modo e funziona allo stesso modo. Non devi sapere tutti i dettagli dietro di esso, devi solo sapere come usare la carta.

2

suggerisco di dire ai tuoi allievi che cosa qualcosa è per non è quello che è . Più tardi, si chiederanno "qual è lo strumento giusto per risolvere questo problema?" invece di "come si chiama il mio problema?"

Immaginate si scrive un programma che prende una bitmap e si trasforma, che in un file immagine. Esistono vari tipi di formati per bitmap (bianco e nero, colori reali, colori reali con canale alfa, ecc.). E ci sono vari formati di file immagine (JPEG, PNG, GIF). Se provassi a scrivere quello senza i puntatori di funzione, avresti finito con algoritmi N * M: N per il numero di bitmap di input e M per il numero di formati di output supportati. In questo esempio di base, sarebbe 9 (3 * 3). Domani, il tuo capo arriva e vuole anche il supporto per il TIFF. Ciò significherebbe 12 (3 * 4) algoritmi. Un piccolo cambiamento nelle specifiche causa molto lavoro. Senza uscita.

Ma si può definire tre puntatori a funzione: getWidth(bitmap), getHeight(bitmap), getPixel(bitmap, x, y)

Ora avete solo bisogno di N algoritmi che implementano questi tre PQ. Ogni algoritmo funziona con ogni tipo di bitmap e sa come leggerlo. Gli algoritmi di output non si preoccupano più di come sia l'immagine di input, prendono solo i tre FP per accedere ai dati di immagine ora astratti. Quindi finisci con 6 (3 + 3) algoritmi e quando il tuo capo viene fornito con TIFF, devi solo aggiungere un singolo algoritmo: 7 invece di 12.

Dal punto di vista del computer, un FP è un trampolino Invece di iniziare a eseguire il codice all'indirizzo FP (chiamata di funzione normale), legge l'indirizzo memorizzato e inizia a eseguire il codice a cui punta l'indirizzo nei punti FP.

Il codice divertente è necessario scrivere è solo quello di rendere il compilatore felice. In assembler, sembra piuttosto semplice. funzione di chiamata normale: puntatore

lea.l someFunction,a0 # Load address of someFunction 
    jsr.l a0    # Jump to subroutine 

Funzione:

lea.l functionPointer,a0 # Load address of functionPointer 
    move.l (a0),a0    # Load what is stored at functionPointer into a0 
    jsr.l a0     # Jump to subroutine 

Come si può vedere, solo un singolo differenza istruzioni.

+0

+1 per teoria attuale. –

0

penso che un "puntatore" può essere definito un "identificatore" (che è ragionevole, perché 'indirizzo di memoria' di un esempio è la sua 'identità'). Quindi un "puntatore a una funzione" è solo "una variabile che memorizza l'identità di qualche funzione" (supponendo che tu sappia cos'è una "funzione").

0

Questa clip descrive CDS (Credit Default Swaps). È esattamente il modo in cui i puntatori influenzano il tuo sistema.

http://www.youtube.com/watch?v=KPNdYtrlgaU#t=120s

"Qui sappiamo di avere uno strumento di un particolare strumento finical che è dimostrabile pericolosa, crea lunghe catene di rischio che sono vulnerabili al fallimento di singoli trader o di mercato partipants in quella catena e questi gli strumenti in grado di influenzare permettono la creazione di spirali viziose, in cui il prezzo del CDS interagisce con il prezzo vincolato, il prezzo di mercato e si può avere una spirale discendente ".

Quello che mi dicono le mie orecchie: "Non creare dipendenze che creino lunghe catene di sistemi che si infrangono".

Quindi se sanno cosa sono i CD. Allora sarà facile. :)

Problemi correlati