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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача укзателя на простую переменную в функцию 
V
    Опции темы
Santa777
Дата 23.12.2009, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 23.12.2009

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



Здравствуйте,

  Перерыл интернет, но так до конца и нет понял можно ли все таки в Java передать в фукнцию указатель на простую переменную.
  В C++ это выглядело бы так:
Код

  class ClassA 
  {
      int i
  }

  void Inc( int* i )
  {
       (*i)++;
  }

  void main()
  {

      ClassA c;
      c.i = 1;

      Inc( &c.i );
  
      //i стало 2
  }

  Класс объявлен, чтобы показать, что переменная уже существует как просто переменная внутри класса. Ее нельзя хитро объявить саму по себе.
  
  Знатоки, подскажите, пожалуйста, как это может выглядеть в Java?

PM MAIL   Вверх
jk1
Дата 23.12.2009, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Насколько я знаю, такой возможности нет. В таких случаях в Java используются обертки примитивных типов.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
LSD
Дата 23.12.2009, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



В данном случае, скорее MutableInt, потому как стандартная обертка immutable.


--------------------
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   Вверх
jk1
Дата 23.12.2009, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Хм. Я был уверен, что для классов-оберток предпочтительна именно immutable-форма. В таком случае ссылка из класса-обертки на фактическое значение потенциально неспособна стать ссылкой из старого поколения в новое, усложнив работу сборщику мусора. Или я не прав?

Вопрос снят. что-то я тормознул, с immutable действительно ничего не выйдет 

Это сообщение отредактировал(а) jk1 - 24.12.2009, 09:50


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Santa777
Дата 23.12.2009, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 23.12.2009

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



  Там именно что все уже определено - int и все.
  Как понял, прав jk1, с примитивными типами такого нельзя.
  Спасибо!

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

    a = 1;
    b = 2;

    int xchg;
    xchg = a;
    a = b;
    b = xchg;

  И так 5 раз.
  Неужели в Java для таких случаев ничего не предусмотрено?


Это сообщение отредактировал(а) Santa777 - 23.12.2009, 16:17
PM MAIL   Вверх
serger
Дата 23.12.2009, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

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



Насколько помню, эти тонкости разобраны в книге Эккеля "Философия Java". Достать её не трудно.

Добавлено через 1 минуту и 4 секунды
Цитата(Santa777 @  23.12.2009,  16:14 Найти цитируемый пост)
Неужели в Java для таких случаев ничего не предусмотрено?

Нет, а что бы хотелось?


--------------------
упс!
PM MAIL WWW Skype GTalk Jabber   Вверх
Santa777
Дата 23.12.2009, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 23.12.2009

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



Цитата

Цитата(Santa777 @  23.12.2009,  16:14 Найти цитируемый пост)
Неужели в Java для таких случаев ничего не предусмотрено?

Нет, а что бы хотелось?


Чего-нибудь типа C-шного же #define:

#define xchg(a, b) {int xchg; xchg = a; a = b; b = xchg;}

Просто, так сказать, и сердито.
Или они есть где-нибудь?


Это сообщение отредактировал(а) Santa777 - 23.12.2009, 17:00
PM MAIL   Вверх
Skynin
Дата 23.12.2009, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 1.7.2007
Где: Харьков

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



В Java нет указателей на типы-значения. Только ссылки на объекты.

Поэтому либо использовать обертки, либо

Код

public class ABvalue {
public int a, b;

public ABvalue(int pA, int pB) {
a = pA; b = pB;
}

...

... ... swapAB(ABvalue pAB) {
int tmpI = pAB.a;
pAB.a = pAB.b;
pAB.b = tmpI;
}

...

ABvalue tttAB = new ABvalue(1,2);

...

xxxx.swapAB(tttAB);



то есть создание аналога структуры и работа с ней.

Цитата

Чего-нибудь типа C-шного же #define:

В Java нет препроцессора. И много чего нет, что есть в С++, перечислять утомительно.
Лучше прочтите какую-нить книгу по Java. Рекомендую "Философия Java" Б. Эккеля

Это сообщение отредактировал(а) Skynin - 23.12.2009, 17:11
PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
COVD
Дата 23.12.2009, 17:23 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

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



Цитата

Нет, а что бы хотелось?


Хотелось бы на всех иностранных языках говорить русскими фразами. И только слова подставлять из соответствующего словаря. И чтобы понимали. smile   
PM MAIL   Вверх
math64
Дата 24.12.2009, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Приведённые обертки не изменяют поле класса, поэтому не годятся. Нужно что-то вроде этого:
Код

public class ClassA {
  public interface IntRef {
     int get();
     void set(int v);
  }
  private int a, b, c;
  IntRef A = new IntRef() { public int get() { return a; } public void set(int v) { a = v; } };
  IntRef B = new IntRef() { public int get() { return b; } public void set(int v) { b = v; } };
  IntRef C = new IntRef() { public int get() { return c; } public void set(int v) { c = v; } };
  public void swap(IntRef x, IntRef y) {
     int temp = x.get(); x.set(y.get()); y.set(temp);
  }
  public void foo() {
    swap(A, B);
    swap(B, C);
  }
}

PM   Вверх
serger
Дата 24.12.2009, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

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



Цитата(Santa777 @  23.12.2009,  16:55 Найти цитируемый пост)
Чего-нибудь типа C-шного же #define:

#define xchg(a, b) {int xchg; xchg = a; a = b; b = xchg;}


Тогда уж проще :
Код

def a=1
def b=2
println "$a,$b"
(a,b) = [b,a]
println "$a,$b"


Посмотрите groovy.
http://groovy.codehaus.org/Statements

Это сообщение отредактировал(а) serger - 24.12.2009, 14:37


--------------------
упс!
PM MAIL WWW Skype GTalk Jabber   Вверх
Zefick
Дата 25.12.2009, 05:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 3.12.2009

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



Странно, что ещё никто не предложил оборачивать переменную в массив, а ведь это часто используется.
Код

class A {
    void Inc(int i[]){
        i[0]++;
    }

    public static void main(String[] args){
        int i = 1;
        Inc(new int[] {i});
    }
}

PM MAIL   Вверх
math64
Дата 25.12.2009, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Цитата(Zefick @  25.12.2009,  05:50 Найти цитируемый пост)
Странно, что ещё никто не предложил оборачивать переменную в массив, а ведь это часто используется.

Тот же недостаток, что и у обычных обёрток - результат остаётся в массиве и после вызова функции его нужно вернуть в поле класса.
Хотя я им тоже часто пользуюсь.
PM   Вверх
LSD
Дата 25.12.2009, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(math64 @  24.12.2009,  09:16 Найти цитируемый пост)
Приведённые обертки не изменяют поле класса, поэтому не годятся. Нужно что-то вроде этого:

А поле класса объявить как MutableInt, не?


--------------------
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   Вверх
math64
Дата 28.12.2009, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Цитата(LSD @  25.12.2009,  17:09 Найти цитируемый пост)
А поле класса объявить как MutableInt, не?

Можно и так (или объявить поле класса как int[1]), в зависимости от требований к скорости и размеру кода.

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

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

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


 




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


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

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