2012-03-20 7 views
4

私はCライブラリを純粋なJavaに変換する必要がありますが、これまで見た目は良くなっていましたが、ここでは固まっています。JavaプログラマからのCプログラミングに関する質問

誰かが私に次のポインタは何を説明することができますか?

double *DTimeSigBuf[MAX_TIME_CHANNELS]; 

[OK]私はDTimeSigBufという名前のダブルタイプのポインタだと知っていますが、大括弧内には何がありますか?どこか別のポインティングのように、この一定の値の変更は、コードに続い

#define MAX_TIME_CHANNELS 2 

が、私は正確に手段を何知らない:としても時間ファイルに定義されてMAX_TIME_CHANNELS。それは言うことと等価である:

double *DTimeSigBuf = MAX_TIME_CHANNELS; 

私がよく思い出す場合がアセンブラで似た何かがのように、だった:、間接アドレッシングモード・レジスタと呼ばれるmov [BX], CLこれはこれを行うには何がありますか?私は完全に失われているかもしれないことを知っている!なぜなら、タイトルが言うように、私はJavaプログラマーだからです。

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

がint block_size_samplesをし、chanNumイテレータ変数にある:

そして、他の質問、これを行うことの効果は何ですか?

助けてください!私はいつもグーグルで捜していた。

ありがとうございました:)

+2

Javaはまた、ブラケットを持っていませんか?彼らはC言語で同様の目的を果たします。 –

+5

質問は基本的なものです。個々の質問に先ずチュートリアルを見てください。特に配列を見てください。 – Mark

答えて

3

DTimeSigBufは、doubleのポインターの配列です。これは、配列doubleの配列として考えることができます。

double *DTimeSigBuf[MAX_TIME_CHANNELS]; 

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

として
double DTimeSigBuf[MAX_TIME_CHANNELS][] 

線を考えることができDTimeSigBuf[chanNum]によって指し示さアレイ状に配置するタイプdoubleの変数のblock_size_samples数にメモリを割り当てています。例えば

block_size_samples4で、chanNum1ある場合、あなたはそれをこのよう

考えることができます:以前に答えたよう

DTimeSigBuf[1] = new double[4]; 
+0

Nit: 'double'へのポインタの配列であり、' double'の配列へのポインタではありません。 –

+0

@JohnBode - 固定。 – ken

5

これは、2倍のポインターの配列です。 MAX_TIME_CHANNELSは配列のサイズです。

mallocでの文の効果は、block_size_samplesのdouble値に十分な大きさのメモリブロックの割り当てです。メモリブロックのアドレスは、DTimeSigBuf配列のchanNum要素に割り当てられます。

+0

ところで#define MAX_TIME_CHANNELS 2はプリコンパイラが2 MAX_TIME_CHANNELSのすべての値があるため、宣言はdouble * DTimeSigBuf [2]としてコンパイルされます。 – LuisEspinoza

2

DTimeSigBufは、ダブルスへのポインタの配列です。

割り当ては、倍精度の配列を割り当てています。つまり、返されるポインタは、block_size_samples倍の配列の最初のdoubleへのポインタです。

3

これは、double型の配列ポインタです。 MAX_CHANNEL_TIMESは定数であり、配列のサイズも

1

を、最初のセクションでは、ポインタの配列を宣言しています倍にする。宣言はではないので、必ずをCに割り当ててください.3行目では、新しい2倍の行にスペースを割り当てています。

それを破壊:

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 
3

お持ちの場合は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]; 
+0

ありがとうございました!これは非常に便利です! – RicardoE