Python错误集锦:ctypes调用DLL中函数返回结果错误

原文链接:http://www.juzicode.com/archives/5161

错误提示:

 ctypes调用DLL中函数返回结果错误。

// juzicode.com/ VX: 桔子code   
#include "stdio.h"
#ifdef __cplusplus
extern "C" {
#endif 

	__declspec(dllexport) float addfloat(float x, float y)
	{
		return x + y;
	}

#ifdef __cplusplus
}
#endif   
# juzicode.com/ VX: 桔子code  
from ctypes import *
import os,sys,platform

print('sys.version:',sys.version) 
add_path = os.path.split(os.path.abspath(__file__))[0]+'\\'
pyt = CDLL(add_path+'pytest.dll')  

pyt.addfloat.argtypes=(c_float,c_float)
z = pyt.addfloat(10.1,20.2)          
print('z =',z) 
==========运行结果:
sys.version: 3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:37:02) [MSC v.1924 64 bit (AMD64)]
z = 1977958797

 正确的结果应该是30.3,但是得到的结果是1977958797。

 

错误原因:

1、C函数的返回类型是float,但是在Python中没有声明该函数的返回类型为c_float,而默认使用了c_int,导致类型转换错误,需要增加函数返回类型的声明.

 

解决方法:

1、增加函数返回类型的声明。

# juzicode.com/ VX: 桔子code  
from ctypes import *
import os,sys,platform

print('sys.version:',sys.version) 
add_path = os.path.split(os.path.abspath(__file__))[0]+'\\'
pyt = CDLL(add_path+'pytest.dll')  
pyt.addfloat.restype=c_float #增加函数返回类型的声明     
pyt.addfloat.argtypes=(c_float,c_float)
z = pyt.addfloat(10.1,20.2)          
print('z =',z) 
==========运行结果:
sys.version: 3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:37:02) [MSC v.1924 64 bit (AMD64)]
 z = 30.30000114440918

 

扩展内容:

  1. Python进阶教程m7–混合编程–调用可执行文件
  2. Python进阶教程m7b–混合编程–C语言接口ctypes(1)
  3. Python进阶教程m7c–混合编程–C语言接口ctypes(2)
  4. Python进阶教程m7d–混合编程–代码级扩展  

 


 

如果本文还没有完全解决你的疑惑,你也可以在微信公众号“桔子code”后台留言撩我,我会尽我所能为你答疑解惑。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注