C函数返回一个数组

时间:2016-09-07 22:58:50

标签: arduino atmega

对不起该帖子。我已经研究了这个但是.....仍然没有让这个工作的快乐。这个问题也有两个部分。请忽略代码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 丹尼

1 个答案:

答案 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;
}