CTYPES:调用过程时参数可能太多(超出92字节)

2024-09-27 19:26:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个动态链接库

__declspec(dllexport) int __cdecl wrp_ANN_sel_HDGT(int steps,
        double in_TNH[], double in_TNL[], double in_pamb[], double in_Tamb[], double in_CPD[],
        double in_T3[], double in_Tex[], double in_IGV[], double in_Dpin[], double in_Dpout[],
        double in_LHV[], double in_RH[], short in_model, double in_pamb_ref, double in_Dpin_ref,
        double in_Dpout_ref, double in_LHV_ref, double in_RH_ref, double out_Tfire[], double out_T39[], double out_Power[], char *RuleDllPath)

我定义了argtypes

^{pr2}$

我用数据填充指针

RuleDllPath = ctypes.c_char_p(b'ANN_sel_HDGT_win32')


in_TNH = (ctypes.c_double * N)()
in_TNL = (ctypes.c_double * N)()
in_pamb = (ctypes.c_double * N)()
in_Tamb = (ctypes.c_double * N)()
in_CPD = (ctypes.c_double * N)()
in_T3 = (ctypes.c_double * N)()
in_Tex = (ctypes.c_double * N)()
in_IGV = (ctypes.c_double * N)()
in_Dpin = (ctypes.c_double * N)()
in_Dpout = (ctypes.c_double * N)()
in_LHV = (ctypes.c_double * N)()
in_RH = (ctypes.c_double * N)()



for i in range(0, N):
    in_TNH[i] = float(SpeedH[i])
    in_TNL[i] = float(SpeedL[i])
    in_pamb[i] = float(Pamb[i])
    in_Tamb[i] = float(Tamb[i])
    in_CPD[i] = float(CPD[i])
    in_T3[i] = float(CTD[i])
    in_Tex[i] = float(TEX[i])
    in_IGV[i] = float(IGV[i])
    in_Dpin[i] = float(Inloss[i])
    in_Dpout[i] = float(OutLoss[i])
    in_LHV[i] = float(LHV[i])
    in_RH[i] = float(ro[i])

然后我打电话来

# Call function
a = wrp_ANN_sel_HDGT(ctypes.byref(steps), ctypes.byref(in_TNH), ctypes.byref(in_TNL), ctypes.byref(in_pamb),
                     ctypes.byref(in_Tamb), ctypes.byref(in_CPD), ctypes.byref(in_T3), ctypes.byref(in_Tex),
                     ctypes.byref(in_IGV), ctypes.byref(in_Dpin), ctypes.byref(in_Dpout), ctypes.byref(in_LHV),
                     ctypes.byref(in_RH),
                     ctypes.byref(in_model),
                     ctypes.byref(in_pamb_ref),
                     ctypes.byref(in_Dpin_ref), ctypes.byref(in_Dpout_ref), ctypes.byref(in_LHV_ref), ctypes.byref(in_RH_ref),
                     ctypes.byref(out_Tfire), ctypes.byref(out_T39), ctypes.byref(out_Power), (RuleDllPath))

我得到了

ValueError: Procedure probably called with too many arguments (92 bytes in excess)


Tags: inreffloatoutctypesrhdoubleigv
1条回答
网友
1楼 · 发布于 2024-09-27 19:26:56

如果使用windll.LoadLibrary,尝试使用CDLL。在

从网站: 函数的调用约定是x86 cdecl,但您使用的是x86 stdcall约定(WinDLL) 如果您使用的是32位Python,则可能存在约定问题。在

对于这样的C函数:

__declspec(dllexport) int __cdecl wrp_testchar(int steps, double in_data[], char* in_char )

python代码必须:

^{pr2}$

相关问题 更多 >

    热门问题