Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PythonC扩展抛出分段错误_Python_C - Fatal编程技术网

PythonC扩展抛出分段错误

PythonC扩展抛出分段错误,python,c,Python,C,这里可能有多个问题,但是,假设模块样板是正确的(您没有包括它),并且您的setup.py能够正确地实际构建代码(它没有发布),并且您以明显的方式调用它,那么这里至少有一个可能的segfault: from distutils.core import setup, Extension module1 = Extension('gameMath', sources = ['interpolate.c'], includ

这里可能有多个问题,但是,假设模块样板是正确的(您没有包括它),并且您的setup.py能够正确地实际构建代码(它没有发布),并且您以明显的方式调用它,那么这里至少有一个可能的segfault:

from distutils.core import setup, Extension

module1 = Extension('gameMath',
                    sources = ['interpolate.c'],
                    include_dirs = ['/usr/include'],
                    libraries = ['math'])
setup (name = 'gameMath',
        version = '1.0',
        description = 'game math',
        ext_modules = [module1])
作为文件:

返回大小为n的新元组对象,失败时返回NULL。元组值初始化为指向Python对象的后续n C参数

您没有将它的指针传递给Python对象,而是将它加倍传递。因此,它将尝试将每个double解释为一个指针,这很可能是错误的。1

您需要使用构造两个Python
float
对象,或者动态转换它们:

PyObject *pos = PyTuple_Pack(tl, x, y);

似乎有效



一,。如果您不了解足够的C,但想知道它崩溃的原因:假设这里是64位,您要求它将double的64位解释为指针。例如,对于
-2.0
,这是指向
0xc00000000000000
的指针。它可能不在分配的内存中,更不用说指向有效的
PyObject
结构的指针了,该结构的指针本身指向分配的内存,即使所有这些页面都已分配,其中一个页面也可能是只读的,例如,引用计数增量失败。

您是否实际构建了一个模块对象,等正常情况下,我只是假设所有操作都是正确的,但既然你说你甚至不知道你是否正确地执行了
setup.py
,那么这似乎不是一个安全的假设……而且,。您所在的哪个平台具有Unix风格的路径,但却具有
-lmath
而不是
-lm
,因此它甚至可以首先编译?@abarnert macOS。可能还是-嗯,我试试看。但是,即使没有数学,当我返回一个列表时,它仍然会出错。此外,当代码为C,无效为C++,存储在<代码> .c/c>文件中,并用ditutul编译为C时,为什么要标记这个<代码> C++ ++代码>?你的真实代码是C++还是使用了错误的标签?如果是后者,请修复它。如果你使用C++,或者即使你只是打开了切换的可能性,你是否考虑过使用pycxx、Booo::Python,或者其他的包装器来为你做所有烦人的样板,自动管理RaIdCo与RAII等等?@ ababnt我只是把它标记为Python。不知何故,它一定是自动标记的。我对格式做了一个小小的更改,在
中放置一块文本可能会导致可访问性问题。@DietrichEpp这是一个脚注,大多数人不会感兴趣。把它全尺寸展示只会让人分心。有没有更好的方法可以在不显眼的小文本中显示它,这样就不会造成使用
sub
时的可访问性问题?对此我没有一个好的答案。请随意恢复编辑,我评论的主要原因是,如果您愿意,您将有机会恢复。@DietrichEpp我发现,两年后,我接受了
解决方案虽然难看,但对so来说已经足够了。FWIW-2.0位表示法实际上是0xc000000000000000(小端)。
PyObject *pos = PyTuple_Pack(tl, x, y);
PyObject *pos = Py_BuildValue("(ff)", x, y);