CMakeLists.txt

# project(工程名)
project(blog-3123958139-1) # add_library(链接库名称 SHARED 链接库代码)
add_library(dll_ SHARED dll_.cpp)

dll_.cpp

#include <iostream>

using namespace std;

// c++ 结构体定义
struct cpp_struck_ { // 股票代码,字符串
char *stock_name_; // 日期,字符串数组
char *stock_date_[]; // 开高低收四组价格,浮点型数组
double stock_open_[];
double stock_high_[];
double stock_low_[];
double stock_close_[]; // 成交量,浮点型数组
double stock_volume_[]; // 长度,整型
int stock_len_;
int ma_len_;
}; // 声明为标准 C 格式导出的函数
extern "C" { // 传入结构体指针,传出结构体指针
cpp_struck_ *dll_function_1(cpp_struck_ *py_struck_pointer_) {
/*
* 数据处理部分...
*
*
*
*/
cpp_struck_ *cpp_struck_pointer_;
cpp_struck_pointer_ = py_struck_pointer_;
return cpp_struck_pointer_;
}
}

test_dll_.py

import tushare
from ctypes import * # 下载测试数据
sh_data_frame_ = tushare.get_hist_data('sh')
stock_name_ = 'sh'
stock_date_ = sh_data_frame_.index.values
stock_open_ = sh_data_frame_['open'].values
stock_high_ = sh_data_frame_['high'].values
stock_low_ = sh_data_frame_['low'].values
stock_close_ = sh_data_frame_['close'].values
stock_volume_ = sh_data_frame_['volume'].values
stock_len_ = len(sh_data_frame_)
ma_len_ = 2 # 打印旧数据作为比较
print("old_date_ = ", list(stock_date_))
print("old_open_ = ", list(stock_open_)) # python 结构体定义
class py_struct_(Structure):
_fields_ = [("stock_name_", c_wchar_p), # 注意字符串格式要用 c_wchar_p 而不是 c_char_p
("stock_date_", c_wchar_p * stock_len_),
("stock_open_", c_double * stock_len_),
("stock_high_", c_double * stock_len_),
("stock_low_", c_double * stock_len_),
("stock_close_", c_double * stock_len_),
("stock_volume_", c_double * stock_len_),
("stock_len_", c_int),
("ma_len_", c_int)] # python 结构体实例化,初始化
py_struct_1 = py_struct_()
py_struct_1.stock_name_ = stock_name_
py_struct_1.stock_date_ = (c_wchar_p * stock_len_)(*stock_date_)
py_struct_1.stock_open_ = (c_double * stock_len_)(*stock_open_) # 传入指针实例
py_struct_1_pointer_ = byref(py_struct_1) # 获取 dll 句柄
h_dll_ = CDLL(
'C:\\Users\\Perelman\\.CLion2016.1\\system\\cmake\\generated\\blog-3123958139-1-6c04ac5e\\6c04ac5e\\Debug\\libdll_.dll') # 定义 dll 返回值类型为 python 结构体指针
h_dll_.dll_function_1.restype = POINTER(py_struct_) # 返回 dll 结构体指针
cpp_struct_pointer_ = h_dll_.dll_function_1(py_struct_1_pointer_) # 结构体指针取内容
cpp_struct_contents_ = cpp_struct_pointer_.contents # 保存结果为 python list 格式
new_date_ = []
for value in cpp_struct_contents_.stock_date_:
new_date_.append(value)
print("new_date_ = ", new_date_) # 保存结果为 python list 格式
new_open_ = []
for value in cpp_struct_contents_.stock_open_:
new_open_.append(value)
print("new_open_ = ", new_open_)

