2014-02-27 59 views
0

我在項目中使用自定義的Metaphone Sqlite函數。這裏有一個鏈接功能:在32位和64位系統上,自定義Sqlite函數的行爲不同

https://github.com/geocommons/geocoder/blob/master/src/libsqlite3_geocoder/metaphon.c

當我運行在32位的Ubuntu的功能時,執行類似:

$ sqlite3 
SQLite version 3.7.17 2013-05-20 00:56:22 
sqlite> .load ./libsqlite3_geocoder.so 
sqlite> select metaphone('hitchcock'); 
XKK 

正如你可以看到,該函數返回無效結果(正確結果是HXKK)。在64位Ubuntu上,這個錯誤不會發生。奇怪的是,如果我將這個函數作爲獨立的C程序編譯(刪除所有Sqlite的東西),它在32位操作系統上也可以正常工作。

任何想法可能是什麼原因,以及如何解決它?

注意:如果你想嘗試一下自己,只是得到Github上code,在src/libsqlite3_geocoder目錄中運行make.so應建。你需要sqlite3開發庫來編譯它。

回答

0

找到它。在函數metaphone()中有一個錯誤,它在某一點檢查給定字符串範圍之外的字符,這在不同情況下顯然會返回不同的值(不確定這與OS是32位還是64位有關):

case 'H': 
    if (!varson(*(n - 1)) && (!vowel(*(n - 1)) || // see that "n - 1" here! 
           vowel(*(n + 1)))) 
    { 
     *Metaph++ = 'H'; 
    } 
    break; 
相關問題