请教python调用dll动态库的传参问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教python调用dll动态库的传参问题相关的知识,希望对你有一定的参考价值。

参考技术A 按C语言的规则就可以。 不过你的DLL是什么编译的。 如果是C++的则与C不同。另外编译器也相关。 BC和VC还有其它编译器编译出来的DLL也有些微的区别。 参考技术B #传入数组的例子from ctypes import *cdll.LoadLibrary("libc.so.6") # doctest: +LINUXlibc = CDLL("libc.so.6") #IntArray5 = c_int * 5ia = IntArray5(5, 1, 7, 33, 99)qsort = libc.qsortqsort.restype = NoneCMPFUNC = CFUNCTYPE(c_int, POINTER(c_int), POINTER(c_int))def py_cmp_func(a, b): print "py_cmp_func", a[0], b[0] return a[0] - b[0]cmp_func = CMPFUNC(py_cmp_func)qsort(ia, len(ia), sizeof(c_int), cmp_func)for i in ia: print i,本回答被提问者采纳

java 方法 传参

调用方法传入参数,难道不就是 byte a = 45;的意思吗?为啥会出错!请老哥老姐妹告诉我答案!

要是想传字面量的话 就这样

public class D

public static void main(String[] args) throws Exception

    byte a = 45;

    t(a);

    t((byte)45);

public static void t(byte a)

    System.out.println(a);



正确的传参方式

追问

嗯,老哥

嗯,byte a = 45; 这里的45没超过左边数据的类型编译器就自动给它强转,若是超过了范围就不自动给它强转了,对吗

追答

如果是byte的字面量一定是要说明的哪怕是0也要(byte)0


追问

嗯。那亲,解释下,byte a = 45;

这里的45不是默认int型吗?为啥无需强转呢

追答

这里声明的btye 实际上应该叫做signed byte,8位的二进制组成。取值范围在十进制的-128~127。也就是说你所声明的45 二进制来表示的话就是 0100 0101

至于如果超过127 又如何呢?

127 是01111111

-128为10000000

参考技术A 你在定义变量的时候,确实45会被转为byte型,但是在调用方法的时候不会自动帮你转型.
java是强类型语言,同样的方法有重载的概念.即方法名相同,参数不同,则认为是两个不同的方法.你既然传的是int型,则java只会寻找参数是int类型的方法.
假设java连参数是byte型的方法也去调用,如果同时存在参数是byte型,和参数是int型的相同名字的方法,java怎么处理这种情况?追问

老哥,牛逼,一语点破梦中人

其他人都要么不懂装懂,要么没说在电子上!

追答

这个东西有个已知的特例。
一个接收int参数的方法,可以给char。我也不知道java为什么要做么做。

本回答被提问者采纳
参考技术B 在定义方法的时候,方法的参数叫形参(形式参数),在调用方法的时候,给方法传递的参数叫实参(实际参数),你的写法有问题,在调用abc方法的时候,可以直接把45写在方法后面(直接写45需要类型转换,否则报错),也可以把45先赋值给一个变量,然后把变量当成参数传给abc方法,不能又写变量名,又写45啊,标准写法如下:
byte a=45;
abc(a);//或者是abc((byte)45)
public static void abc(byte a)
追问

那不是变量名,那是提示,亲

idea所有的提示

追答

一直用eclipse

参考技术C 这里主要是因为Java的默认类型导致的,像你直接传字面量45,默认是int类型的,但是你的abc方法需要的参数类型是byte的,所以给你报错了。
上面byte直接赋值45不报错的原因是因为java的自动拆装箱,你赋值的时候他自动把int的45转换成byte然后赋值给了a,所以不会报错。追问

亲,你说错了,那不是装箱和拆箱哦,要是也是强转

追答

果然说的多,错的多

参考技术D 调用 abc() 函数的时候,参数写a,别写45。
abc(a)
byte a = 45 ,45默认是int类型,这里没有报错,因为这里有个类型强转。
你定义的函数abc() 参数是byte类型,传参的时候就只能传byte类型的参数。追问

嗯,byte a = 45; 这里的45没超过左边数据的类型编译器就自动给它强转,若是超过了范围就不自动给它强转了,对吗

以上是关于请教python调用dll动态库的传参问题的主要内容,如果未能解决你的问题,请参考以下文章

请教python调用dll动态库的传参问题

vc动态链接库的调用 LoadLibrary()路径问题

python中调用 C#动态链接库问题记录

请教关于linux中静态库与动态库的问题

Python调用DLL动态链接库——ctypes使用

VB中调用Class(类模块)及调用DLL(动态链接库)问题