开发日志 170216

今天还在做那个遥控器,UI基本上弄完了。昨天做到按住按键后连续触发事件,今天编写了具体的事件处理逻辑,比如引擎功率+1,顺手更新一下UI。目前有个问题在于,表示方向的SeekBar能拖动,但拖动了并没有用,再次点击转向会被打回去。已知的解决方案是继承SeekBar然后重写掉onStartTrackingTouch、onStopTrackingTouch和onProgressChanged这三个方法,不过今天就先不折腾了。

UDP包也能发送,就差填好具体发送的内容了。明天做这个。

今天踩到了一个坑,是关于Integer, int, Double, double的,虽然Double是double的内建引用类型,但不能把它简单理解成一个“指针”,因为它没有提供修改内容的方法。

使用一段简单的代码来说明这个问题:

class Main{

    static void fky(Double a) {
        ++a;
    }
    public static void main(String[] args) {
        Double var = 0.0;
        //Double targetVar = var;
        //targetVar += 1;
        fky(var);
        System.out.println(var);
    }
}

我需要在两个线程间共享一个double类型的变量,按照最基本的思路,我只要传一个引用作为参数就可以了。不过我发现,修改了Double之后,原值不变。比如这段代码,就输出0。

这是因为,Double没有提供修改其中的值的方法,如果对Double进行了计算,就相当于新造了一个Double,然后指向了它的引用。

也就是说,这个++a,意味着程序构造了一个新的Double,然后把a指向了它,而不是将其中的内容+1。类比C的写法:

void fky(double *a) {
    double *b = (double*) malloc(sizeof(double));
    *b = *a + 1;
    a = b;
}

这肯定没用的啦……而且Java又不提供&a这种引用传法,只好老老实实的构造了一个pDouble“指针”类。

发表评论