具有静态结构的 Vala 代码在更新到 0.44 后不起作用
Vala code with static struct dont works after update to 0.44
刚刚做了一个标准的求职面试,就是计算直方图中的水量。星期一,此代码有效,并且 still works 在此站点上。更新vala后,现在显示错误。
UPD:更简单 example
> Algoritm.vala:2.5-2.16: error: struct `Algotitm.first' cannot be empty
> struct first {
> ^^^^^^^^^^^^ Algoritm.vala:6.5-6.17: error: struct `Algotitm.second' cannot be empty
> struct second {
当 post 在 Stack Overflow 上提出问题时,post 一个 minimum, complete and verifiable example.
的代码示例总是好的
从您提供的 link 来看,您的结构似乎只有成员标记为 static
:
struct First {
static int data;
static int pos;
}
void main () {
}
将字段标记为 static
意味着它们不是实例字段,因此结构中没有字段。这就是为什么您收到有关结构为空的错误消息的原因。我不确定 Vala 是否应该允许将结构字段标记为静态,但允许结构中的方法是静态的确实有意义。
您需要删除 static
修饰符。这将起作用:
struct First {
int data;
int pos;
}
void main () {
}
更新
我猜您正在尝试编写性能优化的代码,并且您认为 static
对此有所帮助。 static
在 Vala 中表示没有可用的实例数据。如果您使用的是 class 或结构之类的数据结构,那么只有拥有这些实例才有意义。如果您希望在程序的 运行 期间保持不变,请在命名空间中使用 const
。
如果您在程序中使用非常大的数字,使用结构可能会给您带来轻微的性能提升。在 Vala 中创建的结构分配在栈上而不是堆上,因此可能稍微快一些。如果您正在传递结构,您可能需要考虑 [SimpleType]
属性。这意味着结构将在 C 和 Vala 中按值传递。如果没有 [SimpleType]
,它们将在 C 级别通过引用进行复制和传递,这在 Vala 中显示为按值复制。
Vala 中的结构可以有初始化器(类似于 class 的构造器)和方法。所以我可以从你的第二个 pastebin 中提取什么你可以写成:
struct First {
int data;
int pos;
public First (int[] mass) {
data= 5;
pos = mass.length;
}
public int sas () {
return data + pos;
}
}
void main () {
int[] a = {1,3,0,1,2,3,2,1};
var b = First (a);
print (@"$(b.sas ())\n");
}
虽然这是一个后续问题,但应该作为 Stack Overflow 上的第二个问题提出。这是一个 public 论坛,其格式允许其他人从问题和答案中学习。
刚刚做了一个标准的求职面试,就是计算直方图中的水量。星期一,此代码有效,并且 still works 在此站点上。更新vala后,现在显示错误。
UPD:更简单 example
> Algoritm.vala:2.5-2.16: error: struct `Algotitm.first' cannot be empty
> struct first {
> ^^^^^^^^^^^^ Algoritm.vala:6.5-6.17: error: struct `Algotitm.second' cannot be empty
> struct second {
当 post 在 Stack Overflow 上提出问题时,post 一个 minimum, complete and verifiable example.
的代码示例总是好的从您提供的 link 来看,您的结构似乎只有成员标记为 static
:
struct First {
static int data;
static int pos;
}
void main () {
}
将字段标记为 static
意味着它们不是实例字段,因此结构中没有字段。这就是为什么您收到有关结构为空的错误消息的原因。我不确定 Vala 是否应该允许将结构字段标记为静态,但允许结构中的方法是静态的确实有意义。
您需要删除 static
修饰符。这将起作用:
struct First {
int data;
int pos;
}
void main () {
}
更新
我猜您正在尝试编写性能优化的代码,并且您认为 static
对此有所帮助。 static
在 Vala 中表示没有可用的实例数据。如果您使用的是 class 或结构之类的数据结构,那么只有拥有这些实例才有意义。如果您希望在程序的 运行 期间保持不变,请在命名空间中使用 const
。
如果您在程序中使用非常大的数字,使用结构可能会给您带来轻微的性能提升。在 Vala 中创建的结构分配在栈上而不是堆上,因此可能稍微快一些。如果您正在传递结构,您可能需要考虑 [SimpleType]
属性。这意味着结构将在 C 和 Vala 中按值传递。如果没有 [SimpleType]
,它们将在 C 级别通过引用进行复制和传递,这在 Vala 中显示为按值复制。
Vala 中的结构可以有初始化器(类似于 class 的构造器)和方法。所以我可以从你的第二个 pastebin 中提取什么你可以写成:
struct First {
int data;
int pos;
public First (int[] mass) {
data= 5;
pos = mass.length;
}
public int sas () {
return data + pos;
}
}
void main () {
int[] a = {1,3,0,1,2,3,2,1};
var b = First (a);
print (@"$(b.sas ())\n");
}
虽然这是一个后续问题,但应该作为 Stack Overflow 上的第二个问题提出。这是一个 public 论坛,其格式允许其他人从问题和答案中学习。