2012-03-28 160 views
1

我知道我們無法在Java中安全地訪問對象的地址,因此我們不應該嘗試這樣做。但我需要將此C代碼轉換爲Java。值總是大小爲8 bits。 C代碼是這樣的:將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; 
} 

要將其轉換成Java我已經轉換到unsigned short* outpshort outp[]unsigned char* outcshort outc[]。然後我可以分配值。但我面臨的問題是,當這個函數被循環調用時,其他函數的寬度每次增加,只有一個字節被分配給一個特定的單元格。

我試過這個Java代碼:

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 2012-03-28 13:57:15

+0

@questzen對不起,但我不明白不該做什麼.. – 2012-03-28 14:00:05

+0

一個字'可讀性'。下一個人將不得不經歷相同的障礙來弄清楚發生了什麼。 – questzen 2012-03-28 14:01:35

回答

3

在java中沒有指針的「不可能」。它具有與原始類型無關的引用,如char

所以,在Java中,我們通常使用方法,而不是通過返回像C程序員指針返回值的價值做:

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

但是這段代碼是一個非常大的項目的一部分,我寫了大約10000行Java代碼。我只需要編寫這個函數來使我的代碼工作。 – 2012-03-28 13:54:26

+0

-1,用於提供與解決問題完全無關的建議。 – josefx 2012-03-28 14:28:21

+0

+1,因爲沒有嘗試在Java中編寫C語言。 – 2012-03-28 14:45:04

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程序員,我當然可以識別您的困境。

要解決您的問題,我寧願嘗試訪問您的2D數據一維Java bytearray。

這將使它瑣碎訪問(行*列)字節,你就饒了此包裝代碼的需求(這將是一個循環非常昂貴)。

無論你是從Java還是從C分配數組取決於你的項目,但JNI調用使得這兩種解決方案成爲可能。

祝你好運!