我知道我们无法在Java中安全地访问对象的地址,我们绝不应该尝试这样做。但我需要将此C代码转换为Java。值始终为8 bits
大小。 C代码是这样的:
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* outp
转换为short outp[]
并将unsigned char* outc
转换为short 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;
}
}
我该怎么办?请帮忙。感谢。
答案 0 :(得分:3)
java中没有指针的“可能”。它的引用与char
等原始类型无关。
所以,在java中我们通常使用返回值的方法,而不是像C程序员那样通过指针返回值:
char merge(int value,int x,int y, int width) {
char outchar;
/// your code...
return outchar;
}
答案 1 :(得分:0)
我不知道你的代码应该做什么。对我而言,它看起来只是将short的低位字节设置为给定值,并且java代码中的移位似乎不合适。由于你因某种原因用int []替换了short [],我不知道以下内容是否有用:
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;
}
答案 2 :(得分:0)
您的C代码看起来像指针算术,用于在网格中的特定位置查找单元格的地址,然后在该位置设置值。
对于您的Java代码,我建议采用完全不同的方法。 您的调用代码用于网格的数据结构是什么? 您可以使用对网格进行建模的类,并包含setValue(x,y)方法。该类如何在内部对网格进行建模取决于您 - 它可以使用二维数组。
答案 3 :(得分:0)
作为一名试图将Java用于项目的C程序员,我当然可以认同您的困境。
要解决您的问题,我宁愿尝试以1D Java字节数形式访问您的2D数据。
这将使访问(row * col)字节变得微不足道,您将无需使用此包装代码(在循环中代价非常高)。
您是从Java还是从C分配数组取决于您的项目,但JNI调用使两种解决方案成为可能。
祝你好运!