Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用ctypes.CDLL调用c函数时,该函数始终以0作为参数传递_Python_C++_C_Ctypes_Neovim - Fatal编程技术网

在Python中使用ctypes.CDLL调用c函数时,该函数始终以0作为参数传递

在Python中使用ctypes.CDLL调用c函数时,该函数始终以0作为参数传递,python,c++,c,ctypes,neovim,Python,C++,C,Ctypes,Neovim,我试图调用的c函数: 包括 包括 int mainnt argc,char*argv[]{ 长整型n=atollargv[1]; printfmain%lld\n,n; int m=0; 当n>1{ m++; 如果n%2==0{//偶数 printf%lld=%lld/2\n,n/2,n; n=n/2; } 否则{ printf%lld=3*%lld+1\n,3*n+1,n; n=3*n+1; } } printfCollatz%lld是“%d”\n,n,m; 返

我试图调用的c函数:

包括 包括 int mainnt argc,char*argv[]{ 长整型n=atollargv[1]; printfmain%lld\n,n; int m=0; 当n>1{ m++; 如果n%2==0{//偶数 printf%lld=%lld/2\n,n/2,n; n=n/2; } 否则{ printf%lld=3*%lld+1\n,3*n+1,n; n=3*n+1; } } printfCollatz%lld是“%d”\n,n,m; 返回m; } 我的python代码尝试使用参数4调用它

从ctypes导入* 导入操作系统,系统 打印您键入的内容:,sys.argv[1] filename=sys.argv[1]。拆分。[0] os.systemfgcc-c-fPIC{filename}.c-o{filename}.o&&gcc{filename}.o f-shared-o{filename}.so soFile=CDLLos.getcwd+/+filename+.so soFile.main4TLDR评论线程: 您应该将其拆分为2个func,main和collatz int collatzlong n,并使main只需将atollargv[1]传递给collatz,这样您就可以将其作为可执行文件正常运行,也可以将其作为共享库从python脚本文件中运行。您还需要将ctypes中的argtype设置为long longI,我认为它默认为int

C:


注意:与此问题没有直接关系,但您应该检查以确保C代码中的argc>2,以避免在未传递任何arg的情况下进行越界读取。

除非我记错了什么,否则argv[0]不应该是放入的第一个参数,而不是argv[1]?argv不会传递给main so atollargv[1]不起作用。为什么这主要是放在首位?您正在将其作为共享库加载,不需要main。只需将其更改为int collatzlong long n或类似于sig的内容,它应该是固定的。@supersformer它成为主函数的原因是,这样我也可以选择将c函数编译为可执行文件,并执行例如../collatz循环4,顺便说一下,它工作得非常好!。你认为我可以在不改变c-main函数签名的情况下修复它吗?好的,然后将它分成两个func,main和collatz,让main将atollargv[1]传递给collatz。
:!python test.py "collatz-loop"                                                
you typed: collatz-loop
main(0)
Collatz(0) is '0'
:!python test.py "collatz-loop"

shell returned 139
#include <stdio.h>
#include <stdlib.h>

int collatz(long long n){
    int m = 0;
    while (n > 1) {
        m++;
        if (n % 2 == 0) {   // even
            printf("%lld = %lld/2 \n", n/2, n);
            n = n/2;
        }
        else {
            printf("%lld = 3*%lld+1 \n", 3*n+1, n);
            n = 3*n + 1;
        }
    }
    printf("Collatz(%lld) is '%d'\n", n,m);
    return m;
}

int main(int argc, char *argv[]){
    long long int n = atoll(argv[1]);
    printf("main(%lld)\n", n);
    collatz(n);
}
from ctypes import *
import os, sys

print("you typed:", sys.argv[1])

filename = sys.argv[1].split(".")[0]

os.system(f"gcc -c -fPIC {filename}.c -o {filename}.o && gcc {filename}.o " \
           f"-shared -o {filename}.so")

soFile = CDLL(os.getcwd() + "/" + filename + ".so")


soFile.collatz.argtypes = [c_longlong]
soFile.collatz(4)