从外部文件使用 Python CFFI 时会中断

python cffi breaks when used from external file

提问人:Seppukki 提问时间:5/14/2023 最后编辑:Seppukki 更新时间:5/14/2023 访问量:24

问:

我正在用 c 编写一个自组织映射实现,并尝试使用 cffi 将其绑定到 python。

我的包装器模块如下所示:

from ._SOM import ffi, lib

lib.init()


class SOM:
    def __init__(self, x, y, input_length, sigma, learning_rate):
        self.C_som = lib.createSOM(x, y, input_length, sigma, learning_rate)

    def random_weights_init(self, data):
        newData = []
        for d in data:
            temp = ffi.new(f"double[{len(data)}]")
            for index, elem in enumerate(d):
                temp[index] = elem
            newData.append(temp)
        lib.random_weights_init(self.C_som, newData, len(data))

    def train(self, data, iterations):
        newData = []
        for d in data:
            temp = ffi.new(f"double[{len(data)}]")
            for index, elem in enumerate(d):
                temp[index] = elem
            newData.append(temp)
        lib.train(self.C_som, newData, len(data), iterations)

    def winner(self, data):
        res = lib.winner(self.C_som, data)
        x = res[0]
        y = res[1]
        lib.free(res)
        return x, y


if __name__ == "__main__":
    S = SOM(10, 10, 3, 0.67, .05)
    S.random_weights_init([[.5, 6, 9], [7, 8, 7], [7, 7, 7]])
    S.train([[.5, 6, 9], [7, 8, 7], [7, 7, 7]], 10)
    r = S.winner([7, 8, 7])
    print(r)

运行此文件时,当我将第 1 行更改为

from _SOM import ffi, lib

在另一个文件中导入我的包装类时,如下所示:

from .SOM.SOM_test import SOM as C_SOM

并尝试使用它,我收到以下错误:

Process finished with exit code -1073740940 (0xC0000374)

在查找代码时,我发现这意味着堆损坏。 我的 C 源代码有问题吗?还是我的进口有问题?

编辑

C 代码本身存在问题。有一个类型为 double*** 的结构字段,我正在分配 float**、float* 并进入其中。

python-cffi

评论

0赞 Armin Rigo 5/14/2023
也许 C 库希望传递给的所有数据在调用期间保持活动状态?在这种情况下,您需要保持 ,例如将其存储在 上。random_weights_inittrainnewDatadef random_weights_init()self
0赞 Seppukki 5/14/2023
C 代码本身存在问题。有一个类型的结构字段,我正在调整,并进入其中。double***float**float*float

答:

0赞 Seppukki 5/14/2023 #1

C 代码本身存在问题。
有一个类型的结构字段,我正在调整,并进入其中。这很可能是堆损坏的原因。
double***float**float*float