#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, в который записывается вывод. Выбор имени для атрибута, по-видимому, указывает на последнее.