这似乎是一个基本问题,但我无法在任何地方找到答案。
我知道C / C ++没有byte
数据类型。
我知道sizeof(char) == 1
。
我正在尝试在我的Android应用程序中传输12个传输,每个传输96个字节在Pebble上。
由于传输大小的限制,我一次只发送一个。每一个都应该“附加”到最后一个,因为它们应该最终在内存中形成顺序空间,作为图像读取(每像素一位)。
我正在尝试做这样的事情:
int transNum = 0;
uint8_t image[][] = new uint8t[12][12] //not sure about uint8_t, and I've forgotten how to do 'new' in C, I have to create just a pointer, and then malloc?
receivedHandler(DictionaryIterator *iter, void *context){
Tuple *receivedImage = dict_find(iter, KEY_IMG);
for (int i = 0; i < 12; i++) {
image[transNum][i] = receivedImage->value[i]->uint8_t;
}
transNum += 1; //this is in an implicit loop, since once done Pebble ACKs the transmission, and receivedHandler is called again by the next transmission
}
我是否远程关闭?
答案 0 :(得分:5)
你可以分配12 * 96字节的连续内存,有12行&amp; 96列
char* image = (char*)malloc(sizeof(char)*12*96);
另外,全局数组也可以正常使用
char image[12][96];
根据我的理解,您正在逐行接收数据,即一次96字节:
char rcvd_data[96]={0};
并像这样访问/设置::
for(row=0;row<12;row++) //to point to the row (0-11 rows)
{
rcvd_data= recv_function(); //whatever your recv function is
for(col=0;col<96;col++) //to point to the col in that row (0-95 col)
{
*(image + row*96 + col)= rcvd_data[col]//whatever value you want to assign
}
}
并一次性传输所有96个字节:
for(row=0;row<12;row++) //to point to the row (0-11 rows)
{
rcvd_data= recv_function(); //whatever your recv function is
memcopy((image + row*96), rcvd_data, 96);
}
答案 1 :(得分:1)
分配您描述的阵列的最简单的解决方案是:
uint8_t image[12][96];
然而,根据你的描述“每一个都应该'追加'到最后一个,因为它们应该最终在内存中形成顺序空间”,这表明你真的想要:
uint8_t image[12 * 96];
然后你将把你的12次传输顺序写入该数组。
您写的这段代码:
for (int i = 0; i < 12; i++) {
image[byteNum][i] = receivedImage->value[i]->uint8_t;
}
不正确,uint8_t
是数据类型,而不是字段名称。
此外,您可能希望使用image[i]
而不是image[byteNum][i]
执行某些操作,但我不能更明确地知道TupleType
是什么以及您期望的是多少在每个Tuple
找到。
答案 2 :(得分:1)
我要添加的一件事是小心使用char
。处理纯字节数据时,请使用unsigned char
,signed char
或uint8_t
之类的内容。虽然char是一个字节,但由于它的使用,我看到了数据丢失。
答案 3 :(得分:0)
我认为你需要两次malloc。
char** image = (char**)malloc(sizeof(char*)*12);
int i = 0;
for(; i < 12; ++i){
image[i] = (char*)malloc(sizeof(char)*12);
}
然后,您可以将图像视为二维数组。