背景:使用python调用linux的动态库SO文件,并调用里边的c函数,向里边传递结构体参数。直接上代码

//test1.c

# include <stdio.h>
# include <stdlib.h> //创建一个Student结构体
struct Student
{
char name[];
float fScore[];
}; void Display(struct Student su)
{
printf("-----Information------\n");
printf("Name:%s\n",su.name);
printf("Chinese:%.2f\n",su.fScore[]);
printf("Math:%.2f\n",su.fScore[]);
printf("English:%.2f\n",su.fScore[]);
printf("总分数为:%f\n", su.fScore[]+su.fScore[]+su.fScore[]);
printf("平均分数为:%.2f\n",((su.fScore[]+su.fScore[]+su.fScore[]))/);
}

生成libpycall.so文件:

gcc -o libpycall.so -shared -fPIC test1.c

python调用,给Display传递结构体参数:

#pycall.py

import ctypes
from ctypes import * class Student(Structure):
_fields_ = [("name",c_char * 30),
("fScore", c_float * 3)
] su = Student()
su.name = b"test-sdk"
PARAM = c_float * 3
fScore = PARAM()
fScore[0] = 55.1
fScore[1] = 33.2
fScore[2] = 51.3 su.fScore = fScore if __name__ == '__main__': ll = ctypes.cdll.LoadLibrary
lib = ll("./libpycall.so")
# lib.Display.restype = c_float
lib.Display.argtypes = [Student] #这一行很重要
lib.Display(su)
print('----- finish -----')

输出Display函数调用结果:

-----Information------
Name:test-sdk
Chinese:55.10
Math:33.20
English:51.30
总分数为:139.600006
平均分数为:46.53
----- finish -----

python调用c/c++时传递结构体参数的更多相关文章

  1. ESL python调用C模块时传递unicode字符串报错问题解决

    在是用freeswitch时利用ESL的python调用时传递字符串报错 TypeError: in method 'ESLconnection_api', argument 2 of type 'c ...

  2. CreateThread创建线程传递结构体参数

    #include "stdafx.h" #include <stdio.h> #include <windows.h> #include <stdli ...

  3. C#调用C++DLL传递结构体数组的终极解决方案

    在项目开发时,要调用C++封装的DLL,普通的类型C#上一般都对应,只要用DllImport传入从DLL中引入函数就可以了.但是当传递的是结构体.结构体数组或者结构体指针的时候,就会发现C#上没有类型 ...

  4. 绝对好文C#调用C++DLL传递结构体数组的终极解决方案

    C#调用C++DLL传递结构体数组的终极解决方案 时间 2013-09-17 18:40:56 CSDN博客相似文章 (0) 原文  http://blog.csdn.net/xxdddail/art ...

  5. C# 调用C/C++动态链接库,结构体中的char*类型

    用C#掉用C++的dll直接import就可以之前有不同的类型对应,当要传递结构体的时候就有点麻烦了,这里有一个结构体里边有char*类型,这个类型在C#中调用没法声明,传string是不行的默认st ...

  6. WPF向系统发送消息 并传递结构体

    场景 :需要开发一个通讯组件 流程为:界面-开启接收服务-通过发送组件发送信息到 其他客户端和服务端 接受服务接收其他客户端发送的消息 需要传递给对应组件或者界面 因此会出现类库重复引用问题.因为采用 ...

  7. Qt--信号槽传递自定义结构体参数

    自定义结构体参数的信号槽连接 (1) 对于自定义的结构体参数,信号槽无法识别参数,导致信号槽连接不起作用.所以需要注册结构体参数.在结构体中声明结束的地方加上结构体注册. struct DealDet ...

  8. x264中重要结构体参数解释,参数设置,函数说明 <转>

    x264中重要结构体参数解释http://www.usr.cc/thread-51995-1-3.htmlx264参数设置http://www.usr.cc/thread-51996-1-3.html ...

  9. python 调用dll 动态链接库 结构体参数及回调函数等示例

    结构体示例: 这里是 C 代码的部分,主要是结构体的声明和回调函数定义. // 新版本定义 typedef enum { DevCard, DevLocator, DevReader } DevTyp ...

随机推荐

  1. .关于oracle中varchar2的最大长度

    关于 varchar2 的最大长度varchar2有两个最大长度:一个是在字段类型4000:一个是在PL/SQL中变量类型32767.这是一个比较容易出错的地方.因为在函数中可以声明长度超过4000的 ...

  2. hadoop的权限控制

    HDFS支持权限控制,但支持较弱.HDFS的设计是基于POSIX模型的,支持按用户.用户组.其他用户的读写执行控制权限.在linux命令行下,可以使用下面的命令修改文件的权限.文件所有者,文件所属组: ...

  3. 安装与学习laravel

    安装 composer cd /var/www/html curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/ ...

  4. 测试 windows 发布日志

    <script>alert("hellow world")</script>

  5. Qualcomm_Mobile_OpenCL.pdf 翻译-3

    3 在骁龙上使用OpenCL 在今天安卓操作系统和IOT(Internet of Things)市场上,骁龙是性能最强的也是最被广泛使用的芯片.骁龙的手机平台将最好的组件组合在一起放到了单个芯片上,这 ...

  6. Webdriver处理页面元素的方式

    Webdriver执行JavaScript代码的方式 WebDriver driver = new ChromeDriver(); JavascriptExecutor jse = (Javascri ...

  7. python之同步IO和异步IO

    linux操作系统基础知识 用户空间和内核空间 操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限.为了保证用户进程不能直接操作内核保证内核的安全,操 ...

  8. canvas实现圆角、圆框图片

    参考资料: http://www.zhangxinxu.com/study/201406/image-border-radius-canvas.html https://www.jianshu.com ...

  9. Rsync以守护进程(socket)的方式传输数据

    Rsync以守护进程(socket)的方式传输数据       Rsync服务部署 一.以守护进程(socket)的方式传输数据(重点) 部署环境: 分别用uname命令查看各系统相关信息   1 2 ...

  10. 《SaltStack技术入门与实践》—— Peer

    Peer 本章节参考<SaltStack技术入门与实践>,感谢该书作者: 刘继伟.沈灿.赵舜东 Peer组件是SaltStack中Minion向Master发布任务的一个组件,使用Peer ...