2017-05-01 5 views
1

私はC++からJavaにいくつかのコードを移植しようとしています。コードはC++で次のようになります。この変数はどのようにintとして使用され、cppでは配列として使用されますか?

uint8_t r, g, b, bit, limit, *ptr; 

    ... 

    if(y < nRows) { 
    // Data for the upper half of the display is stored in the lower bits of each byte. 
    ptr = &matrixbuff[backindex][y * WIDTH * (nPlanes - 1) + x]; // Base addr 
    // Plane 0 is a tricky case -- its data is spread about, 
    // stored in least two bits not used by the other planes. 
    ptr[WIDTH*2] &= ~B00000011;   // Plane 0 R,G mask out in one op 
    if(r & 1) ptr[WIDTH*2] |= B00000001; // Plane 0 R: 64 bytes ahead, bit 0 
    if(g & 1) ptr[WIDTH*2] |= B00000010; // Plane 0 G: 64 bytes ahead, bit 1 
    if(b & 1) ptr[WIDTH] |= B00000001; // Plane 0 B: 32 bytes ahead, bit 0 
    else  ptr[WIDTH] &= ~B00000001; // Plane 0 B unset; mask out 
    // The remaining three image planes are more normal-ish. 
    // Data is stored in the high 6 bits so it can be quickly 
    // copied to the DATAPORT register w/6 output lines. 
    for(; bit < limit; bit <<= 1) { 
     *ptr &= ~B00011100;   // Mask out R,G,B in one op 
     if(r & bit) *ptr |= B00000100; // Plane N R: bit 2 
     if(g & bit) *ptr |= B00001000; // Plane N G: bit 3 
     if(b & bit) *ptr |= B00010000; // Plane N B: bit 4 
     ptr += WIDTH;     // Advance to next bit plane 
    } 
    } else { 
    // Data for the lower half of the display is stored in the upper 
    // bits, except for the plane 0 stuff, using 2 least bits. 
    ptr = &matrixbuff[backindex][(y - nRows) * WIDTH * (nPlanes - 1) + x]; 
    *ptr &= ~B00000011;     // Plane 0 G,B mask out in one op 
    if(r & 1) ptr[WIDTH] |= B00000010; // Plane 0 R: 32 bytes ahead, bit 1 
    else  ptr[WIDTH] &= ~B00000010; // Plane 0 R unset; mask out 
    if(g & 1) *ptr  |= B00000001; // Plane 0 G: bit 0 
    if(b & 1) *ptr  |= B00000010; // Plane 0 B: bit 0 
    for(; bit < limit; bit <<= 1) { 
     *ptr &= ~B11100000;   // Mask out R,G,B in one op 
     if(r & bit) *ptr |= B00100000; // Plane N R: bit 5 
     if(g & bit) *ptr |= B01000000; // Plane N G: bit 6 
     if(b & bit) *ptr |= B10000000; // Plane N B: bit 7 
     ptr += WIDTH;     // Advance to next bit plane 
    } 
    } 

私はptr

の使用を理解していないそれは、intとして宣言されています。

uint8_t ... *ptr;

そして、それはいくつかに設定されています値

ptr = &matrixbuff...

しかしアレイ

ptr[WIDTH*2] &= ~B00000011;

何として使用しているようですか?これはintとして宣言されている

+0

'uint8_t'に*ポインタ*として宣言されています - この場合は配列を指しているようです – UnholySheep

+0

これは配列の動作ではありません。' * ptr&=〜B00011100; 「そう? – Blundell

+0

Javaは数値ポインタを使用せず、オブジェクトへの抽象的な参照を使用します。あなたはここでやっているようにポインタ演算を行うことはできません。 – Novaterata

答えて

3

誰かがしてください説明(と、これはJavaで可能である)ことができます:JavaおよびCからその構文を導出する他の多くの言語とは異なり

uint8_t ... *ptr; 

、C++ができます1つの宣言で異なる型の変数を宣言します。 r,g,bなどはすべてuint8_tptrではありませんが、先頭にアスタリスクが付いているためです。この接頭辞はptrポインタuint8_tにします。

次に再び

ptr = &matrixbuff[some_index] 

いくつかの値に設定され、プレフィックスは手掛かりを提供します。この時間は、それは次式のアドレスをとるプレフィックスオペレータ&です。

しかし、C++は、それが配列であるかのようにあなたは、ポインタを使用することができますので、あまりにも、右だ配列

ptr[WIDTH*2] &= ~B00000011; 

として使われているようです。場合によっては、配列をポインタのように使用することもできますが、一般に2つの概念を混同しないでください。

かいつまんで、あなたはタイプT*のポインタpと整数値ip[i]*(p+i)と等価である式を持って、そのアドレスからTiサイズのオフセットでタイプTの値を参照する場合pが指している。したがって、ポインタの振る舞いは配列の振る舞いを模倣します。

あなたは、例えば、 ptrのインデックスと ptr自体の指標の組み合わせとして計算インデックスと matrixbuff上の操作に ptr上で操作を翻訳しなければならないJavaでは

ptr[WIDTH] 

は、配列が宣言されると、メモリが連続割り当てられ

matrixbuff[backindex][y * WIDTH * (nPlanes - 1) + x + WIDTH] 
//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^ 
//        Origin    Index 
1

なります。実際に彼らは、したがって、あなたがc[0],c[1],c[2],c[3]としてそれらにアクセスすることができ、連続したメモリ位置に格納されているここで、各文字a-d c = "abcd"; :あなたはC++でchar *cのように変数を宣言する場合は、実際にそれをのような文字列を割り当てることができ*c, *(c+1), *(c+2), *(c+3)を。 byteuint8_tに適している理由をあなたはhereを参照することができuint8_t *ptrbyte[] ptr;として

Javaでは、あなたは宣言してもよいですか?

関連する問題