2013-02-23 58 views
1

我想用f2py包裝一個簡單的C函數。它編譯完好,但函數只返回零。我是C的新手,所以我很確定在那裏犯了一個愚蠢的錯誤。用f2py包裝的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 
+0

你還可以在你測試它的地方發佈f2py編譯行和python代碼。 – 2015-03-11 09:27:45

回答

2

我在C不是專家,但我認爲你的變量需要爲任何事情去改變指針:

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

@melpomene - 謝謝 - 正如我所說的,我不是C :)專家:) – mgilson 2013-02-23 04:00:11

+1

也意圖(在)/(出)在OP的代碼 – jfs 2013-02-23 04:01:43

+1

逆轉感謝您的指針提示,是的,意圖(in)/(out)需要切換,我的不好。但是,我仍然有同樣的問題。即使我在函數中做了一個賦值,比如說,* y = z它仍然返回零。在函數中插入printf(「%d \ n」,* y)也會打印零。 – Meddle 2013-02-23 19:25:00

0

編輯:我的第一個答案是錯誤的,值應該確實傳遞給C作爲指針,正如其他人指出的那樣。

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

嗨馬特,感謝您的回答。不幸的是,這不起作用:在這種情況下,返回值是空的。我不認爲'f2py'處理C的'return'語句,而是必須將輸出值分配給'pyf'文件中描述的變量。或者我誤解了你的答案? – Jake 2015-03-10 17:31:50

+0

對不起,我不好意思,我主要是用fortran的'f2py',當它包裝fortran代碼時,它實際上會先將它構建到'C',而'C'代碼實際上有返回值。我簡單地認爲,當用'C'使用'f2py'時,你必須編寫相同的'C'-代碼。縱觀文檔,情況並非如此。它應該是所有指針參數。 – 2015-03-10 17:45:15

+0

好的,謝謝你的更新。我仍然無法實現它:當我從Python調用它時,編輯後的代碼給了我一個段錯誤。 – Jake 2015-03-10 17:55:54

3

爲了解決這個問題,你需要

  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,包含該標量。不過,我不確定是否有另一種處理方式。