• Как правильно вывести структуру из dll на c++ в Python?

    Vindicar
    @Vindicar
    RTFM!
    Разумеется, тебе и реализацию функции надо будет поправить, её заголовок должен совпадать с тем, который ты описал в заголовочном файле. Это же азы!
    Более того, у тебя и тело функции изменится. Теперь вместо
    __declspec(dllexport) outdata SpiralsCoord(float x1, float x2, float x3, float x4, float x5, int x6) {
    outdata data;
    data.out_x1 = xy1;
    data.out_x2 = xy2;
    data.out_x3 = xy3;
    return data;
    }

    будет код вроде
    __declspec(dllexport) void SpiralsCoord(float x1, float x2, float x3, float x4, float x5, int x6, outdata* data) {
    //используем оператор ->, так как data теперь указатель на структуру, а не сама структура
    data->out_x1 = xy1; 
    data->out_x2 = xy2;
    data->out_x3 = xy3;
    }

    Ну а в Питоне тогда для передачи последнего параметера нужно будет сделать кое-что.
    1. Описать структуру outdata как класс-потомок ctypes.Structure.
    2. Создать экземпляр этой структуры.
    3. Описать прототип функции SpiralsCoord (или под каким именем она экспортируется?), указав типы параметров и возвращаемого значения.
    4. Использовать ctypes.byref() при передаче экземпляра структуры последним параметром.
    Ответ написан
    Комментировать
  • Как правильно вывести структуру из dll на c++ в Python?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Возврат структуры по значению при определённых условиях (связанных с размером и типами данных полей структуры) добавляет скрытый параметр (указатель на область памяти куда нужно вернуть результат), который функция будет ожидать. Это твой случай, и поэтому все остальные параметры съехали на один. Решение -- либо научить ctypes тому, что возвращается сложный тип и у функции может быть скрытый параметр (полагаю, что так: ctypes.restype(outdata), где outdata -- тип rez1, см), либо переделать функцию так, чтобы она не требовала скрытого параметра (например, добавив явный указатель на результат в список параметров, см).
    Ответ написан
    4 комментария