Вопросы программирования на C от Java-программиста - PullRequest
4 голосов
/ 20 марта 2012

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

Может кто-нибудь объяснить мне, для чего нужен следующий указатель?

double *DTimeSigBuf[MAX_TIME_CHANNELS];

Хорошо, я знаю, что это указатель двойного типа с именем DTimeSigBuf, но что это в скобках? также MAX_TIME_CHANNELS определяется в файле h как:

 #define MAX_TIME_CHANNELS 2

затем в коде это постоянное значение изменяется, как и его указание куда-то еще, но я не знаю, что именно означает. это эквивалентно сказать:

double *DTimeSigBuf = MAX_TIME_CHANNELS;

Если я хорошо помню, в ассемблере было что-то похожее, например: mov [BX], CL, называемый регистром режима косвенной адресации, это как-то связано с этим? Я знаю, что я могу быть полностью потерян! потому что, как видно из названия, я программист Java.

И другой вопрос, каков эффект от этого:

DTimeSigBuf[chanNum]            = (double*)malloc(block_size_samples*sizeof(double));

Где block_size_samples - это int, а chanNum - это переменная для итератора?

Пожалуйста, помогите! Я знаю, я все время гуглил.

Спасибо, ребята:)

Ответы [ 6 ]

5 голосов
/ 21 марта 2012

Это массив указателей для удвоения.MAX_TIME_CHANNELS - размер массива.

Эффектом оператора с malloc является выделение блока памяти, достаточно большого для двойных значений block_size_samples;адрес блока памяти затем присваивается элементу chanNum массива DTimeSigBuf. * ​​1003 *

3 голосов
/ 21 марта 2012

Если у вас есть код на C, например:

#define MAX_TIME_CHANNELS 2 
double *DTimeSigBuf[MAX_TIME_CHANNELS]; 

В Java это выглядит так:

final static int MAX_TIME_CHANNELS = 2;
double DTimeSigBuf[][] = new double[MAX_TIME_CHANNELS][]; 

И это в C:

DTimeSigBuf[chanNum] = (double*)malloc(block_size_samples*sizeof(double));

выделяетпространство для измерения y.

В Java это:

DTimeSigBuf[chanNum] = new double[block_size_samples];
3 голосов
/ 21 марта 2012

DTimeSigBuf - массив указателей для типа double.Это можно представить как массив массивов типа double.

double *DTimeSigBuf[MAX_TIME_CHANNELS];

можно представить как

double DTimeSigBuf[MAX_TIME_CHANNELS][]

Линия

DTimeSigBuf[chanNum] = (double*)malloc(block_size_samples*sizeof(double));

выделяет память для block_size_samples числа переменных типа double для размещения в массиве, на который указывает DTimeSigBuf[chanNum].

Например:

Еслиblock_size_samples - это 4, а chanNum - это 1, вы можете думать об этом так:

DTimeSigBuf[1] = new double[4];
3 голосов
/ 21 марта 2012

Указатель массива типа double.MAX_CHANNEL_TIMES - это константа, а также размер массива

2 голосов
/ 21 марта 2012

DTimeSigBuf - массив указателей на удвоения.

Распределение - это выделение массива двойников.То есть возвращаемый указатель является указателем на первый дубль в массиве block_size_samples doubles.

1 голос
/ 21 марта 2012

Как уже было сказано ранее, первые разделы объявляют массив указателей на двойные.Поскольку объявление не обязательно выделяет память в C, третья строка выделяет место для новой строки значений типа double.

Разбивка:

DTimeSigBuf[chanNum] // chanNum is the position in the array
= // equals
(double*) // memory address to a double
malloc(  // get some memory from the system
block_size_samples*sizeof(double)); // number of samples times memory needed for one double
...