Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача значения переменной в процедуру по ссылке 
:(
    Опции темы
Snipe
Дата 20.8.2005, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 20.8.2005
Где: Архангельск

Репутация: нет
Всего: нет



Только начал изучать Java(до этого работал в Delphi) и столкнулся с проблемой:
значение переменной не получается передать по ссылке, а только по значению. Как это можно реализовать?Хочется сотворить что-то вроде:

procedure example(a,b:integer;var x:integer);
begin
x:=a+b;
end;


PM MAIL ICQ   Вверх
batigoal
Дата 20.8.2005, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Переменные простых типов всегда передаются по значению. По ссылке в Java передаются объекты классов.

Для твоего примера следует поступить так:
Код

public int sum(int a, int b)
{
 return a+b;
}

Добавлено @ 14:07
Добавлю, что в Java методы не могут существовать вне классов.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
LSD
Дата 20.8.2005, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Для передачи параметров простых типов по ссылке надо использовать объекты: или стандартные Integer, Double и т.д. (правда они не изменяемые и смысла особого в них нет), или массивы например int[] с длинной 1 (требуется проверка на то что массив будет длинны 1), или самому написать класс наподобие стандартных оберток, но позволяющий изменять передаваемое значение.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
batigoal
Дата 20.8.2005, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



LSD
Это, конечно, технически верно, но в данном случае, мне кажется, куда грамотнее будет сделать по простому варианту. smile


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Snipe
Дата 21.8.2005, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 20.8.2005
Где: Архангельск

Репутация: нет
Всего: нет



А если требуется изменять значение двух или более переменных например классическая задача на решение квадратного уравнения через дискрименант
procedure kv_ur(a,b,c:integer;var x1,x2:integer);
ведь с помощью функции этого сделать не получится
PM MAIL ICQ   Вверх
LSD
Дата 21.8.2005, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Snipe @ 21.8.2005, 16:22)
А если требуется изменять значение двух или более переменных

Тогда или массивы или свои классы-оболочки.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
batigoal
Дата 21.8.2005, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Делать нефиг, займусь чтением лекций smile

Будем мыслить в терминах объектно ориентрованного программирования. Сделаем класс квадратного уравнения (QuadraticEquation), у которого есть коэффициенты (a,b,c), корни (x1, x2) и метод solve(), т.е. "решить". Поля обычно принято делать закрытыми (private), и обращаться к ним с помощью методов set/get.

Код

import java.lang.Math;

class QuadraticEquation {

    // коэффициенты
    private double a;
    private double b;
    private double c;

    // дополнительно введем поле для хранения дискриминанта
    private double disc;

    // корни
    private double x1;
    private double x2;

    // конструктор
    public QuadraticEquation(double a, double b, double c)
    {
        setCoefficients (a, b, c);
    }

    // установить значения коэффициентов
    public void setCoefficients (double a, double b, double c)
    {
        this.a = a;
        this.b = b;
        this.c = c;
        disc = b*b - 4*a*c;
    }

    // метод, который возвращает количество действительных корней уравнения
    public int getRootQuantity()
    {
        if(disc>0) return 2;
        else if(disc==0) return 1;
        else return 0;
    }

    // метод для решения уравнения
    // договоримся, что если уравнение имеет корни, метод вернет true,
    // иначе - false
    public boolean solve()
    {
        switch(getRootQuantity())
        {
            case 0:
                return false;
            case 1:
                x1 = x2 = -(b/(2*a)); // корни равны
                return true;
            case 2:
                x1 = (-b + Math.sqrt(disc))/(2*a);
                x2 = (-b - Math.sqrt(disc))/(2*a);
                return true;
        }
        return false;
    }

    // получить значения
    public double getX1() { return this.x1; }
    public double getX2() { return this.x1; }
}

public class Main
{
    public static void main(String[] args)
    {
        // создать уравнение с задланными коэффициентами
        QuadraticEquation qe = new QuadraticEquation(1,-2,1);

        // вывести количество корней
        System.out.println("Actual roots number: " + qe.getRootQuantity());

        // если уравнение имеет решение, вывести корни
        if(qe.solve() == true)
        {
            System.out.println("The first root is "+qe.getX1());
            System.out.println("The second root is "+qe.getX2());
        }
    }
}


Поначалу кажется громоздким и непривычным, потом - правильным и элегантным.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Guest
Дата 24.8.2005, 15:24 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Lamer George большое тебе спасибо. Решение выглядит понятным, но немножко непривычным. Надеюся позднее освоюсь с этим принципом. А с чем связаны такие ограничения на передачу параметров? Если можно передавать значение, то почему бы ны передать его по ссылке?
  Вверх
batigoal
Дата 24.8.2005, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Цитата(Guest @ 24.8.2005, 16:24)
Решение выглядит понятным, но немножко непривычным. Надеюся позднее освоюсь с этим принципом.

Думаю, без серьезных проблем. Ведь массовый переход к ООП был вызван именно упрощением восприятия с точки зрения программистов.

Цитата(Guest @ 24.8.2005, 16:24)
А с чем связаны такие ограничения на передачу параметров?

В принципе, особых ограничений нет. Если ты воспользуешься не простым типом (int), а напишешь собственный класс (MyInt), то сможешь изменять объект, переданный по ссылке как аргумент. Но это считается плохим стилем. Например, если другой программист воспользуется твоим кодом, он может и не знать что твой метод что-то меняет в его объекте, и это вызовет ошибки.

Цитата(Guest @ 24.8.2005, 16:24)
Если можно передавать значение, то почему бы ны передать его по ссылке?

Это связано с механизмом выделения памяти, но объяснять не буду, потому что сам толком не понимаю. smile

Это сообщение отредактировал(а) Lamer George - 24.8.2005, 15:38


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
LSD
Дата 24.8.2005, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Lamer @ 24.8.2005, 16:37)
Например, если другой программист воспользуется твоим кодом, он может и не знать что твой метод что-то меняет в его объекте, и это вызовет ошибки.

Иногда такой подход оправдан, те же методы InputStream.read(byte[]), параметр передается по ссылке, изменяется и плюс возвращается еще один дополнительный параметр.

Например в примере с уравнениями можно было сделать такую функцию
Код
public int evaluateEquation(double[] coefficients, double[] roots)
{
  int rootsNumber;
//Считаем корни и записываем их в roots
  return rootsNumber;
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
batigoal
Дата 24.8.2005, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Цитата(LSD @ 24.8.2005, 19:51)
Иногда такой подход оправдан

Не только опавдан, но и практически незаменим smile

Но в данном примере (об уравнениях) я бы все-таки предпочел свой вариант как более "строгий" с точки зрения ООП.

Это сообщение отредактировал(а) Lamer George - 24.8.2005, 22:31


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.3267 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.