Как реализовать алгоритм с указателями и выделением памяти в Java

У меня есть алгоритм на C++, и мне нужно реализовать что-то подобное на Java. У меня проблемы с распределением памяти. Как я могу перенести следующий фрагмент, например, с C++ на Java?

size_x = 3; size_y = 6; 
double **Data, *pDataData;
Data = (double **)malloc(size_x*sizeof(double *)+size_x*size_y*sizeof(double));
for (i = 0, pDataData = (double *)(Data+size_x); i < size_x; i++, pDataData += size_y)
Data[i]=pDataData;

Я знаю, что для простого malloc, например: char *x = (char *) malloc(256); В Java я бы сказал: ByteBuffer x = ByteBuffer.allocate(250);

Для чего-то более сложного я запутался.

заранее спасибо


person Gloria    schedule 22.07.2011    source источник
comment
Я не уверен, что у Java есть такие возможности... даже если и есть, это все равно, что просить консервного ножа нарезать картошку... просто не стоит этого делать, иначе вы рискуете серьезно поранить себя и других. .   -  person Chris Pfohl    schedule 23.07.2011


Ответы (2)


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

Итак, похоже, вы пытаетесь выделить массив size_x указателей на удвоения, а затем двумерный массив size_x на size_y удвоений, с указателями, указывающими на последовательные строки в таблице? Извините, если я не понимаю, что вы пытаетесь сделать. Именно поэтому способ Java, по моему скромному мнению, лучше: сложные структуры не так уж сложно понять.

В Java не было бы необходимости иметь указатели на строки. Итак, в Java это просто превратилось бы в:

public class MyDataData
{
  double[][] table;

  public MyDataData(int size_x, int size_y)
  {
    table=new double[size_x][size_y];
  }
}

Чтобы вызвать его, вы просто напишите

MyDataData whatever=new MyDataData(3,6);

И это было бы об этом. Если вам нужна ссылка на строку, вы просто получите table[x].

Не пытайтесь имитировать malloc в Java. Это делается не так. Просто определите класс, который вам нужен, и используйте «новый», чтобы создать его, и Java позаботится о выделении памяти для вас.

person Jay    schedule 22.07.2011

Это двумерный массив.

double Data[][] = new double[size_x][size_y];
person Will Hartung    schedule 22.07.2011
comment
Это просто смешно. Этот вопрос действительно иллюстрирует разницу (иногда) между сложностью Java и сложностью С++... - person Chris Thompson; 23.07.2011
comment
@Chris Thompson: Не смешно, что люди думают, что это код C++. Код C++ будет выглядеть почти так же, как код Java. Вы можете написать ужасный код практически на любом языке. Вышеприведенный код - это просто код C, и не особенно хорошо написанный - на самом деле кажется немного глючным для распределения) - person Voo; 23.07.2011
comment
@Voo: Кто-то однажды сказал: достаточно опытный программист может написать программу FORTRAN на любом языке. Очевидно, вы можете написать программу на C на любом языке. В настоящее время я работаю над приложением Java, где для каждого класса оригинальный программист создал интерфейс. Даже когда есть только один класс, который его реализует, нет причин полагать, что когда-нибудь будет другой, и все ссылки находятся в одном пакете. Меня осенило, что этот парень изначально был программистом на C. Бьюсь об заклад, он подумал: «Как мне создать файл .h в Java? О, вот оно, в Java это называется интерфейсом... - person Jay; 23.07.2011