Учусь писать расширения для Python 3 на C++
HHello.h
// заголовочный файл класса HHello.h
// интерфейс класса
namespace hello {
// объявление класса
class CppHello // имя класса
{
public: // спецификатор доступа public
// пример объявления строки
char* name[10]; // имя
CppHello(); // конструктор класса
~CppHello();//
char* setName(char* name);
char* message(); // функция (метод класса) выводящая сообщение на экран
}; // конец объявления класса Hello
}
CppHello.cpp
// файл реализации класса CppHello.cpp
// подключаем интерфейс класса к файлу его реализации
#include "HHello.h"
using namespace hello;
CppHello::CppHello() // конструктор класса
{
}
CppHello::~CppHello() // деструктор класса
{
}
char* CppHello::setName(char* name) {
name = name;
return "Ok.";
}
char* CppHello::message() {
return "Hello", name;
}
hello.pyx
cdef extern from "HHello.h" namespace "hello":
cdef cppclass CppHello:
CppHello() except +
char* name
char* setName(char*)
char* message()
cdef class PyHello:
cdef CppHello *cpp_hello
def __cinit__(self):
self.cpp_hello = new CppHello()
def __dealloc__(self):
del self.cpp_hello
def setName(self, name):
return self.cpp_hello.setName(name)
def message(self):
return self.cpp_hello.message()
Вывод командной строки
CppHello.cpp
CppHello.cpp(24): error C2440: 'return': cannot convert from 'char *[10]' to
'char *'
CppHello.cpp(24): note: Types pointed to are unrelated; conversion requires
reinterpret_cast, C-style cast or function-style cast
error: command 'C:\\Program Files\\Microsoft Visual Studio
14.0\\VC\\BIN\\cl.exe' failed with exit status 2
P.S. Ну и хотелось бы услышать советы и замечания
Что должно получиться?
from hello import PyHello
def main():
hello = PyHello()
print(hello.setName(b"Александр"))
print(hello.message()) # --> Привет Александр
if __name__ == '__main__':
main()
Думаю, исходя из (абсолютно неверного!)
char* CppHello::setName(char* name) {
name = name;
return "Ok.";
}
вы хотели использовать указатель
char* name;
Если же вы хотели хранить строку во внутреннем массиве - то нужно
char name[10];
и
strcpy(name...
Теперь вернемся к конкретной ошибке
return "Hello", name;
Это не Питон, вы тут возвращаете только name
(см. "оператор запятая").
А вот тут
char* CppHello::setName(char* name) {
name = name;
return "Ok.";
}
вы присваиваете переданному аргументу его же :) - чтобы работать в такой ситуации с членом класса name
, нужно использовать this->name
.
Ну, а присваивать или копировать - зависит от решения, где хранится строка.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Пробую унести из декларации класса Template в реализацию, все попытки приводят к ругани компилятора, не совсем понимаю как работает в этом случае...
Как правильно обнулить массив? Речь о любых типах массива, будь то символьный, целочисленный, динамический и тп Если способов несколько то желательно...
Есть символьный массив, в которые вводятся числа 0 и 1Нужно с помощью функции перевести элементы символьного массива из двоичной системы...
Использую RapidjsonВозникла нужда изменять строку