代码之家  ›  专栏  ›  技术社区  ›  gavr

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

  •  0
  • gavr  · 技术社区  · 6 年前

    刚刚做了一个标准的工作面试就是计算直方图中的水量。在星期一,这个代码起作用了,而且 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 {
    
    0 回复  |  直到 6 年前
        1
  •  2
  •   AlThomas    6 年前

    当在堆栈溢出上发布一个问题时,最好发布一个 minimum, complete and verifiable example .

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

    struct First {
        static int data;
        static int pos; 
    }
    
    void main () {
    }
    

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

    你需要移除 静止的 修饰语。这将起作用:

    struct First {
        int data;
        int pos;
    }
    
    void main () {
    }
    

    更新

    我猜你是想写性能优化的代码 静止的 有帮助。 静止的 在Vala中,意味着没有要使用的实例数据。如果您使用的是类或结构之类的数据结构,那么只有这些数据结构的实例才有意义。如果要在程序运行期间保持不变,请使用 const 在命名空间中。

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

    Vala中的结构可以有初始值设定项(类似于类的构造函数)和方法。所以我可以从你的第二个垃圾箱中提取你可以这样写:

    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");
    }
    

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