0

i tried to compile a python module called distance, whith c "python setup.py install --with-c" using msvc 2017 on windows 10, i got this error ,

Cdistance / distance.c (647): error C2099: initializer is not a constant

Cdistance / distance.c (689): error C2099: initializer is not a constant

Error: command 'C: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ BuildTools \ VC \ Tools \ MSVC \ 14.10.25017 \ bin \ HostX64 \ x64 \ cl .exe 'failed with exit status 2

here is the code on line 647

   646 PyTypeObject IFastComp_Type = {
   647     PyVarObject_HEAD_INIT(&PyType_Type, 0)
   648  "distance.ifast_comp", /* tp_name */
   649  sizeof(ItorState), /* tp_basicsize */
   650  0, /* tp_itemsize */
        (destructor)itor_dealloc, /* tp_dealloc */
        0, /* tp_print */
        0, /* tp_getattr */
        0, /* tp_setattr */
        0, /* tp_reserved */
        0, /* tp_repr */
        0, /* tp_as_number */
        0, /* tp_as_sequence */
        0, /* tp_as_mapping */
        0, /* tp_hash */
        0, /* tp_call */
        0, /* tp_str */
        0, /* tp_getattro */
        0, /* tp_setattro */
        0, /* tp_as_buffer */
        Py_TPFLAGS_DEFAULT, /* tp_flags */
        ifast_comp_doc, /* tp_doc */
        0, /* tp_traverse */
        0, /* tp_clear */
        0, /* tp_richcompare */
        0, /* tp_weaklistoffset */
        PyObject_SelfIter, /* tp_iter */
        (iternextfunc)ifastcomp_next, /* tp_iternext */
        0, /* tp_methods */
        0, /* tp_members */
        0, /* tp_getset */
        0, /* tp_base */
        0, /* tp_dict */
        0, /* tp_descr_get */
        0, /* tp_descr_set */
        0, /* tp_dictoffset */
        0, /* tp_init */
        PyType_GenericAlloc, /* tp_alloc */
        ifastcomp_new, /* tp_new */
    };

in the line 689 is another like strucure,

688  PyTypeObject ILevenshtein_Type = {
689     PyVarObject_HEAD_INIT(&PyType_Type, 0)
        "distance.ilevenshtein", /* tp_name */
        sizeof(ItorState), /* tp_basicsize */
        0, /* tp_itemsize */
        (destructor)itor_dealloc, /* tp_dealloc */
        0, /* tp_print */
        0, /* tp_getattr */
        0, /* tp_setattr */
        0, /* tp_reserved */
        0, /* tp_repr */

both referenced as follow, in the same page

762 if (PyType_Ready(&IFastComp_Type) != 0 || PyType_Ready(&ILevenshtein_Type)!= 0)
763 #if PY_MAJOR_VERSION >= 3
        return NULL;
    #else
        return;
    #endif

    Py_INCREF((PyObject *)&IFastComp_Type);
    Py_INCREF((PyObject *)&ILevenshtein_Type);

thanks

DavidW
  • 29,336
  • 6
  • 55
  • 86
Slimane amiar
  • 934
  • 12
  • 27

2 Answers2

2

i have found the solution, by looking to the definition of the structure PyTypeObject PyTypeObject , i have changed yVarObject_HEAD_INIT(&PyType_Type, 0) by PyVarObject_HEAD_INIT(NULL, 0) and it compiles successfully, and i have tried some functions and it works, so the error is caused by &PyType_Type which is a PyObject*, i know that because IFastComp_Type is a globale varailble it should be initialised by a constante, but i still don't know why the author of the module gave &PyType_Type as argument , thank you all for your comments.

Slimane amiar
  • 934
  • 12
  • 27
2

See the documentation for "defining new types".

PyVarObject_HEAD_INIT(NULL, 0)

This line is a bit of a wart; what we’d like to write is:

PyVarObject_HEAD_INIT(&PyType_Type, 0)

as the type of a type object is “type”, but this isn’t strictly conforming C and some compilers complain. Fortunately, this member will be filled in for us by PyType_Ready().

I presume that Visual C is the compiler that complains, and the module was written and tested with GCC...

DavidW
  • 29,336
  • 6
  • 55
  • 86