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); 

我正在尝试将此代码转换为 symbian c/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)
    {

    }

我正在尝试将这部分代码转换为 c java 代码:

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

声明错误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 };

我 C++ 数组衰减为指针,因此可以将指针分配给数组,但不能反过来。

然后你打电话mount不带括号:

mount(NULL, bb, code_ward_arr);
于 2012-05-23T05:32:20.800 回答
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

你最大的问题是mount不知道它正在传递的数组的大小。这对 Java 来说不是问题,因为它的数组包含 C/C++ 数组没有的额外元数据(长度在这里是有用的)。

有一点例外。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);

轻量级的解决方案是要么创建一个包含指向数据的指针和该数据的长度的结构,要么简单地添加额外的参数来挂载以保存数组的长度。当你有数组时,这会变得复杂和混乱,所以让我们坚持使用 struct 解决方案

例如。

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 回答