2009-05-24 66 views
5

到目前爲止,我所提出的最好的一個就是卡片目錄包含有關如何烹飪不同類型食物的說明。它不包含關於如何烹調食物的信息,也沒有關於烹飪食物本身的說明,但它可以指向您位於其他地方的相關說明。這是一個很好的比喻,因爲它展示了能夠烹飪不同類型食物(墨西哥,素食,印度等)的靈活性,但卡片目錄的概念正在迅速被電腦化搜索所取代。我被問到可怕的「什麼是卡片目錄?」使用谷歌作爲尋找烹飪指令的例子是可以的,但沒有明確區分去到物理位置,找到指令並「執行它們」。任何人都有類似的工作嗎?良好的函數指針類比?

+0

我記得在MIX-introduction中TAOCP的一個很好的比喻,可以修改一下。 – 2009-05-24 16:09:07

回答

0

無論如何,卡片目錄的東西似乎有點奇怪。跟你的主題一起,對於函數指針IMO來說,更好的比喻是它們是食譜索引中的條目。 「Cajun ...... 39」,所以你去第39頁,並有烹飪Cajun的指示。

5

這個比喻似乎過於複雜。

函數指針就像一個可以爲你完成工作的人的電話號碼。

+0

這似乎是抽象出位於別處的一系列指令。 – ojblass 2009-05-24 16:04:31

+1

但任何與包含指令(例如書籍,手冊)的東西類比都將錯過「動作」(即,無論函數指針指向什麼,實際上都會爲您完成某項工作)。 所以我仍然認爲類比應該是某種代理人。也就是說,你可以自己做這項工作,或者你可以指向可以爲你做這項工作的其他人。 – 2009-05-24 16:10:37

0

我想說一個函數指針就像「實現的地址」到特定的「聲明的規範」(除非你的處理空洞)。說明編譯器檢查指針類型以檢查是否使用了具有正確實現的規範,並且實現僅僅是一段期望特定調用約定的指令。

不是類比但可能更簡單。

+0

我覺得像金髮姑娘...這個太複雜了。 – ojblass 2009-05-24 16:07:13

+0

我是爸爸的熊:P – 2009-05-24 16:07:37

+0

那裏有狼嗎?還是我混淆了我的故事? – ojblass 2009-05-24 16:10:30

0

.NET稱它們爲delegates,這可能對類比有所幫助。

你可以說一個函數指針是你將工作委託給某人(一個工人,一個公司)的地址。

+2

NET流行詞賓果遊戲...滿堂的。 – 2009-05-24 16:05:43

1

擴展卡的想法:想象一下你玩一個遊戲,在那裏你必須做什麼是你給的卡上寫的東西。所有的牌都是在比賽前編寫的,你知道完整的列表,但不知道你要選擇的牌。

15

我不認爲通過非技術類比來嘗試和教授一個非常技術性的概念是一個好主意 - 大概你所教的人不需要模糊的「管理總結」友善的理解,他們最終需要具體應用這個概念,爲什麼這麼繞道呢?

爲什麼不用一個簡單的編程示例來解釋它?也許最好的一個會是一個通用的排序算法(大概學生已經學會了排序)。

「函數指針基本上是一種傳遞代碼的方法,可以被其他代碼預先調用,例如,像quicksort或mergesort這樣的排序算法只需要知道關於它的排序的一件事情是:如何比較它們,但是如果你將比較結果構建到排序算法中,它只能比較一個東西,比如整數。通過將比較邏輯作爲函數指針傳遞給排序算法,只要算法需要比較元素就可以調用該算法,現在可以使用該算法對所有內容進行排序,而無需更改其代碼 - 如果要使用它來比較蘋果和桔子,只需編寫一個基於水果的程序, comaprison函數,並將它的指針傳遞給排序算法,以及您的水果進行排序。「

0

我一直認爲函數指針提供了將函數作爲參數傳遞的機制(以及其他用途)。所以如果你問「如何將這個函數傳遞給另一個函數」,那麼答案就是使用一個引用(指針)。不知道這是否有幫助。

1

功能指針就像信用卡。:)

要進行付款,您不需要自己攜帶資金進行交易,只需刷卡即可完成交易。

交易可以由不同的銀行以不同的方式完成,但信用卡仍然看起來相同的方式,並以相同的方式工作。你不必知道背後的所有細節,你只需要知道如何使用該卡。

2

我建議告訴你的學生什麼是不是它。之後,他們會問自己:「解決這個問題的正確工具是什麼?」而不是「我的問題叫什麼?」

想象一下,你寫一個程序,需要一個位圖並將其轉換爲圖像文件。有各種格式的位圖(黑白,真彩色,帶alpha通道的真彩色等)。還有各種圖像文件格式(JPEG,PNG,GIF)。如果您試圖在沒有函數指針的情況下編寫該代碼,那麼您最終會得到N * M個算法:N代表輸入位圖的數量,M代表支持的輸出格式的數量。在這個基本的例子中,這將是9(3 * 3)。明天,你的老闆會出現,並希望支持TIFF。這意味着12(3 * 4)個算法。規格的微小變化會導致很多工作。死路。

但是你可以定義三個函數指針:getWidth(bitmap)getHeight(bitmap)getPixel(bitmap, x, y)

現在你只需要它們實現這三個的FPñ算法。每種算法都適用於每種位圖,並知道如何讀取它。輸出算法不再關心輸入圖像的樣子,他們只需要三個FP來訪問現在抽象的圖像數據。所以你最終得到了6(3 + 3)個算法,當你的老闆帶有TIFF時,你只需要添加一個算法:7而不是12.

從計算機的角度來看,FP是一個蹦牀。它不是開始在FP(普通函數調用)的地址上執行代碼,而是讀取存儲在那裏的地址,並開始執行地址保存在FP指向的代碼。

你需要寫的有趣的代碼只是爲了讓編譯器感到高興。在彙編中,這看起來很簡單。正常的函數調用:

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

函數指針:

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 

正如你所看到的,只是一個單一的指令差異。

0

我認爲一個「指針」可以稱爲「標識符」(這是合理的,因爲一個實例的'內存地址'是它的'身份')。所以「指向函數的指針」只是「存儲某個函數的標識的變量」(假設你知道'函數'是什麼)。

0

此剪輯描述CDS(信用違約互換)。這正是指針如何影響你的系統。

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

「在這裏,我們知道我們有一個特別的過分講究的文書,它demonstrably危險的工具,它創造風險的長鏈,其很容易受到個人交易或市場partipants在這一鏈條和這些失敗一種情緒中的工具允許產生惡性螺旋,其中CDS價格與約束價格相互作用,市場價格和你可以有一個下降的螺旋。「

我的耳朵告訴我的是:「不要造成依賴性,造成長時間的系統崩潰。」

因此,如果他們知道CDS是什麼。然後它會很容易。 :)