Как писать выражения #define с вложенными скобками в Cython?

Выражение C:

#define EFX_REVERB_PRESET_GENERIC \
    { 1.0000f, 1.0000f, 0.3162f, 0.8913f, 1.0000f, 1.4900f, 0.8300f, 1.0000f, 0.0500f, 0.0070f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0110f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.0000f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x1 }

Я хочу определить это выражение в файле.pxd.

Мне нужно передать это выражение в качестве параметров некоторым функциям C. Поэтому я не использую его для Python.

Источник: OpenAL-Soft: https://github.com/kcat/openal-soft/blob/master/include/AL/efx-presets.h

1 ответ

Стоит понимать, что не все имеет прямой перевод с C на Cython. В этом случаеEFX_REVERB_PRESET_GENERICне может быть определен с использованием типа, потому что это не тип - это просто набор скобок и чисел. Эти скобки и числа действительны только в небольшом количестве мест:

 void other_func(WhateverTheStructIsCalled s);

 void func() {
     WhateverTheStructIsCalled s = EFX_REVERB_PRESET_GENERIC; // OK
     s = EFX_REVERB_PRESET_GENERIC; // wrong - not an initialization
     other_func(EFX_REVERB_PRESET_GENERIC); // also doesn't work
 }

Поэтому он не очень подходит для модели Cython, поэтому вы не можете обернуть его напрямую.

Я бы сам написал небольшую оболочку C. Вы можете сделать это с помощью функции Cython "встроенный код C":

cdef extern from *:
    """
    WhateverTheStructIsCalled get_EFX_REVERB_PRESET_GENERIC(void) {
        WhateverTheStructIsCalled s = EFX_REVERB_PRESET_GENERIC;
        return s;
    }
    """
    WhateverTheStructIsCalled get_EFX_REVERB_PRESET_GENERIC()

Затем используйте get_EFX_REVERB_PRESET_GENERIC() для вызова этой функции и получения соответствующей инициализированной структуры.

Другие вопросы по тегам