Суть вопросов в данный момент.
Имеем скомпилированную в Visuall Studio dll:
test_dll_for_py.h :
//#ifdef TEST_DLL_EXPORTS //#define TEST_DLL_API __declspec(dllexport) //#else //#define TEST_DLL_API __declspec(dllimport) //#endif #define TEST_DLL_API __declspec(dllexport) namespace TestDll { extern "C" TEST_DLL_API void Sq(int n); extern "C" TEST_DLL_API int MultInt(int a, int b); extern "C" TEST_DLL_API float MultFloat(float a, float b); }
test_dll_for_py.cpp :
// test_dll_for_py.cpp : Defines the exported functions for the DLL application. // #include "stdafx.h" #include "test_dll_for_py.h" #include <iostream> //#include <stdexcept> using namespace std; namespace TestDll { //Тестовые функции void Sq(int n) { for (int i = 1; i <= n; i++) std::cout << i*i << std::endl; } int MultInt(int a, int b) { return a * b; } float MultFloat(float a, float b) { return a * b; } }
И код на Python…
pycdll.py:
import ctypes from ctypes import * lib = cdll.LoadLibrary('test_dll_for_py.dll') print 'Library:' print lib print '\nSquares:' lib.Sq(10) print '\nint 10x100: ' print lib.MultInt(10, 100) print '\nfloat 10x100: ' print c_float(lib.MultFloat(c_float(10), c_float(100))).value print '\nfloat 5.5x100: ' print c_float(lib.MultFloat(c_float(5.5), c_float(100))).value
В выводе получаем:
pydev debugger: starting (pid: 3664)
Library:
<CDLL ‘test_dll_for_py.dll’, handle f90a0000 at 262ed30>
Squares:
1
4
9
16
25
36
49
64
81
100
int 10x100:
1000
float 10x100:
-858993472.0
float 5.5x100:
-858993472.0
Вообщем-то, что происходит с float-значениями? (с double то же самое)