Arrays 如何在vala中创建对象实例数组

Arrays 如何在vala中创建对象实例数组,arrays,pointers,vala,Arrays,Pointers,Vala,当我试图找出为什么我只更新了一个时钟而不是所有时钟的错误时,我发现问题出在GLib.SList.prepend()。 从GLib.SList更改为Gee.ArrayList并没有解决问题。 在这个列表中,所有时钟部件的列表都是通过将它们附加到一个单独链接的列表中创建的。我试着模仿它,但结果是列表大小总是1,并且只有一个对象被追加 /* This is the list of all the ticking clocks */ static Gee.ArrayList<Clock> t

当我试图找出为什么我只更新了一个时钟而不是所有时钟的错误时,我发现问题出在
GLib.SList.prepend()
。 从
GLib.SList
更改为
Gee.ArrayList
并没有解决问题。 在这个列表中,所有时钟部件的列表都是通过将它们附加到一个单独链接的列表中创建的。我试着模仿它,但结果是列表大小总是1,并且只有一个对象被追加

/* This is the list of all the ticking clocks */
static Gee.ArrayList<Clock> ticking_clocks = null;
// ...
construct {
        ticking_clocks = new Gee.ArrayList<Clock> ();
    }
void start_ticking () {
        /* if no clock is ticking yet, start */
        if (ticking_clock_id == 0) {
            ticking_clock_id = GLib.Timeout.add_seconds (1, tick);
        }
        ticking_clocks.add (this); // Bug
        // Although instance pointer is different according to the number of instantiated objects!!!
        print ("Clock instance %p\n", this); 
        // always 1 !!!
        print ("Number of ticking clocks %d\n", ticking_clocks.size);
    }
/*这是所有滴答作响的时钟的列表*/
静态Gee.ArrayList ticking_clocks=null;
// ...
构造{
滴答作响的时钟=新的Gee.ArrayList();
}
无效开始时间(){
/*如果没有时钟在滴答作响,开始吧*/
如果(滴答声时钟id==0){
滴答声时钟id=GLib.Timeout.add\u秒(1,滴答声);
}
滴答作响的时钟。添加(此);//错误
//尽管实例指针根据实例化对象的数量而不同!!!
打印(“时钟实例%p\n”,此);
//永远是1!!!
打印(“滴答作响的时钟数%d\n”,滴答作响的时钟。大小);
}
谁能帮我指出这个问题吗? 提前感谢。

此功能:

void main(){
var a=新的SList();
a、 追加(新时钟());
a、 追加(新时钟());
a、 追加(新时钟());
a、 追加(新时钟());
a、 追加(新时钟());
打印(@“数组长度为$(a.length())\n”);
}
类时钟{}
我不确定您的代码中会出现什么问题,但我会从
滴答声时钟
字段中删除
静态
。它也可以用以下方式初始化:

private Gee.ArrayList ticking_clocks=new Gee.ArrayList();
我还将把股票代码移到实例外部。如果您的
SourceFunc
返回
Source.CONTINUE
将继续勾选。下面是一个使用
MainContext
的精简示例
MainContext
是GLib的
MainLoop
GaApplication
等中的事件循环。了解Vala的
async
函数/方法非常有用:

void main(){
var maincontext=maincontext.default();
var time_to_quit=false;
var计数=5;
SourceFunc quit=()=>{
打印(@“$count\n”);
计数--;
var result=Source.CONTINUE;
如果(计数<1){
退出时间=真;
结果=Source.REMOVE;
}
返回结果;
};
Timeout.add_秒(1,(拥有)退出);
while(退出时间=false){
maincontext.iteration(true);
}
}

请注意,
超时时间不精确,至少是一秒钟。因此,您可能需要增加频率,然后在更新时钟时检查时间。

非常感谢您提供详细信息。事实上,在gnome的帮助下,我解决了这个明显的问题。通过在
静态结构中添加列表的初始化
,我从您的解释中受益匪浅。谢谢