簡體   English   中英

使用 ctypes 回調功能時訪問沖突

[英]Access violation when using ctypes callback feature

I'm trying to use the ctypes callback feature to pass a python function to a C function as a function pointer. 這是 C:

typedef void(*f1)();

void function_that_takes_a_function(f1* fn){
    printf("I'm a function that takes a function\n");
    double d1[2] = {0.1, 0.2} ;
    printf("1\n");
    double *d2;
    printf("2\n");
    double *g;
    printf("3\n");

    printf("%d\n", (long )fn);

    (*fn)(); 
    printf("4\n");
}

和 Python

        import ctypes as ct

        lib = ct.CDLL("SRES")
        F1_CALLBACK = ct.CFUNCTYPE(None)
        function_that_takes_a_function = lib.function_that_takes_a_function
        function_that_takes_a_function.argtypes = [F1_CALLBACK]
        function_that_takes_a_function.restype = None

        @F1_CALLBACK
        def func_to_pass_in():
            print("hello from Python")

        function_that_takes_a_function(func_to_pass_in)

這給了我

I'm a function that takes a function
1
2
3
-1788276848

Error
Traceback (most recent call last):
  File "C:\Miniconda3\envs\py38\lib\unittest\case.py", line 60, in testPartExecutor
    yield
  File "C:\Miniconda3\envs\py38\lib\unittest\case.py", line 676, in run
    self._callTestMethod(testMethod)
  File "C:\Miniconda3\envs\py38\lib\unittest\case.py", line 633, in _callTestMethod
    method()
  File "Guassianproblem.py", line 77, in testFunctionPointerInIsolation
    function_that_takes_a_function(func_to_pass_in)
OSError: exception: access violation writing 0xFFFFFFFFF9158D4C

我希望看到的地方:

I'm a function that takes a function
1
2
3
Hello from Python 
4

有人能發現我的問題嗎?

f1已經是指向 function 的指針,返回類型為void且無參數(請參閱類型定義)。 以下作品。

typedef void(*f1)();
    
void function_that_takes_a_function(f1 fn)
{
  fn();
}

使用以下 Python 代碼:

        import ctypes as ct

        lib = ct.CDLL("SRES")
        F1_CALLBACK = ct.CFUNCTYPE(None)
        function_that_takes_a_function = lib.function_that_takes_a_function
        function_that_takes_a_function.argtypes = [F1_CALLBACK]
        function_that_takes_a_function.restype = None

        @F1_CALLBACK
        def func_to_pass_in():
            print("hello from Python")

        function_that_takes_a_function(func_to_pass_in)

暫無
暫無

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

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