对不起该帖子。我已经研究了这个但是.....仍然没有让这个工作的快乐。这个问题也有两个部分。请忽略代码TWI Reg代码作为其应用程序特定我需要帮助的螺母和螺栓C问题。
所以......为了减少项目的内存使用量,我已经开始为ATMEL328p编写自己的TWI(wire.h lib)。它还没有被放入lib中,因为' 1'我不知道该如何做到这一点......将在稍后进行,并且正在进行的工作不断增加。
我遇到的问题是读取多个字节。
问题1 我有一个函数,我需要返回一个数组
byte *i2cBuff1[16];
void setup () {
i2cBuff1 = i2cReadBytes(mpuAdd, 0x6F, 16);
}
/////////////////////READ BYTES////////////////////
byte* i2cReadBytes(byte i2cAdd, byte i2cReg, byte i2cNumBytes) {
static byte result[i2cNumBytes];
for (byte i = 0; i < i2cNumBytes; i ++) {
result[i] += i2cAdd + i2cReg;
}
return result;
}
我的理解:o)我在函数中声明了静态字节数组,我指向作为返回参数功能。 函数调用请求返回提供的字节数组的指针值。
嗯....它不起作用....我检查了多个网站,我认为这应该有效。我得到的错误信息是:
MPU6050_I2C_rev1:232: error: incompatible types in assignment of 'byte* {aka unsigned char*}' to 'byte* [16] {aka unsigned char* [16]}'
i2cBuff1 = i2cReadBytes(mpuAdd, 0x6F, 16);
问题2 好的,如果上面的代码示例有效。我试图减少我在草图中使用的内存量。即使在函数调用后释放了内存(需要),也可以使用函数中的任何内存,该函数必须保留一定量的“空格”。以某种方式,在调用函数时。理想情况下,我希望避免在主程序中复制的函数中使用静态变量。
有没有人知道重复函数调用的权衡....即用一个位移运算符循环一个函数调用,就像调用函数一次完成一个进程并返回...一个数组?或者,这就是C首先不支持Array返回的重点。
希望这是有道理的,只是想从我得到的一点点中获得最好的效果。
BR 丹尼
答案 0 :(得分:1)
这一行:
byte *i2cBuff1[16];
将i2cBuff1
声明为16个byte*
指针的数组。但i2cReadBytes
不返回指针数组,它返回一个字节数组。声明应该是:
byte *i2cBuff1;
另一个问题是静态数组不能具有动态大小。可变长度数组必须是自动数组,因此每次调用函数时其大小都可以更改。您应该使用malloc()
进行动态分配(我使用calloc()
代替,因为它会自动将内存归零)。
byte* i2cReadBytes(byte i2cAdd, byte i2cReg, byte i2cNumBytes) {
byte *result = calloc(i2cNumBytes, sizeof(byte));
for (byte i = 0; i < i2cNumBytes; i ++) {
result[i] += i2cAdd + i2cReg;
}
return result;
}