2012-03-28 157 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调用使得这两种解决方案成为可能。

祝你好运!