Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调用C++;使用ctypes的Python中的方法不起作用_C++_Python 2.7_Ctypes - Fatal编程技术网

C++ 调用C++;使用ctypes的Python中的方法不起作用

C++ 调用C++;使用ctypes的Python中的方法不起作用,c++,python-2.7,ctypes,C++,Python 2.7,Ctypes,我尝试使用Python与Python交互DLL,读取文档C++的签名如下: my_c_pp_function(user *param1[],const int_8 param2,const int_8 values3[],const int_8 length_param1) 本质上,C++函数需要一个用户列表、一个整数、一个值列表和用户数,也需要一个整数。 注意:用户是一个结构 包含姓名、年龄和id。类似于: typedef struct { char name[255]; int_16 ag

我尝试使用Python与Python交互DLL,读取文档C++的签名如下:

my_c_pp_function(user *param1[],const int_8 param2,const int_8 values3[],const int_8 length_param1)

本质上,C++函数需要一个用户列表、一个整数、一个值列表和用户数,也需要一个整数

。 注意:用户是一个结构 包含姓名、年龄和id。类似于:

typedef struct
{
char name[255];
int_16 age;
int_32 uid;
}user;
当我尝试使用ctypes从python代码调用此函数时,我会:

def call_my_c_pp_function(list_of_users,int_param2,list_of_values,int_lenght_of_list):


        myparam1=(ctypes.c_char_p * len(list_of_users))(*list_of_users)
        myparam2=ctypes.c_int8(int_param2)
        myparam3=(ctypes.c_int8 * len(list_of_values))(*list_of_values)
        myparam4=ctypes.c_int8(int_lenght_of_list)

    self.dll_object.my_c_pp_function.argtypes(ctypes.POINTER(ctypes.c_char_p),ctypes.c_int8,ctypes.POINTER(ctypes.c_int8),ctypes.c_int8)

        ret_value=self.dll_object.my_c_pp_function(myparam1,myparam2,myparam3,myparam4)
现在每次调用python函数时,我都会得到一个错误,如果函数成功,返回值应该是0,任何非零的数字都表明存在某种问题

我一直得到一个大的非零数作为返回值。 我可能做错了什么?我创建用户数组和值数组的方式是否错误

我不知道如何填充/使用我的Python代码中的C++用户结构,这样我的列表不仅仅是字符串列表,而是用户的列表 我正在Windows上使用Python2.7


假设您不能更改库函数的签名,则表示

我建议您为
c++
函数创建一个简单的适配器,它只是作为实际函数的接口。 此函数只需获取您需要的所有值,然后将它们转换为您需要的类型

下面是一个工作示例(使用python27测试)。注意,我为
int
数组中的元素数量添加了一个附加参数

py\u caller.py

import ctypes
import os


class user(ctypes.Structure):
    _fields_ = [("name", ctypes.c_char_p),
                ("age", ctypes.c_int),
                ("uid", ctypes.c_int)]


def create_users(count):
    users = (user * count)()
    for i in range(count):
        users[i].name = ctypes.c_char_p("user" + str(i))
        users[i].age = i
        users[i].uid = i * i
    return users


def create_values(count):
    values = (ctypes.c_int * count)()
    for i in range(count):
        values[i] = i ** 2
    return values


def main():
    os.environ['PATH'] += ";" + os.path.dirname(os.path.abspath(__file__))
    dll = ctypes.cdll.LoadLibrary('cppdll')

    count = 4
    users = create_users(count)
    n_users = ctypes.c_int(count)

    values = create_values(count)
    n_values = ctypes.c_int(count)

    some_int = ctypes.c_int(42)

    res = dll.func(users, n_users, some_int, values, n_values)
    print (res)


if __name__ == "__main__":
    main()
导出.h

#pragma once

typedef struct t_user
{
  char *name;
  int age;
  int uid;
};

extern "C" __declspec(dllexport) int func(t_user *users, int n_users, int val, int *values, int n_values);
导出.cpp

#include "export.h"
#include <iostream>

int func(t_user *users, int n_users, int val, int *values, int n_values)
{
  std::cout << "users:\n";
  for (auto i = 0; i < n_users; ++i)
  {
    std::cout << users[i].name
      << ": " << users[i].age 
      << " - " << users[i].uid << "\n";
  } 

  std::cout << "values:\n";
  for (auto i = 0; i < n_values; ++i)
    std::cout << values[i] << "\n";

  std::cout << "some int: " << val << "\n";

  // do something else with the values
  // such as calling your actual library function

  return 1;
} 
#包括“export.h”
#包括
int func(t_用户*用户,int n_用户,int val,int*值,int n_值)
{

STD::CUT如果第一个参数真的是“代码> STD::Stry*<代码>,您必须找到某种方法填充它,因为<代码> char */COD>不是<代码> STD::String 您不能在函数的公共接口中使用<代码> STD::String (因为它是C++类型).
ctypes
仅支持与C兼容的数据类型。要调用它,您必须知道如何构造或以其他方式获取
用户,但您尚未向我们展示有关该类型的任何信息。感谢您的帮助。我非常感谢。