Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Cython и std::string

#cpp #строки #cython


Здравствуйте, я недавно начал использовать cython в своих проектах, и столкнулся
с проблемой приведения типов. Есть функция, которая принимает на вход std::string и
возвращает std::string, но если в python коде изменить эту строку, то получается сегфолт,
непонимаю как с этим справится, объясните пожалуйста, что я делаю не так?

Код Cython:

cdef public string uploadfile(string fileid, string username):
    return ("test_str" + str(username))


Код C++:

#include 
#include 
#include 
#include 
#include 

using namespace std;

int main(int argc, char **argv)
{
void *handle;
string (*func_0)(string);
char *error;
string parameter;
string parameter_1;


handle = dlopen("/home/ks/storage/modules/webui/webui.so", RTLD_LAZY);
if (!handle) {
    fprintf(stderr, "%s\n", dlerror());
    exit(EXIT_FAILURE);
}

dlerror();

string (*func_1)(string, string);
*(void **) (&func_1) = dlsym(handle, "uploadfile");

if ((error = dlerror()) != NULL)  {
    fprintf(stderr, "%s\n", error);
    exit(EXIT_FAILURE);
}


cout << "Enter parameter \" fileid\": ";
cin >> parameter;
cout << "Enter parameter \" username\": ";
cin >> parameter_1;
(*func_1)(parameter, parameter_1);
cout << "called func_1" << endl;
cout << (*func_1)(parameter, parameter_1) << endl;
dlclose(handle);
exit(EXIT_SUCCESS);
}


Опять же, если создать переменную типа string, то её никак не могу инициализировать.
Этот код работает:

cdef public string uploadfile(string fileid, string username):
    cdef string s
    return s


если сделать вот так, то сегфолится:

cdef public string uploadfile(string fileid, string username):
    cdef string s = "text"
    return s




Проблема решена, если кто-то подскажет решение лучше - буду рад:

cdef public string uploadfile(string fileid, string username):
    cdef char *c_str_0 =  "Simple string from python \nfile = "
    cdef string simple_string =  c_str_0
    simple_string += fileid
    return simple_string

    


Ответы

Ответ 1



cdef public string uploadfile(string fileid, string username): cdef char *c_str_0 = "Simple string from python \nfile = " cdef string simple_string = c_str_0 simple_string += fileid return simple_string

Комментариев нет:

Отправить комментарий