1

Javaコード:

public static final byte cw_bArray = 0x01;
public static final byte cw_string = 0x02;

byte[] arr1=new byte[]{0x01};
byte[] arr2=new byte[]{0x02};
byte[] arr3=new byte[]{0x03};
byte[] code_ward_arr=new byte[]{cw_bArray,cw_string,cw_bArray};

method:
mount(null,new Object[]{arr1,arr2,arr3}, code_ward_arr); 

このコードをsymbianc/c++に変換しようとしています。私はこれをやりましたが、誰かがこれを手伝ってくれるという議論を渡す方法がわかりません。

static const signed char cw_bArray = 0x01;
static const signed char cw_string = 0x02;

signed char a1 = {0x01};
signed char a2 = {0x02}; 
signed char a3 = {0x03}; 

signed char code_ward_arr[]  = {cw_bArray,cw_bArray,cw_bArray};
//signed char bbb[]  = {a1,a2,a3};  
   char *bb=new char[2];
    bb[0] = a1;
    bb[1] = a2;
    bb[2] = a3;

mount(NULL, bb[] , code_ward_arr);

方法:

LOCAL_C void mount(signed char initData, char* obj[], signed char codeWord)
    {

    }

私はコードのこの部分をcjavaコードに変換しようとしています:

Object obj[] = null;
if(codeWord==null){
            obj = new Object[10];//Initial Loading Capacity
        }else{
            obj = new Object[codeWord.length];
        }

Cコード:

char* obj[] = {NULL};

 if(codeWord==NULL)
 {
 obj = new char[10];
 } 
 else 
 {
 obj = new char[Cwlen];
 }

このエラーが発生します不正なオペランド'char* [1]' ='char *'

4

3 に答える 3

0

これはうまくいくはずです

char a1[]={0x01};
char a2[]={0x01};
char a3[]={0x01};

char *  bb [3];
bb[0] = a1;
bb[1] = a2;
bb[2] = a3;


mount(NULL, bb , code_ward_arr);
于 2012-05-23T04:53:00.593 に答える
0

間違っていると宣言a1している行:a3

signed char a1 = {0x01};

この行は、単一の文字(バイト)を宣言してから、それに配列を割り当てます。変数を配列またはポインターとして宣言します。

// As array (my recommendation)
signed char a1[] = { 0x01 };

// As pointer
signed char *a1 = { 0x01 };

bbまた、 :の宣言を変更する必要があります。

char *bb[] = { a1, a2, a3 };

I C ++配列はポインターに減衰するため、ポインターを配列に割り当てることはできますが、その逆はできません。

mount次に、角かっこなしで呼び出します。

mount(NULL, bb, code_ward_arr);
于 2012-05-23T05:32:20.800 に答える
0

ここでの最大の問題mountは、渡される配列のサイズがわからないことです。Javaの配列には、C / C ++配列にはない追加のメタデータが含まれているため、これはJavaにとって問題ではありません(ここでは長さが有用です)。

これにはわずかな例外があります。C / C ++配列(ポインターではない)のサイズはコンパイル時に使用できますが、宣言されたスコープ内でのみ使用できます。ある配列が別のメソッドへのポインタとして渡されると、配列のサイズが失われます。

この問題を回避するには、その追加の長さのデータを提供する必要があります。おそらく最も単純ですが、最もかさばる解決策は、データをベクトルに配置することです。これは、特に効率上の理由からC / C ++に変換する場合は、重すぎる可能性があります。

例:

vector<signed char> a1(1, 0x01); // create vector of size 1 with all elements 0x01
vector<signed char> a2(1, 0x02); 
vector<signed char> a3(1, 0x03); 

vector<signed char> code_ward_arr(3, cw_bArray);

vector<vector<signed char> > bb(3);
bb[0] = a1;
bb[1] = a2;
bb[2] = a3;

mount(NULL, bb , code_ward_arr);

方法:

LOCAL_C void mount(signed char initData, vector<vector<signed char> >& obj,
        vector<signed char>& codeWord);

軽量のソリューションは、データへのポインターとそのデータの長さを保持する構造体を作成するか、配列の長さを保持するためにマウントするパラメーターを追加することです。配列の配列がある場合、これは複雑で厄介になるので、構造体ソリューションに固執しましょう

例えば。

template<typename T>
typedef struct array {
    size_t length;
    T* data;
} array;

LOCAL_C void mount(signed char initData, array<array<signed char> >& obj,
        array<signed char>& codeWord);

array<signed char> a1;
signed char a1_data[] = {0x01};
a1.length = sizeof(a1_data) / sizeof(signed char);
a1.data = a1_data;

...

array<signed char> bb_data[] = {a1, a2, a3};
array<array<signed char> > bb;
bb.length = sizeof(bb_data) / sizeof(array<signed char>);
bb.data = bb_data;

mount(NULL, bb, code_ward_arr);

ただし、配列構造体内のポインターは、それらが作成されたメソッドの期間中のみ有効であるため、注意する必要があります(実際の配列([])がグローバルであるか、ヒープ上に作成されている場合を除く)。

于 2012-05-23T06:20:50.060 に答える