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

问题描述 投票:-1回答:1

刚做标准的工作面试就是计算直方图中的水量。星期一这个代码工作了,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 {
vala
1个回答
2
投票

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

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

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

void main () {
}

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

你需要删除static修饰符。这将有效:

struct First {
    int data;
    int pos;
}

void main () {
}

Update

我猜你正在尝试编写性能优化的代码,你认为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");
}

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

© www.soinside.com 2019 - 2024. All rights reserved.