精華區beta CompBook 關於我們 聯絡資訊
【函式指標 -- 文章勘誤】 侯捷 jjhou@ccca.nctu.edu.tw 1999.04.19 第一次發表於 清大.楓橋驛站(140.114.87.5).電腦書訊版(Computer/CompBook) ----------------------------------------------------------- RunPC 雜誌得知我正在翻譯 <C++ Primer> 3/e 後,提出邀請, 希望能率先刊登部份稿件。我徵得 Addison Wesley 的同意後 欣然接受。 我擷選了八個主題,分期刊載: 1. 函式指標 1999.03 2. 命名空間 1999.04 3. 函式模板 1999.05 4. C++ 異常處理 1999.06 5. 泛型演算法 1999.07 6. 類別 1999.08 7. STL 1999.09 8. 虛擬函式 1999.10 第一篇文章(RunPC 63 期,1999/03)的主題是函式指標。刊出 後得到謝勝仁先生的指教。謝勝仁先生指出了原文書中一個考慮 未週詳的地方(可說是一個 bug)。謝先生的指教如下。 來信一: > Hello 侯老師, > > 看了您在 RUN!PC 三月號的大作之後, 我定義了 sizeCompare 函式: > > int sizeCompare( const string &s1, const string &s2 ) { > if (s1.length()==s2.length()) return 0; > if (s1.length()>s2.length()) return 1; > return -1; > } > > 也修改了 main(): > > int main() { > PFI pfs = sizeCompare; > string as[10] = { "a", "light", "drizzle", "was", "falling", > "when", "they", "left", "the", "museum" }; > > sort( as, as + sizeof(as)/sizeof(as[0]) - 1, pfs ); > > for ( int i = 0; i < sizeof(as)/sizeof(as[0]); ++i ) > cout << "\t" << as[ i ].c_str() << "\n"; > return 0; > } > > 但執行的結果仍然是呼叫 lexicoCompare 的排列次序, 我無法理解到底 > 錯在那兒? 承蒙指教, 感激不盡. 來信二: > Hello 侯老師, > > 我找到錯誤了, 問題出在RUN!PC 62期294頁, sort()函式第20,21行 > > sort(s1,high-1); > sort(high+1,s2); > > 少了第三個參數, compare. > Best regards, ●讓我做個結論 RunPC 63 期(1999/03)的這篇文章中,有一個 sort() 函式, 利用遞迴方式呼叫自己,完成 quicksort 演算法。此函式有 三個參數,其中第三個參數是個函式指標,有預設參數值: int lexicoCompare( const string &, const string & ); int sort( string*, string*, PFI2S = lexicoCompare ); 1 void sort( string *s1, string *s2, 2 PFI2S compare = lexicoCompare ) 3 { 4 // stopping comdition for recursion 5 if ( s1 < s2 ) { 6 string elem = *s1; 7 string *low = s1; 8 string *high = s2 + 1; 9 10 for (;;) { 11 while ( compare( *++low, elem ) < 0 && low < s2 ); 12 while ( compare( elem, *--high ) < 0 && high > s1 ); 13 14 if ( low < high ) 15 low->swap(*high); 16 else break; 17 } // end, for(;;) 18 19 s1->swap(*high); 20 sort( s1, high - 1 ); // 謝勝仁先生指出的錯誤 21 sort( high + 1, s2 ); // 謝勝仁先生指出的錯誤 22 } // end, if ( s1 < s2 ) 23 } 由於 <C++ Primer> 一書 p.383~p.384 的 sort() 程式碼(如上) 於遞迴呼叫時並沒有指明第三個參數,所以總是使用預設值 lexicoCompare, 因此即使我們在最初呼叫 sort() 時指定了另一個自定的 compare 函式, 仍然得不到預期結果。 只要修改如下即可: 20 sort( s1, high - 1, compare ); 21 sort( high + 1, s2, compare ); 非常感謝 謝勝仁先生。這是 <C++ Primer> errata 未記錄的一個 bug。 我會在中譯本修正之。 另,不少朋友詢問 <C++ Primer> 中文版的進度。感謝關心,進度不錯。 原本預定的出版日期是 1999.09,我想可以提早。 -- the end --  -- ※ Origin: 楓橋驛站<bbs.cs.nthu.edu.tw> ◆ Mail: jjhou@ccca.nctu.edu.tw