gpt4 book ai didi

c - 如何使用 swig 在 python 中使用 C 结构指针?

转载 作者:行者123 更新时间:2023-11-30 16:31:11 34 4
gpt4 key购买 nike

我有一个指向 C 结构的指针,我需要知道如何在使用 swig 生成 python 库后从 python 初始化该结构。

我能够编译代码并运行 swig,没有任何错误,我还能够将库导入到 python 中。

我的目标是学习如何在 c/swig/python 中使用指针。

这是我想集成到 python 中的 c 函数:

#include <stdio.h>
#include "myswig.h"


myData* myhfun(myData *data){

data->s = data->r1 + data->r2;
printf("sum(%f+%f)=%f\n", data->r1, data->r2, data->s);
return data;
}

这是相同的头文件:

//file myswig.h
struct myData{
double r1;
double r2;
double s;
};

typedef struct myData myData;

myData* myhfun(myData *data);

我的 swig 界面文件如下所示

/* file: myswig.i */
%module myswig
%{
#include "myswig.h"
%}

/*my function */

myData* myhfun(myData *data);

运行 swig 和测试的脚本:

swig -python -Isrc myswig.i 
gcc -Isrc -fPIC -I/usr/include/python3.5m -I/usr/include/x86_64-linux-gnu/python3.5m -lpython3.5m -c src/myswig.c myswig_wrap.c
gcc -shared -fPIC -o _myswig.so myswig.o myswig_wrap.o

python3 -c "import myswig"

最佳答案

我找到了一种方法来实现这一目标,

首先编写一个函数,初始化一个结构体指针并返回指向该结构体的指针,

您从 python 端调用此函数并将指针值存储在变量中,

现在您可以像传递指针一样传递这个变量了:)。

C 函数

#include<stdlib.h>
#include "myswig.h"


myDataHolder* initStructMem(){
myDataHolder *myStruct;
myStruct=malloc(sizeof(myStruct));
return myStruct;
}

myDataHolder* setVal(int a ,int b, myDataHolder *data){
data->r1=a;
data->r2=b;
return data;
}

int getSum(myDataHolder *data){
data->s = data->r1 + data->r2;
return 0;
}

void printVal(myDataHolder *data){
printf("sum of %d and %d = %d",data->r1, data->r2, data->s);
}

Python代码

import myswig


x = myswig.initStructMem()
y = myswig.setVal(1,2,x)

myswig.getSum(y)
myswig.printVal(y)

Swig 定义文件

 /* file: myswig.i */
%module myswig
%{
#include "myswig.h"
%}

/*my func */

myDataHolder* initStructMem(void);

myDataHolder* setVal(int a ,int b, myDataHolder *data);
int getSum(myDataHolder *data);
void printVal(myDataHolder *data);

关于c - 如何使用 swig 在 python 中使用 C 结构指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50740771/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com