2012-03-28 21 views
1

私はJavaでオブジェクトのアドレスに安全にアクセスできないことを知っています。このようなことは絶対にしないでください。しかし、私はこのCコードをJavaに変換する必要があります。値は常にサイズ8 bitsです。私はshort outc[]short outp[]unsigned char* outcunsigned short* outpを変換しているのJavaに変換するにはCコードからJavaへの変換:ポインタ

void merge(int value,unsigned short* outp, int x,int y, int width) 
{ 
    unsigned char *outc; 
    outc=(unsigned char *) outp + y*width +x; 
    *outc=value; 
} 

:Cのコードは次のようです。それから私は部分的に値を割り当てることができます。しかし、私が直面している問題は、この関数が別の関数によってループ内で呼び出されたときに、幅が毎回増え、特定のセルに1バイトしか割り当てられないということです。

void merge(int value, int outp[], int x, int y, int width) 
{ 

if(outp[y*width + x] >0) 
    {  
     outp[y*width+x]=outp[y*width+x]<<8 +value; 
    } 
    else 
    { 
     outp[y*width+x]=value; 
    } 
} 

どうすればいいですか?助けてください。ありがとう。

+1

しないでください。これは、読みやすさに重大な影響を与えます。論理を理解し、Javaで同じことを書き直してみてください。コメントを追加すると、あなたの隣の人があなたを祝福します。 – questzen

+0

@questzen申し訳ありませんが、私は何をしないか理解していませんでした.. –

+0

1ワード '可読性'。次の人は何が起こっているのか把握するために同じハードルを通過する必要があります。 – questzen

答えて

3

ポインタがないjavaでは「可能」ではありません。それはcharのようなプリミティブ型とは無関係の参照を持っています。

ので、Javaで私たちは通常、Cプログラマのようなポインタを経由して値を返すのではなく、値を返すメソッドを使用して行います。

char merge(int value,int x,int y, int width) { 
    char outchar; 
    /// your code... 
    return outchar; 
} 
+0

しかし、このコードは非常に大きなプロジェクトの一部です。私は約10000行のJavaコードを書いています。私はコードを動作させるためにこの関数を書く必要があります。 –

+0

-1は、問題の解決に完全に無関係なアドバイスを提供します。 – josefx

+0

+1、JavaでCを記述しようとしていないためです。 –

0

私はあなたのコードは何をすべきか見当がつかない。私にとっては、shortの下位バイトを指定された値に設定するだけで、javaコードのシフトが外れているように見えます。何らかの理由であなたは短い置き換えられているので[] intが[]以下は役立ちます場合、私は知らないで:

void merge(int value,short[] outp, int x,int y, int width){ 
    int address = y*width +x; 
    short temp = outp[address]; 
    temp &= 0xFF00;//keep the high order bits of the old value 
    temp |= (short)(value & 0x00FF);//set the low order bits 
    outp[address] = temp; 

} 
0

をあなたのCコードは、内の特定の場所でセルのアドレスを見つけるために、ポインタ演算のように見えますグリッドを作成し、その位置に値を設定します。

Javaコードの場合は、全く異なる方法をお勧めします。 呼び出しコードがグリッドに使用するデータ構造は何ですか? グリッドをモデル化するクラスを使用でき、setValue(x、y)メソッドが含まれています。クラスが内部的にグリッドをモデル化する方法は、あなた次第です.2次元配列を使用できます。

0

プロジェクト用にJavaを使用しようとしたCプログラマとして、私はあなたの不満を確実に認識することができます。

問題を解決するために、1D Java bytearrayで2Dデータにアクセスしようとします。

これにより、(row * col)バイトにアクセスするのが簡単になり、このラッパーコードの必要性がなくなります(ループで非常にコストがかかる)。

JavaまたはCから配列を割り当てるかどうかは、プロジェクトによって異なりますが、JNI呼び出しによって両方の解決策が可能になります。

幸運を祈る!

関連する問題