簡體   English   中英

包裝在 python 中的 c function 的返回值錯誤

[英]Wrong return value from c function wrapped in python

這很奇怪,我正在嘗試包裝我在 c 中編寫的 function 以便在 Z23EEEB4347BDD26BFC6B7EE9A3B755F33Z 中使用它,以便了解如何做這個例子:

cfunctions.c

double dotproduct(int dim, double a[dim], double b[dim]){
    double res = 0;
    for(int i = 0; i < dim; i++){
        res = res + a[i]*b[i];
    }
    return res;
}

py_cfunctions.py

from ctypes import *
import numpy as np

# so_file genreated with:
# cc -fPIC -shared -o cfunctions.so cfunctions.c
so_file = 'MY_PATH/cfunctions.so'
py_cfunctions = CDLL(so_file)
c_double_p = POINTER(c_double)
# Preparing example

def dotproduct(n,a,b):
    # Convert np.array to ctype doubles
    a_data = a.astype(np.double)
    a_data_p = a_data.ctypes.data_as(c_double_p)
    b_data = b.astype(np.double)
    b_data_p = b_data.ctypes.data_as(c_double_p)
    # Compute result...
    c_return = py_cfunctions.dotproduct(n,a_data_p,b_data_p)
    if (c_return != -1):
        return c_return
    else:
        return "C Function failed, check inputs"
 
py_cfunctions.dotproduct.argtypes= [c_int, c_double_p, c_double_p] 

有趣的是,代碼似乎可以工作,但返回的值總是等於n 如果我在返回之前嘗試打印res我可以看到該值是正確的,但是實際返回的值始終是n 我錯過了什么?

>>> import py_cfunctions as pycf
>>> import numpy as np
>>> a = np.array([1,2,3,4])
>>> b = np.array([4,5,6,1])
>>> pycf.dotproduct(4,a,b)
4

感謝@Mark Tolonen 的回答:

“在實現級別,整數在不同於浮點值的寄存器中返回。除非另有說明,否則 ctypes 假定 c_int 作為返回值。使用 ctypes 時,“顯式優於隱式”。始終正確定義.restype 和 .argtypes,您將有更少的問題。”

我必須明確定義我的 function 的返回類型,將以下行添加到pic_functions.py

py_cfunctions.dotproduct.restype = c_double

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM