перевести код c на java

#java #c #pointers #struct #translation

#java #c #указатели #структура #перевод

Вопрос:

Мне нужно перевести некоторые c на java, но у меня есть несколько проблем.

Как мне иметь дело с указателями, когда они объявляются в качестве аргументов в методе?

 static void test( double *output){}
 

Кроме того, что такое и как я могу заменить struct ?

 struct test { int t;
int arg;
float *pva;
double *array;
}
 

А затем в коде, который они используют:

 double test(struct test *test)
{}
 

Да, и последнее.. это также внутри struct test, что означает :

 test->arg
 

Ответ №1:

 static void test( double *output){}
 

Это требует большего контекста, это может означать указатель на двойник или массив двойников.

 struct test { int t;
int arg;
float *pva;
double *array;
}
 

A struct — это a class с public уровнем доступа по умолчанию. Вы можете заменить его классом с public членами.

 test->arg
 

Это позволяет получить доступ к arg входящему члену test .

Ответ №2:

В Java нет указателей, только ссылки и только для объектов (не для примитивных типов). Ссылки похожи на указатели, но вы используете обозначение ‘.’ вместо ‘*’ или ‘->’. Кроме того, вам не нужно удалять объекты в Java, вы просто перестаете их использовать, и в конечном итоге сборщик мусора уничтожает их.

Отвечая на ваши вопросы выше, снизу вверх: если test является указателем на структуру или класс в C , а arg является переменной-членом test , то

 test->arg
 

используется для доступа к элементу через указатель. Это будет соответствовать

 test.arg
 

в Java, если arg является общедоступной переменной-членом тестового объекта.

Я бы перевел следующее:

 struct test
{
    int t;
    int arg;
    float *pva;
    double *array;
}

...

double test(struct test *test)
{}
 

Для

 public class Test
{
    public int t;

    public int arg;

    float [] pva;

    double [] array;
}

...

public static double test(Test test)
{}
 

Для первого случая, т.е. функции

 static void test( double *output){}
 

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

 static double test(double output)
{}
 

Я надеюсь, что это поможет.

Комментарии:

1. Или вы могли бы сделать это способом c , передав double[] размера 1 и изменив его содержимое (полезно, когда метод уже имеет другой возвращаемый тип)

Ответ №3:

В простых случаях вы можете заменить float * и double * на float [] и double [] , однако C позволяет вам делать всевозможные неприятные вещи, которые трудно перевести на Java, потому что это запрещено в Java.

Вы можете заменить a struct на class

Если вы хотите понять базовый синтаксис C , я предлагаю вам прочитать руководство о том, как программировать на C .

Комментарии:

1. … «Если вы хотите понять базовый синтаксис C , я предлагаю вам прочитать руководство о том, как программировать на C » … ммм

2. Мы не можем помогать ему переводить построчно, поскольку C имеет много уровней сложности, которых нет у Java. Он должен уметь читать базовый код на C .

3. void test(double * output) может относиться либо к передаче массива double, либо к передаче указателя на один double, в который записывается вывод. Выбор имени для атрибута, по-видимому, указывает на последнее.

4. Если у вас есть метод с возвратом одного двойного значения, я бы ожидал, что он будет записан как double test() .

Ответ №4:

(1) static void test( double *output){}

Здесь double* можно заменить на a Double[] (предположим , что вы делаете a new Double[] ) , и метод может быть помещен внутрь a class .

 class testMethod {
  public static void test (Double []output) { }
}
 

(2) как я могу заменить struct ?
Его можно заменить на class .

 class test {
public int t;
public int arg;
public Float []pva;
public Double []array;
}
 

(3) double test(struct test *test) {}
Это может быть,

 double test (test t) {}
 

(4) test->arg

Java не имеет указателей (хотя она реализована со ссылкой); поэтому приведенное выше утверждение будет test.arg

Комментарии:

1. Почему мы должны использовать Float[] или Double[] вместо float[] или double[] ?

2. Я думаю, вы хотите double вместо Double . Аналогично для Float .

3. @PeterLawrey, я предположил, что OP может захотеть выполнить динамическое распределение на C (т.Е. new double[100] ). Что было бы более подходящим, как new Double[100] , в Java.

4. В Java вы можете использовать new double[100] (массив примитивного типа double) или new Double[100] (массив объектов Double). Однако я не вижу преимущества в использовании второй возможности.

5. Первый случай может относиться либо к передаче массива double , либо к передаче указателя на один double, в который записывается вывод. Выбор имени для атрибута, по-видимому, указывает на последнее.