2012-03-28 5 views
1

Java에서 Object의 주소에 안전하게 액세스 할 수 없다는 것을 알고 있으며 절대로 이와 같은 작업을해서는 안됩니다. 하지만이 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; 
} 

내가 short outc[]short outp[]unsigned char* outcunsigned short* outp를 변환 한 자바로 변환하기. 그렇다면 부분적으로 값을 할당 할 수 있습니다. 하지만 내가 직면하고있는 문제는이 함수가 다른 함수에 의해 루프에서 호출 될 때마다 너비가 증가하고 매번 1 바이트 만 특정 셀에 할당된다는 것입니다.

이 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

+0

@questzen 미안하지만 어떻게 해야할지 이해하지 못했습니다 .. –

+0

한 단어 '가독성'. 다음 사람은 무슨 일이 일어나고 있는지 파악하기 위해 동일한 장애물을 거쳐야 할 것입니다. – questzen

답변

3

포인터가없는 java에서는 "가능"하지 않습니다. 여기에는 char과 같은 원시 유형과 관련이없는 참조가 있습니다.

그래서, 자바에서 우리는 일반적으로 C 프로그래머와 같은 포인터를 통해 값을 반환하는 대신 값을 반환하는 방법을 사용하여 수행

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

그러나이 코드는 매우 큰 프로젝트의 일부로, Java 코드의 약 10000 줄을 작성했습니다. 이 코드를 작성하려면이 함수를 작성하면된다. –

+0

-1, 문제 해결과 완전히 관련이없는 조언을 제공합니다. – josefx

+0

+1, Java에서 C를 쓰지 않으려 고합니다. –

0

난 당신의 코드가 무엇을해야하는지 모르겠어요. 내게 그것은 단지 주어진 값으로 짧은 바이트의 낮은 바이트를 설정하고 귀하의 자바 코드의 변화가 자리를 비틀 것으로 보인다. 당신 때문에 짧은 [] 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 데이터에 액세스하려고합니다.

이렇게하면 (행 * col) 바이트에 액세스하는 것이 쉬울 것이므로이 래퍼 코드가 필요하지 않게됩니다 (루프에서 비용이 많이 듭니다).

Java 또는 C에서 배열을 할당할지는 프로젝트에 따라 다르지만 JNI 호출은 두 가지 솔루션을 모두 가능하게 만듭니다.

행운을 빈다.