python写游戏与c语言转化,使用ctypes实现python类型和C语言类型之间的相互转化
楔子
我们知道可以使用ctypes调用扩展模块,主要是调用扩展模块中使用C编写好的函数,但这些函数肯定都是需要参数的,还有返回值,不然编写扩展模块有啥用呢。那么问题来了,不同的语言变量类型不同,所以python能够直接往C编写的函数中传参吗?显然不行,所以ctypes还提供了大量的类,帮我们将python中的类型转成C语言中的类型。
python类型与C语言类型之间的转换
我们说了,python中类型不能直接往C语言的函数中传递(整型是个例外),那么ctypes就提供了很多的类可以帮助我们将python的类型转成C语言的类型。常见的类型分为以下几种:数值、字符、指针
数值类型转换
c语言的数值类型分为如下:
int:整型
unsigned int:无符号整型
short:短整型
unsigned short:无符号短整型
long:长整形
unsigned long:无符号长整形
long long:64位机器上等同于long
unsigned long long:等同于unsigned long
float:单精度浮点型
double:双精度浮点型
long double:看成是double即可
_Bool:布尔类型
ssize_t:等同于long或者long long
size_t:等同于unsigned long或者unsigned long long
import ctypes
# 下面都是ctypes中提供的类,将python中的对象传进去,就可以转换为C语言能够识别的类型
print(ctypes.c_int(1)) # c_long(1)
print(ctypes.c_uint(1)) # c_ulong(1)
print(ctypes.c_short(1)) # c_short(1)
print(ctypes.c_ushort(1)) # c_ushort(1)
print(ctypes.c_long(1)) # c_long(1)
print(ctypes.c_ulong(1)) # c_ulong(1)
# c_longlong等价于c_long,c_ulonglong等价于c_ulong
print(ctypes.c_longlong(1)) # c_longlong(1)
print(ctypes.c_ulonglong(1)) # c_ulonglong(1)
print(ctypes.c_float(1.1)) # c_float(1.100000023841858)
print(ctypes.c_double(1.1)) # c_double(1.1)
# 在64位机器上,c_longdouble等于c_double
print(ctypes.c_longdouble(1.1)) # c_double(1.1)
print(ctypes.c_bool(True)) # c_bool(True)
# 相当于c_longlong和c_ulonglong
print(ctypes.c_ssize_t(10)) # c_longlong(10)
print(ctypes.c_size_t(10)) # c_ulonglong(10)
字符类型转换
c语言的字符类型分为如下:
char:一个ascii字符或者-128~127的整型
wchar:一个unicode字符
unsigned char:一个ascii字符或者0~255的一个整型
import ctypes
# 必须传递一个ascii字符并且是字节,或者一个int,来代表c里面的字符
print(ctypes.c_char(b"a")) # c_char(b'a')
print(ctypes.c_char(97)) # c_char(b'a')
# 传递一个unicode字符,当然ascii字符也是可以的,并且不是字节形式
print(ctypes.c_wchar("憨")) # c_wchar('憨')
# 和c_char类似,但是c_char既可以传入字符、也可以传整型,而这里的c_byte则要求必须传递整型。
print(ctypes.c_byte(97)) # c_byte(97)
print(ctypes.c_ubyte(97)) # c_ubyte(97)
指针类型转换
c语言的指针类型分为如下:
char *:字符指针
wchar_t *:字符指针
void *:空指针
import ctypes
# c_char_p就是c里面字符数组指针了
# char *s = "hello world";
# 那么这里面也要传递一个bytes类型的字符串,返回一个地址
print(ctypes.c_char_p(b"hello world")) # c_char_p(2082736374464)
# 直接传递一个unicode,同样返回一个地址
print(ctypes.c_wchar_p("憨八嘎~")) # c_wchar_p(2884583039392)
# ctypes.c_void_p后面演示
至于其他的类型,比如整型指针啊、数组啊、结构体啊、回调函数啊,ctypes都支持,我们后面会介绍。
python写游戏与c语言转化,使用ctypes实现python类型和C语言类型之间的相互转化相关推荐
- 如何用python写游戏_一步步教你怎么用python写贪吃蛇游戏
目录 0 引言 1 环境 2 需求分析 3 代码实现 4 后记 0 引言 前几天,星球有人提到贪吃蛇,一下子就勾起了我的兴趣,毕竟在那个Nokia称霸的年代,这款游戏可是经典中的经典啊!而用Pytho ...
- 手机版python3h如何自制游戏_Python 飞机大战|10 分钟学会用 python 写游戏
Python 飞机大战|10 分钟学会用 python 写游戏 2018 年 python 语言大火, 这把火看趋势已然延续到了 2019 年! 除了在科学计算领域 python 有用武之地之外, 在 ...
- python 写游戏好简单啊,我用键盘可以随意控制角色了【python 游戏实战 04】
前言 本系列文章将会以通俗易懂的对话方式进行教学,对话中将涵盖了新手在学习中的一般问题.此系列将会持续更新,包括别的语言以及实战都将使用对话的方式进行教学,基础编程语言教学适用于零基础小白,之后实战课 ...
- python写好的代码怎么给别人使用-10分钟学会用python写游戏!Python其实很简单!...
原标题:10分钟学会用python写游戏!Python其实很简单! Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以在这里给各位看官们准备了高价值Python学习视频教程 ...
- 我的世界python写游戏_用python写游戏之 Give it up
<永不言弃 Give It Up>,这是一款极具虐心色彩的音乐题材闯关游戏. 这篇文章就来分析这款游戏原理,并用python写出来一个简易版.废话不多说,直接开始分析. 游戏元素,暂且把主 ...
- python写游戏脚本-使用Python写一个小游戏
引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下 ...
- python如何编游戏_手把手教你用python写游戏
引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,项目来自 ...
- 用python写数字_用python 写游戏之数字华容道
当初对这个游戏颇有印象还是在最强大脑节目上面,何猷君以几十秒就完成了这个游戏.写2048游戏的时候,又想起了这个游戏,想着来研究一下. 游戏玩法 用尽量少的步数,尽量短的时间,将棋盘上的数字方块,按照 ...
- python写的游戏怎么给别人玩-用python写游戏脚本原来这么简单
前言 最近在玩儿公主连结,之前也玩儿过阴阳师这样的游戏,这样的游戏都会有个初始号这样的东西,或者说是可以肝的东西. 当然,作为一名程序员,肝这种东西完全可以用写代码的方式帮我们自动完成.游戏脚本其实并 ...
最新文章
- CTFshow php特性 web115
- 深入探究函数返回局部变量
- 基于倒谱法和线性预测法估计基音频率(MATLAB和Python)
- mockito mock void方法_Spock如何模拟抽象类方法
- java父类转子类_java中什么是继承,和继承的接口的关系?
- Scikit-learn:模型选择之调参grid search
- !HDU 1078 FatMouse and Cheese-dp-(记忆化搜索)
- Python基础教程,Python入门教程(非常详细)
- 正版破解软件下载站大全(转载
- Linux常用软件包安装工具及配置方法(apt-get, pip, dpkg)
- OSChina 周一乱弹 ——我们不应歧视任何语言,她们都是萌娘!(有图有真相)...
- 读书之二 --《程序员修炼之道》
- 笔记本计算机的清洁保养知识,笔记本电脑怎么清洁卫生 笔记本清理灰尘要注意什么...
- 拜读刘天斯的一个开源项目
- 删除Oracle表空间,释放硬盘空间
- 蚪侠-远程泛目录[泛域名+泛目录+泛内页]-[代码+汉字]干扰-字体繁简切换-蜘蛛欺骗-主动推送_模板版-V25版
- Windows API一日一练 29 SelectObject和DeleteObject函数
- HTTP请求响应的5种状态
- Android两种时间轴实现
- 关于金额转化为大写的小程序
热门文章
- Java Swing打猎射击游戏编程代码下载
- 反锐化掩膜_图像反锐化掩膜算法研究解析.doc
- 全志A31下5M的CMOSCamera移植修改记录表
- React之生命周期-forceUpdate
- ODIS是一款专业的多功能车辆诊断系统
- oracle erp库位设置,快麦ERP是如何实施仓库库位规划的?
- 使用Mahout搭建推荐系统之入门篇-Mahout实战
- [编程教程]郁金香2013网授VC++ 2008 详解 [ 50课 ]
- mac 编译源码安装 opencv
- 使用Project客户端和Project Server进行项目管理