Как исправить эту ошибку CppHello.cpp(24): error C2440: 'return': cannot convert from 'char *[10]' to 'char *'

134
28 июля 2019, 09:20

Учусь писать расширения для 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()
Answer 1

Думаю, исходя из (абсолютно неверного!)

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.

Ну, а присваивать или копировать - зависит от решения, где хранится строка.

READ ALSO
extern Template from function in Class

extern Template from function in Class

Пробую унести из декларации класса Template в реализацию, все попытки приводят к ругани компилятора, не совсем понимаю как работает в этом случае...

144
Обнуление массива в Си

Обнуление массива в Си

Как правильно обнулить массив? Речь о любых типах массива, будь то символьный, целочисленный, динамический и тп Если способов несколько то желательно...

203
Символьный массив и перевод из двоичной системы в 10-ую [закрыт]

Символьный массив и перевод из двоичной системы в 10-ую [закрыт]

Есть символьный массив, в которые вводятся числа 0 и 1Нужно с помощью функции перевести элементы символьного массива из двоичной системы...

135
Rapidjson. Чего хочет SetString и как ему угодить?

Rapidjson. Чего хочет SetString и как ему угодить?

Использую RapidjsonВозникла нужда изменять строку

151