带有静态结构的Vala代码在更新到0.44后不起作用

时间:2019-03-15 03:19:30

标签: vala

进行标准的工作面试只是为了计算直方图中的水量。该代码在星期一有效,并且在该站点上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 {

1 个答案:

答案 0 :(得分:2)

在Stack Overflow上发布问题时,最好贴出一个示例代码minimum, complete and verifiable example

从您提供的链接看来,您有一个结构,其中只有标记为static的成员:

struct First {
    static int data;
    static int pos; 
}

void main () {
}

将字段标记为static意味着它们不是实例字段,因此该结构没有字段。这就是为什么您收到有关该结构为空的错误消息的原因。我不确定Vala是否应该允许将结构字段标记为静态,但是允许结构中的方法为静态确实有意义。

您需要删除static修饰符。这将起作用:

struct First {
    int data;
    int pos;
}

void main () {
}

更新

我猜您正在尝试编写性能优化的代码,而您认为static可以帮助您。 Vala中的static表示没有实例数据可使用。如果您使用的是类或结构之类的数据结构,则只有具有这些实例的实例才有意义。如果您希望程序运行期间某些内容保持不变,请在命名空间中使用const

如果您在程序中使用大量结构,则使用结构可能会稍微提高性能。在Vala中创建的结构在堆栈上分配,而不是在堆上分配,因此可能会更快一些。如果要传递结构,则可能需要考虑[SimpleType]属性。这意味着结构将在C和Vala中按值传递。如果没有[SimpleType],它们将被复制并在C级别通过引用传递,该引用在Vala中按值显示。

Vala中的结构可以具有初始化程序(类似于类的构造函数)和方法。因此,我可以从第二个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");
}

这是一个后续问题,应该作为堆栈溢出的第二个问题提出。这是一个公开论坛,遵循的格式允许其他人从问题和答案中学习。