【发布时间】:2019-07-08 18:07:36
【问题描述】:
我正在用 C 语言编写一个 python 扩展模块。当我在该模块的函数中声明一个结构数组大于 4 个元素时,Python 停止运行。
我正在编写模块以提高性能。 我已经声明了 3 个结构(“SKU”、“Cromosoma”、“Aptitud”)并且我想创建一个 Cromosoma 数组,但是当我尝试创建包含 4 个以上元素的数组时它会中断。
// need_for_speed.c extension module code
#include <Python.h>
#include <stdlib.h>
#define MAX_GENES_SIZE 2000
typedef struct{
char codigo[30];
double venta;
char nombre[100];
double categoria;
double peso;
double ubicacion_especifica;
double ubicacion_actual;
double ubicacion_a_mover;
double stock;
} SKU;
typedef struct{
double ubicaciones_rompe_regla;
double cercania_medio;
double desv_std_picks_x_seccion;
double peso_x_ubicacion;
} Aptitud;
typedef struct{
SKU genes[MAX_GENES_SIZE];
Aptitud aptitud;
int genes_size;
int edad;
}Cromosoma;
static PyObject* prueba(PyObject* self, PyObject* args){
Cromosoma a;
SKU s;
strcpy(s.codigo,"1212");
a.genes[0] = s;
Cromosoma poblacion[] = {a,a,a,a,a};
printf("codigo %s ", poblacion[0].genes[0].codigo);
return PyLong_FromDouble(1);
}
static PyMethodDef Methods[] = {
{"prueba", prueba, METH_NOARGS, "Prueba general"},
{ NULL, NULL, 0, NULL }
};
// Module Definition struct
static struct PyModuleDef need_for_speed = {
PyModuleDef_HEAD_INIT,
"need_for_speed",
"Modulo para aumento de la velocidad de procesamiento para el algoritmo genético",
-1,
Methods
};
// Initialize module
PyMODINIT_FUNC PyInit_need_for_speed(void)
{
PyObject *m;
m = PyModule_Create(&need_for_speed);
return m;
}
用于构建此模块的 setup.py:
from distutils.core import setup, Extension
setup(name = 'need_for_speed', version = '1.0',ext_modules = [Extension('need_for_speed', ['need_for_speed.c'])])
构建模块的命令:
python setup.py build
当我调用函数 prueba 时:
import need_for_speed
i = need_for_speed.prueba()
python 在不打印或返回任何内容的情况下停止运行,但如果在“prueba”函数中修改名为“poblacion”的数组,使其只有 4 个元素,它将完美运行,返回 1 并打印“codigo 1212”。
顺便说一句,我使用的是 Windows。
【问题讨论】:
-
我认为没有理由相信所提供的代码对所描述的行为负责,即使我们规定通过将缺少的
}插入到Cromosoma类型定义。至少与数组无关。我们需要善意 minimal reproducible example 来确定可能发生的情况。 -
抱歉缺少 } 和最小可重现示例所需的缺少代码。我刚刚编辑了它。