c - 自定义 Sqlite 函数在 32 位和 64 位系统上的行为不同

标签 c sqlite 32bit-64bit

我正在使用自定义Metaphone项目中的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 位操作系统上也可以正常工作。

有什么想法可能是什么原因以及如何解决它吗?

注意:如果您想自己尝试一下,只需获取 code从 Github 上,在 src/libsqlite3_geocoder 目录中运行 make 并构建 .so。不过,您需要 sqlite3 开发库来编译它。

最佳答案

找到了。 Metaphone() 函数中存在一个错误,它在某一时刻检查给定字符串边界之外的字符,这显然在不同情况下返回不同的值(不确定这是否与操作系统是否相关) 32 位或 64 位):

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

关于c - 自定义 Sqlite 函数在 32 位和 64 位系统上的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22067720/

相关文章:

c - 找到突变最多的最长回文 DNA 子序列

c - 查找vxworks目标板内存泄漏

python - 将表单字段插入数据库(Bottle、sqlite)

sql - 在sql中,长度函数是O(1)还是O(length)

ruby-on-rails - Heroku:将 Postgres 数据库转储到 Rails 项目的本地 SQLite3 数据库中

c# - 单个 MSI 安装正确的 32 位或 64 位 c# 应用程序

c - 非常基本的加密

eclipse - 如何确定安装的 Eclipse 是 32 位版本还是 64 位版本?

linux - 64b Linux 如何知道管理 32b 应用程序?

c - 从字符串中删除子字符串