gpt4 book ai didi

vala - 如何在 vala 中使用固定大小的 C 数组类型?

转载 作者:行者123 更新时间:2023-12-04 23:09:09 29 4
gpt4 key购买 nike

假设我有一个 C 代码 (dcomplex.h):

typedef double dcomplex[2];

并且想在vala中使用这样的数据类型。 最小的 vapi 文件和 vala 调用是什么?

(最终目标是使用 C99 complex.h 类型。)

我尝试了以下 dcomplex.vapi 文件的多种变体:

[CCode (cheader_filename = "dcomplex.h")]
namespace DComplex {
[SimpleType]
[CCode (cname = "dcomplex", has_type_id = false)]
public struct DoubleComplex {
}
}

并在 vala 代码中使用:

using DComplex;
void main()
{
DoubleComplex x = {1.0, 2.0};
stdout.printf("x = %f + i %f\n", x[0], x[1]);
}

编译

valac --vapidir . --pkg dcomplex test.vala

导致错误:

error: too many expressions in initializer list for `Complex.DoubleComplex'
DoubleComplex x = {1.0, 2.0};
^^^

error: The expression `Complex.DoubleComplex' does not denote an array
stdout.printf("x = %f + i %f\n", x[0], x[1]);
^^^^

最佳答案

  1. public struct DoubleComplex :我不认为您可以绑定(bind)到类型定义的 C 数组并期望 Vala 能够访问其成员或字段。

  2. DoubleComplex x = {1.0, 2.0};是数组的初始化。您将无法使用此初始化,因为我们无法让 Vala 知道其类型是绑定(bind)的“不透明”数组。

我知道您想使用 C99 的复杂功能,所以,下面,我将展示我的解决方案以绑定(bind)到 complex.h .为了使复杂的 header 更加 Vala fiendly,我不会编写 VAPI 来直接绑定(bind)它,而是编写一个基于样式类型定义的 C 包装器对象 double complex到 Vala 可以绑定(bind)的东西。

首先我会展示包装器,它由三个文件组成:

  • Complex.h对于 <complex.h> 的原型(prototype)、typedef 和包含;
  • Complex.c用于包装函数的实现;
  • Complex.vapi在 Vala 中绑定(bind)。

文件 Complex.h

#include <complex.h>

typedef double complex dcomplex;

void dcomplex_make (dcomplex * c, double r, double i);

double dcomplex_real (dcomplex * c);
double dcomplex_imag (dcomplex * c);

文件 Complex.c

#include "Complex.h"

void dcomplex_make (dcomplex * c, double r, double i)
{
*c = CMPLX(r, i);
}

double dcomplex_real (dcomplex * c)
{
return creal(*c);
}

double dcomplex_imag (dcomplex * c)
{
return cimag(*c);
}

文件 Complex.vapi

[CCode (cheader_filename = "Complex.h")]
namespace Complex
{
[CCode (cname = "dcomplex")]
public struct DComplex {
[CCode (cname = "dcomplex_make")]
public DComplex (double real, double imaginary);

[CCode (cname = "dcomplex_real")]
public double real ();

[CCode (cname = "dcomplex_imag")]
public double imag ();
}
}

现在您有了包装器和 VAPI,您可以在 Vala 代码中使用它了:

文件 Main.vala

using Complex;

class Main {
static void main() {
DComplex c = DComplex(10, 20);

stdout.printf("C Complex Type = %f %f\n", c.real(), c.imag());
}
}

构建并运行:

# valac Main.vala Complex.vapi Complex.c
# ./Main

给出的示例输出:

C Complex Type = 10.000000 20.000000

关于vala - 如何在 vala 中使用固定大小的 C 数组类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41700856/

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