2016-07-19 3 views
1

Итак, у меня есть класс C++, который я переношу на C, поэтому я могу использовать его в Python с использованием ctypes. декларация класса C++:c указатели и ctypes

// Test.h 
class Test 
{ 
public: 
    static double Add(double a, double b); 
}; 


//Test.cpp 
#include "stdafx.h" 
#include "Test.h" 

double Test::Add(double a, double b) 
{ 
    return a + b; 
} 

C обертывание:

// cdll.h 
#ifndef WRAPDLL_EXPORTS 
#define WRAPDLL_API __declspec(dllexport) 
#else 
#define WRAPDLL_API __declspec(dllimport) 
#endif 

#include "Test.h" 
extern "C" 
{ 
    WRAPDLL_API struct TestC; 

    WRAPDLL_API TestC* newTest(); 
    WRAPDLL_API double AddC(TestC* pc, double a, double b); 
} 

//cdll.cpp 
#include "stdafx.h" 
#include "cdll.h" 

TestC* newTest() 
{ 
    return (TestC*) new Test; 
} 

double AddC(TestC* pc, double a, double b) 
{ 
    return ((Test*)pc)->Add(a, b); 
} 

Python скрипт:

import ctypes 
t = ctypes.cdll('../Debug/cdll.dll') 
a = t.newTest() 
t.AddC(a, 2, 3) 

Результат t.AddC (а, 2, 3) всегда есть некоторое отрицательное целое число , Проблема с указателем, но я не знаю, в чем проблема. У кого-нибудь есть идеи?

+0

Покажите нам свой полный код на C и C++. – user4759923

+2

Я редактировал вопрос, теперь есть полный код C и C++ – kjrkvc

ответ

2

Как AddC является статической функцией, указатель не является вашей проблемой.

Вам необходимо пройти double значения AddC и получить двойной тип обратно:

t.AddC.restype = c_double 
t.AddC(a, c_double(2), c_double(3)) 

The documentation for ctype объясняет все это.

+0

Спасибо. Оно работает. – kjrkvc

1

As stated in the documentation

По умолчанию функций предполагается возвращать тип C Int. Другие типы возвращаемых данных можно задать, установив атрибут restype объекта функции.

Так просто добавить

t.AddC.restype = c_double 
t.AddC(a, 2.0, 3.0) 

и вы получите 5.0 вместо этого.

+0

2 и 3, вероятно, передаются как целые числа, поэтому результат может не быть 5.0. –

+0

О, верно, это правда. Благодарю. Возможно, нужно также установить «argtypes». – tynn

+0

На самом деле вам нужно сделать это вот так: – kjrkvc

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