2016-07-21 2 views
1

Я пытаюсь получить доступ к dll C++ из python (я новичок в Python). Я преодолел многие проблемы, связанные с вызовами, и, наконец, получил его для запуска без какой-либо ошибки компиляции/связывания. Однако, когда я печатаю возвращаемый массив из dll C++ в python, он показывает все случайные инициализированные значения. Похоже, что значения были неправильно возвращены.C++ DLL возвращает указатель, вызываемый из Python

Мой код на C++ выглядит следующим образом.

double DLL_EXPORT __cdecl *function1(int arg1, int arg2, double arg3[],int arg4,double arg5,double arg6,double arg7, double arg8) 
{  
     double *Areas = new double[7]; 

     ....Calculations 

     return Areas; 
} 

Мой питон код выглядит следующим образом:

import ctypes 

CalcDll = ctypes.CDLL("CalcRoutines.dll") 

arg3_py=(ctypes.c_double*15)(1.926,1.0383,0.00008,0.00102435,0.0101,0.0,0.002,0.0254,102,1,0.001046153,0.001046153,0.001046153,0.001046153,20) 
dummy = ctypes.c_double(0.0) 

CalcDll.function1.restype = ctypes.c_double*7 
Areas = CalcDll.function1(ctypes.c_int(1),ctypes.c_int(6),arg3_py,ctypes.c_int(0),dummy,dummy,dummy,dummy) 

for num in HxAreas: 
    print("\t", num) 

Выход оператора печати, как показано ниже:

 2.4768722583947873e-306 
    3.252195577561737e+202 
    2.559357001198207e-306 
    5e-324 
    2.560791130833573e-306 
    3e-323 
    2.5621383435212475e-306 

Любое предложение о том, что я делаю неправильно очень ценится.

+1

Обратите внимание, что функции, возвращающие Структуры не всегда делают это так же, как для разных компиляторов (я узнал об этом на собственном горьком опыте) , Способ, которым ваш C++-компилятор возвращает такие структуры, может быть несовместим с тем, как ожидает ваша версия Python. –

+0

http://stackoverflow.com/a/6731737/95954 –

+2

Вероятно, лучше вернуть массив двойников, который был выделен с помощью 'malloc()', поэтому он может быть освобожден ctypes. –

ответ

1

Вместо

CalcDll.function1.restype = ctypes.c_double * 7 

должно быть

CalcDll.function1.restype = ctypes.POINTER(ctypes.c_double) 

, а затем

Areas = CalcDll.function1(ctypes.c_int(1), ctypes.c_int(6), arg3_py, 
          ctypes.c_int(0), dummy, dummy, dummy, dummy) 

for i in range(7): 
    print("\t", Areas[i]) 

Я не уверен, что ctypes делает в случае 'ctypes.c_double * 7' , если он пытается извлечь семь двойников из стека или что.

Испытано с

double * function1(int arg1, int arg2, double arg3[], 
        int arg4, double arg5, double arg6, 
        double arg7, double arg8) 
{ 
    double * areas = malloc(sizeof(double) * 7); 
    int i; 

    for(i=0; i<7; i++) { 
     areas[i] = i; 
    } 

    return areas; 
} 

значения в массиве напечатаны правильно с restype = ctypes.POINTER(ctypes.c_double)

+0

это сработало отлично. Спасибо. – snkp

Смежные вопросы