0

ライブラリを C++ から Java に変換しようとしています。ポインターに問題があります..

C++ のコードは次のとおりです。

int DECL2 daveSetBit(daveConnection * dc,int area, int DB, int byteAdr, int bitAdr) {
    int a=1;
    return daveWriteBits(dc, area, DB, 8*byteAdr+bitAdr, 1, &a);
} 

daveWriteBits 宣言は次のとおりです。

 daveWriteBits(daveConnection * dc,int area, int DB, int start, int len, void * buffer)

これをJavaに変換するにはどうすればよいですか?ポインター&aを Java 言語に変換する方法がわかりません。

public int SetBits(
        int area,
        int DBnum,
        int byteAdr,
        int bitAdr) {       
    int a=1;        
    return writeBits(area, DBnum, 8*byteAdr+bitAdr, 1, ??? )            
}

アップデート:

JavaでWriteBits関数の一部を追加するのを忘れていました..

public int writeBits(
        int area,
        int DBnum,
        int start,
        int len,
        byte[] buffer) {
        int errorState = 0;
        semaphore.enter();
        PDU p1 = new PDU(msgOut, PDUstartOut);

        p1.prepareWriteRequest();
        p1.addBitVarToWriteRequest(area, DBnum, start, len, buffer);

        errorState = exchange(p1);

        if (errorState == 0) {
            PDU p2 = new PDU(msgIn, PDUstartIn);
            p2.setupReceivedPDU();

            if (p2.mem[p2.param + 0] == PDU.FUNC_WRITE) {
                if (p2.mem[p2.data + 0] == (byte) 0xFF) {
                    if ((Nodave.Debug & Nodave.DEBUG_CONN) != 0)
                        System.out.println("writeBytes: success");
                    semaphore.leave();
                    return 0;
                }
            } else {
                errorState |= 4096;
            }
        }
        semaphore.leave();
        return errorState;
    }
4

4 に答える 4

1

変数は無視されるので、削除します。

ただし、無視されていない場合は、訴訟を起こすことができます

int[] a = { 1 };
writeBits(area, DBnum, 8*byteAdr+bitAdr, 1, a )  ;
// do something with a[0];
于 2012-08-09T14:32:35.887 に答える
0

Javaにはポインタがありません。参照があります:

c ++:

Object *a=new Object();

java:

Object a=new Object();
于 2012-08-09T14:34:14.213 に答える
0

daveWriteBits使い方次第bufferです。単純な整数として扱われ、この呼び出しdaveSetBitの後に の値を使用しない場合は、単に. ポインター/参照はありません。aint

daveSetBitの値が必要な場合a( で潜在的な変更をdaveWriteBits行った後、 an を作成するとInteger役立つ場合があります。

非常に手の込んだポインター処理 (&aアドレスとして扱うなど) が行われている場合は、もう少し設計を行う必要があるかもしれません。

于 2012-08-09T14:34:37.200 に答える
0

C++ と Java のどちらに精通していますか? C++ コードは整数をバイト配列として扱っています。Javaで直接それを行うことはできませんが(私は思います)、これを行うことができます

ByteArrayOutputStream buf = new ByteArrayOutputStream();
new DataOutputStream(buf).write(a);
return writeBits(area, DBnum, 8*byteAdr+bitAdr, 1, buf );

整数をバイト配列に変換し、それを writeBits に渡すことができます。テストされていないコード。

于 2012-08-09T14:35:06.687 に答える