Задать вопрос

Перевод из C на Java. Указатели?

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

Есть программа на языке C и очень хочется её переписать на Java.

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

Как быть в этом случае?

Вот пример кода который хочеться перевести.

int decode(int correct_mode, int *errs, unsigned long *cw) <br>
/* This function decodes codeword *cw in one of two modes. If correct_mode <br>
   is nonzero, error correction is attempted, with *errs set to the number of<br>
   bits corrected, and returning 0 if no errors exist, or 1 if parity errors <br>
   exist. If correct_mode is zero, error detection is performed on *cw, <br>
   returning 0 if no errors exist, 1 if an overall parity error exists, and <br>
   2 if a codeword error exists. */ <br>
{ <br>
  unsigned long parity_bit; <br><br>
  if (correct_mode)               /* correct errors */ <br>
    { <br>
      parity_bit=*cw & 0x800000l; /* save parity bit */ <br>
      *cw&=~0x800000l;            /* remove parity bit for correction */<br><br>
      *cw=correct(*cw, errs);     /* correct up to three bits */ <br>
      *cw|=parity_bit;            /* restore parity bit */ <br><br>
      /* check for 4 bit errors */ <br>
      if (parity(*cw))            /* odd parity is an error */ <br>
        return(1); <br>
      return(0); /* no errors */ <br>
    } <br>
  else /* detect errors only */ <br>
    { <br>
      *errs=0; <br>
      if (parity(*cw)) /* odd parity is an error */ <br>
        { <br>
          *errs=1; <br>
          return(1); <br>
        } <br>
      if (syndrome(*cw)) <br>
        { <br>
          *errs=1; <br>
          return(2); <br>
        } <br>
      else <br>
        return(0); /* no errors */ <br>
    } <br>
} /* decode */ <br>


Заранее спасибо за помошь.

P.S. Если интересно то я пытаюсь реализовать код Голея. Более подробно можно почитать здесь: www.aqdi.com/golay.htm. Буду очень благодарен, если кто нибудь кинет ссылочек на библиотечки реализаций, если такие вообще имеются.
  • Вопрос задан
  • 8334 просмотра
Подписаться 5 Оценить Комментировать
Решения вопроса 1
kostik450
@kostik450
Вот это место
int decode(int correct_mode, int *errs, unsigned long *cw)

сделать так:
public int[] decode(int correct_mode, int errs, int cw);

Соответственно внутри функции везде вместо
*errs и *cs
сделать без звезд, то есть так:
errs и cs

ну и в конце функции, там где return(2), возвращаем так:
int[] arr = int long[3];
arr[1]=2;
arr[1]=errs;
arr[2]=cs;
return arr;
return 0 и return 1 аналогично.

А вызов оформляем так:
int[] arr = decode(correct_mode, errs, cw);
result = arr[0];
errs = arr[1];
cw = arr[2];
Вроде бы ничего не забыл.

Короче, возвращаем результат в виде массива, а потом десериализируем массив.
Можно, кстати и изначально в виде массива передавать,
внутри этот массив «курочить» и возвращать его же как результат.

А можно и вообще ничего не передавать и не возвращать, все внутри класса, то есть в итоге мы придем к тому, что написал уважаемый Maccimo в варианте a)

Но если стоит задача тупо переписать код С++ на Java без рефакторинга, то мой метод более идеален.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@Maccimo
В Java параметры в методы передаются по значению. В случае примитивных типов передаётся само значение, в случае классов — ссылка на экземпляр. out-параметров нет.

Варианты:

а) Переписать реализацию так, что бы выходных параметров не было. Например, создать класс, где оригинальная фунция decode и все вспомогательные станут методами, а параметры — полями класса с getters/setters.

б) Применить следующую уловку:

public class ByRef<T> {

	private T ref;

	public ByRef(T ref) {
		set(ref);
	}

	public T get() {
		return this.ref;
	}

	public void set(T ref) {
		this.ref = ref;
	}

}



Пример использования:

public class Foo {

	public static void bar(ByRef<String> value) {
		value.set("Good bye!");
	}

	public static void main(String... args) {
	
		ByRef<String> message = new ByRef<String>("Hello!");

		System.out.println("Before call: " + message.get());

		bar(message);

		System.out.println("After call: " + message.get());
	
	}

}



Но вариант «а» всё же более идеологически верный.
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
В вашем коде указатели действуют как ссылки, а ссылки то в JAVA есть. Побитовые операции тоже имеются. Так что я не вижу проблемы в том, что бы переписать это дело в JAVA

int decode(int corect_mode, ref int errs, ref long cw)
{
    //остальной код
    //...
    else {
        errs = 0;
        if(parity(cw))
        {
            errs = 1;
            return 0     
        }
        //Остальной код
    }

}

Ответ написан
rfq
@rfq
Программист
Чем извращаться и моделировать выходные параметры, возвращайте значение cw, а ошибку сигнализируйте экскпшеном.
Ответ написан
Комментировать
MrMeison
@MrMeison Автор вопроса
Все равно не получается :(
Выдает ошибку при объявлении метода decode:
Multiple markers at this line
- Syntax error on token "int", delete this
token
- Syntax error on token "long", delete
this token
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы