【发布时间】:2017-01-17 15:22:27
【问题描述】:
假设我有一个 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]);
^^^^
【问题讨论】:
-
双复数 x = {1.0, 2.0}; - 可能是这种类型:“DoubleComplex”是一个结构,而不是 2 个元素的数组?
-
这是正确的观察,当然。这种行为在某种程度上是意料之中的。问题是改用什么,以便它无论如何都能工作。例如,vala vapi 文档还说
public struct Sth : double {}。但我不能将它用于像public struct DoubleComplex : double[2] {}这样的数组。