Ruv*_*una 2 c ctypes python-2.7
这是一个两部分的问题。为了提供一些背景知识,我有一个 C 代码,如下所示:
int c_func(const char* dir, float a, float b, float c, float d )
{
printf("%s\n", dir);
printf("%f\n",a);
printf("%f\n",b);
printf("%f\n",c);
printf("%f\n",d);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是一个简单的函数,它接受一个字符串和 4 个浮点数作为参数并将它们打印出来我正在尝试测试我的 phython/C 接口。我的python代码如下:
calling_function = ctypes.CDLL("/home/ruven/Documents/Sonar/C interface/Interface.so")
calling_function.c_func("hello",1, 2, 3, 4])
Run Code Online (Sandbox Code Playgroud)
现在既然这样有效,我想传递一个包含 4 个浮点数的列表,而不是传递 4 个单独的浮点数。我在网上尝试了不同的代码来编辑我的 C 函数,以便它接受一个列表作为它的参数之一,但我似乎无法弄清楚如何这样做,因为我是一个新程序员,而且我对 C 没有经验。
问题 1:如何编写 C 函数以接受列表作为其参数?
问题 2:这个包含四个浮点数的列表实际上来自我的 Python 代码中的列表列表。在对 C 函数进行编码后,我是否可以使用称为testfv2[0,:] C 函数输入的numpy 数组?testfv2[0,:]是一个 1x4 的维度列表,testfv2是一个 117x4 的维度列表。现在,我想一次进入 C 函数 1 行,这就是为什么我想使用testfv2[0,:].
如何编写 C 函数以接受列表作为其参数?
简短的回答,你不能。
长答案:C 没有列表,但有数组和指针。
那么你有几个选择:
int c_func(const char *dir, float abcd[4]) { // using an array with explicit size
int c_func(const char *dir, float abcd[]) { // Using an array (will decay to a pointer at compile-time)
int c_func(const char *dir, float *abcd) { // Using a pointer.
Run Code Online (Sandbox Code Playgroud)
如果您只会收到 4 个浮点数,我建议使用第一种形式,它强制执行数组的大小,您的函数的任何用户(主要是您未来的自己)都知道只提供一个包含四个元素的数组。
从 Python 调用您的函数:
floats = [1.0, 2.0, 3.0, 4.0] # Or whatever values you want to pass, but be sure to give only 4
FloatArray4 = ctypes.c_float * 4 # Define a 4-length array of floats
parameter_array = FloatArray4(*floats) # Define the actual array to pass to your C function
Run Code Online (Sandbox Code Playgroud)
我不知道传递超过 4 个浮点数是否FloatArray4会引发错误——我猜是这样,但我现在无法检查。
至于你的第二个问题,如果你想要动态大小的数组(超过 4 个元素),你必须为你的 C 函数提供另外两个配置文件之一,在这种情况下,我建议你int为大小添加一个额外的参数数组的:
int c_func(const char *dir, float floats[], int size) {
Run Code Online (Sandbox Code Playgroud)
或者
int c_func(const char *dir, float *floats, int size) {
Run Code Online (Sandbox Code Playgroud)
您也可以使用标准size_t而不是int,它就是为此而设计的。
我要传递一个多维数组,您添加另一对括号:
int c_func(const char *dir, float floats[][4]) { // Note the explicit size for second dimension
Run Code Online (Sandbox Code Playgroud)
但请记住,对于 C 数组,对于除第一个维度之外的所有维度,必须明确指定维度。如果该值是常量,则不会有问题,但如果不是,则必须使用指针:
int c_func(const char *dir, float *floats[]) {
Run Code Online (Sandbox Code Playgroud)
或者
int c_func(const char *dir, float **floats) {
Run Code Online (Sandbox Code Playgroud)
这是两个相同的语法(数组将衰减为指针)。再一次,如果您的尺寸是动态的,我建议为尺寸添加参数。
如果您想要补充尺寸,只需重复最后一步。