我在我们的开发机器(32位,运行32位python2.7)上使用pythoncapi编写了一个C包装器。此后,我不得不将包装器和C源代码移到另一台64位的机器上,该机器运行64位的Python2.6。C包装器中的以下代码在64位机器上返回分段错误,但在32位机器上不返回分段错误(在32位机器上工作正常):
static PyObject *tide3_tide_hours(PyObject *self, PyObject *args) {
double initHour, z0, delt;
char f_seasonal;
int numHours;
// Parse arguments from Python
if (!PyArg_ParseTuple(args, "ddsid", &initHour, &z0,
&f_seasonal, &numHours, &delt))
return NULL;
// Allocate memory for zhr, which is the output we want
zhr = (double *) malloc ((numHours) *sizeof (double));
// Call the C source code
int value = tide_hours(&tc, initHour,
z0, f_seasonal, numHours, zhr, delt);
// Construct the Python return object by defining
// a new list and looping over zhr
int i;
PyObject *l = PyList_New(0);
if (!l) {
printf("No list \n");
return NULL;
}
for (i=0; i < numHours; i++) {
PyList_Append(l,PyFloat_FromDouble(zhr[i]));
//printf("%f \n",zhr[i]);
}
// Free memory and return the Python list containing zhr to Python
free (zhr);
return l;
}
注意&tc只是我在Python中定义的一个结构类,并在C包装器的开头初始化。我想要zhr(在C源代码中由tide\u hours计算),如果我在for循环中取消对printf语句的注释,就可以看到它的正确值。如果我插入:
printf("Size of zhr: %d\n",sizeof(zhr));
在为zhr分配内存之后,我在32位机器上看到'4',在64位机器上看到'8'。我确信这就是代码返回分段错误的原因,但我不知道如何阻止这种情况发生。你知道吗
我检查了C包装器/Python代码的其余部分,并将问题缩小到本节。输入参数是正确的值和类型。如前所述,zhr的计算和输出是按tide\u hours正确的(如果我在for循环中使用printf),但是内存分配出了问题,这与32到64位的开关有关。我不熟悉编写C包装器(这是我的第一个包装器),所以我想知道是否有一种方法可以解决这个问题,或者是否有其他我甚至没有想到的东西导致了这个问题。提前谢谢,如果你需要更多的代码请告诉我。你知道吗
编辑时间:
两种选择:
1)确保您的包装器被移植到64位并重建它(也许这就是您要求帮助的内容如果是这样,
tide_hours
函数的原型/实现是什么?),或2)使用现有的32位编译包装器,然后您的64位计算机还需要安装32位python C运行时,然后您就可以将该运行时用于包装器。你知道吗
对于类似的过程,请阅读:
相关问题 更多 >
编程相关推荐