ctypes 操作 python 与 c++ dll 互传结构体指针的更多相关文章

  1. Lua C++互传结构体实例

    转自:http://bbs.csdn.net/topics/350261649 =====main.cpp======= #include "stdio.h" extern &qu ...

  2. python 传递结构体指针到 c++ dll

    CMakeLists.txt # project(工程名) project(xxx) # add_library(链接库名称 SHARED 链接库代码) add_library(xxx SHARED ...

  3. python调用c/c++时传递结构体参数

    背景:使用python调用linux的动态库SO文件,并调用里边的c函数,向里边传递结构体参数.直接上代码 //test1.c # include <stdio.h> # include ...

  4. C#调用C++系列二:传结构体

    这一篇记录下C#调用C++的结构体的方式来使用OpenCV的数据格式,这里会有两种方式,第一种是C#传一个结构体和图像的路径给C++,然后C++将图像加载进来,再把传进来的结构体填满即可,第二种是C# ...

  5. DLL 函数中使用结构体指针作函数参数(C# 调用 C++ 的 DLL)

    存在的问题: 问题1:C++ 与 C# 同样定义的结构体在内存布局上有时并不一致: 问题2:C# 中引入了垃圾自动回收机制,其垃圾回收器可能会重新定位指针所指向的结构体变量. 解决方案: 问题1方案: ...

  6. C++的结构体指针传参

    typedef struct node{int n;node *left;}*tnode; 传参的时候注意用** void init(node **nn);int main(){tnode nna;i ...

  7. Qt socket中怎么传结构体?

    直接发送和接收结构体,例如:struct A {...};struct A objectA; 发送的时候: tcpSocket->write((char *)&objectA, size ...

  8. 使用offsetof对结构体指针偏移操作

    题目来自于COMP20003 Tutorial 2: Program m ing Challenge 2.2 The technology stack at Hidebound Inc. uses a ...

  9. 嵌入式-C语言:通过结构体指针操作结构体内容

    #include<stdio.h> #include<string.h> struct Student { char name[32]; int age; int height ...

随机推荐

  1. 线段树 poj3225

    U:把区间[l,r]覆盖成1I:把[-∞,l)(r,∞]覆盖成0    D:把区间[l,r]覆盖成0C:把[-∞,l)(r,∞]覆盖成0 , 且[l,r]区间0/1互换S:[l,r]区间0/1互换 因 ...

  2. poj1417 带权并查集 + 背包 + 记录路径

    True Liars Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2713   Accepted: 868 Descrip ...

  3. linux-查看系统是32位还是64位

    可以用命令“getconf LONG_BIT”查看, 如果返回的结果是32则说明是32位,返回的结果是64则说明是64位. 此外还可以使用命令“uname -a”查看, 输出的结果中,如果有x86_6 ...

  4. C#-WinForm-Timer控件

    比如在窗体中显示时间: 错误思路一:我在窗体结构函数中写入一个死循环,每隔一秒显示一次当前时间 public Form6() { InitializeComponent(); while (true) ...

  5. HTTP协议学习---(十)拓展-HTTPS协议

    HTTPS(Hypertext Transfer Protocol over Secure Socket Layer,基于SSL的HTTP协议)使用了HTTP协议,但HTTPS使用不同于HTTP协议的 ...

  6. 简单工厂VS工厂方法

    前言: GOF经典的23种设计模式在IT界现已被广为流传.由于比较长时间没有用了,个人对于不同模式与模式之间的区别也渐渐模糊,故开始重温设计模式的思想.也希望更给对设计模式感兴趣的朋友些许的启发. - ...

  7. Python中的GIL

    •start 线程准备就绪,等待CPU调度 •setName 为线程设置名称 •getName 获取线程名称 •setDaemon 设置为后台线程或前台线程(默认) 如果是后台线程,主线程执行过程中, ...

  8. 57. Android之程序调试LogCat (转)

    无论什么样的程序开发过程中,出现错误都是不可避免的,一般情况下,语法错误会被开发环境检测到,并能及时的提示我们错误的位置以及修改的方法,但是逻辑错误就不是那么容易被发现了,通常逻辑错误的定位和分析是一 ...

  9. Java RTTI机制与反射机制

    1.1 什么是RTTI? 维基百科的定义:In computer programming, RTTI (Run-Time Type Information, or Run-Time Type Iden ...

  10. 【poj2741】 Colored Cubes

    http://poj.org/problem?id=2741 (题目链接) 题意 给出n个骰子,每一面都有一种颜色,问最少更改多少个面的颜色可以使所有骰子通过旋转后完全相同. solution 迷之d ...