【问题标题】:C functions wrapped with f2py return only zeros用 f2py 包装的 C 函数只返回零
【发布时间】:2013-02-23 03:48:16
【问题描述】:

我正在尝试使用 f2py 包装一个简单的 C 函数。它编译得很好,但函数只返回零。我是 C 的新手,所以我很确定在那里犯了一个愚蠢的错误。

例如c文件:

#include <stdio.h>
#include <stdlib.h>
void Test(double x, double y)
{
  x = y*2;
}

pyf 文件:

python module test
interface
   subroutine Test(x, y)        
     intent (c) Test  ! is a C function
     intent (c)         ! all arguments are considered as C based
     double precision intent(in)     :: x
     double precision intent(out)    :: y
   end subroutine Test
end interface
end python module test

【问题讨论】:

  • 你能把f2py编译行和python代码贴在你测试它的地方吗?

标签: python c f2py


【解决方案1】:

要解决这个问题,你需要

  1. 要在@mgilson 提到的.c 函数中使用返回变量的指针,

    void Test(double *x, double y)
    {
       *x = y * 2;
    }
    
  2. .pyf接口中指定使用指针,这是大小为1的相同数组,

    double precision intent(out)   :: x(1)
    double precision intent(in)    :: y
    

test.Test 函数将返回不是一个标量,而是一个长度为 1 的 numpy ndarray,包含该标量。不过,我不确定是否有其他处理方法。

【讨论】:

    【解决方案2】:

    我不是C 方面的专家,但我认为您的变量需要成为任何更改的指针:

    void Test(double *x, double *y)
    {
      *x = *y * 2;
    }
    

    【讨论】:

    • @melpomene -- 谢谢 -- 正如我所说,我不是 C 方面的专家 :)
    • 感谢指针提示,是的,intent(in)/(out) 需要切换,我的错。但是,我仍然遇到同样的问题。即使我在函数中进行赋值,比如 *y =z 它仍然返回零。在函数中插入 printf("%d\n",*y) 也会打印零。
    • @Meddle 当ydouble* 然后*ydouble,所以你应该printf 它使用"%f" 格式,而不是"%d"...
    • @mgilson:你测试过你的代码吗?我得到与 Meddle 相同的结果,返回值始终为 0。
    【解决方案3】:

    编辑:我的第一个答案是错误的,正如其他人所指出的,这些值确实应该作为指针传递给 C。

    void Test(double* x, double* y)
    {
        *y = *x * 2;
    }
    

    【讨论】:

    • 嗨,马特,感谢您的回答。不幸的是,这不起作用:在这种情况下,返回值为空。我不认为f2py 处理C 的return 语句,而是您必须将输出值分配给pyf 文件中描述的变量。还是我对您的回答有误解?
    • 是的,对不起,我的错,我主要将f2py 与fortran 一起使用,当它包装fortran 代码时,它实际上会首先将其构建为C,并且C-code 实际上具有返回值.我只是假设您在使用f2pyC 时必须编写相同的C 代码。不过,查看文档,情况并非如此。它确实应该是所有指针参数。
    • 好的,感谢您的更新。我仍然无法让它工作:当我从 Python 调用它时,您编辑的代码给了我一个段错误。
    • 只是为了确保:您可以尝试使用 python 数组作为输入吗? ScyPy 上的文档说它应该通过在C 中声明类型来工作。我不太确定。这是链接:wiki.scipy.org/Cookbook/f2py_and_NumPy
    猜你喜欢
    • 1970-01-01
    • 2011-01-09
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 2021-11-26
    • 2020-04-28
    • 2015-05-13
    相关资源
    最近更新 更多