Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Вернуть double[] побочным эффектом.


Автор: arcsupport 28.12.2011, 16:00
Как в процедуре с помощью побочного эффекта вернуть массив double[].
У меня почему-то возвращаются одни NaN.

Автор: jk1 28.12.2011, 16:05
О какой процедуре речь? Приведите пожалуйста код.

Автор: MaxPayneC 28.12.2011, 16:34
А мне интересно, о каком побочном эффекте речь.

Автор: arcsupport 28.12.2011, 17:50
Ну, например, вот так для proc2:
Код
private double[] proc1() {
    double[] mas = new double [100];
    ...
    return mas;
}

private void proc2(double[] p) {
    ...
    p = proc1();
}

Автор: _Y_ 28.12.2011, 18:18
Как понимаю, нужно чтобы по формальному аргументу метода proc2 возвращался новый массив? 

Или я чего-то недополупонимаю, либо вот так напрямую это невозможно. Ведь массив это объект, а объекты передаются по ссылке. При вызове proc2(double[]p) Вы передаете в метод именно ссылку на объект, т.е. на его адрес. В методе же модифицируете не объект, а адрес. А поскольку адрес это не объект, то обратно он и не передается, т.к. по ссылке передаются только объекты.

Я бы просто упаковал все в простенький класс:

Код

class DblArray {
   public double[] p;
}


И вызов осуществлял бы таким образом:
Код

DblArray da = new DblArray (); 
proc2(da);
......


а сам метод переписал бы так:

Код

private void proc2(DblArray d) {
    ...
    d.p = proc1();
}

Автор: arcsupport 28.12.2011, 18:20
А можно ли это сделать с использованием System.arraycopy?

Автор: Stolzen 28.12.2011, 19:00
Ага, можно

Код

    public static void main(String[] args) {
        double[] array = new double[] { 10, 11 };
        proc1(array);
        System.out.println(Arrays.toString(array));
    }

    public static void proc1(double[] p) {
        double[] array = new double[] { 13, 14 };
        System.arraycopy(array, 0, p, 0, p.length);
    }


[13.0, 14.0]

Автор: arcsupport 28.12.2011, 20:49
Спасибо.

Автор: _Y_ 29.12.2011, 10:32
System.arraycopy вам годится только в том  случае, если программа всегда работает с массивами одинаковой длины.

В противном случае либо получите комбинацию из элементов нового и старого массивов, либо ошибку ArrayIndexOutOfBoundsException

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)