返回字节数组或将数组传递到函数中

Return an array of bytes OR passing an array into a function

本文关键字:数组 函数 字节 字节数 返回      更新时间:2023-10-16

我试图完成的是在一个函数中返回一个字节数组,以便我可以执行以下操作:

byte array[8] = function();

正在使用我自制的库通过 i2c 总线获取值。这是库:

#ifndef MPULIBRARY_HPP
#define MPULIBRARY_HPP
#include "hwlib.hpp"
namespace mpulibrary{
class mpumanager
{
private:
    hwlib::i2c_bus_bit_banged_scl_sda bus;
    byte startregister[2] = {0x6B, 0};
    byte adress = 0x68;
    byte xregister[8] = {0x3B};
    byte yregister[8] = {0x3D};
    byte zregister[8] = {0x3F};
public:
    mpumanager(hwlib::i2c_bus_bit_banged_scl_sda bus):
        bus(bus)
    {}
    void startup(){
        bus.write(adress, startregister, 2);
    }   
    byte getXaxis(){
        bus.write(adress, xregister, 1);
        bus.read(adress, xregister, 2);
        return xregister[8];
    }
    byte getYaxis(){
        bus.write(adress, yregister, 1);
        bus.read(adress, yregister, 2);
        return yregister[8];
    }
    byte getZaxis(){
        bus.write(adress, zregister, 1);
        bus.read(adress, zregister, 2);
        return zregister[8];
    }
};
};
#endif // MPULIBRARY_HPP

我的其他代码:

 auto manager = mpulibrary::mpumanager(i2c_bus);
 for(;;){
    manager.startup();
    byte ydata[8] = {};
    manager.getYaxis(ydata[8]);

    byte zdata[8] = {0x3F};
    i2c_bus.write(adress, zdata, 1);
    i2c_bus.read(adress, zdata, 2);
    int16_t yaxis = 0;
    int16_t zaxis = 0;
    yaxis = (ydata[0] << 8) + ydata[1];
    zaxis = (zdata[0] << 8) + zdata[1];
    hwlib::cout << "Y: " << yaxis << " Z:" << zaxis << "n";
    hwlib::wait_ms(100);
 }

我希望有人能给我一个答案。提前感谢!

字节数组[8] = 函数();

您不能直接使用 C 数组。
你必须把它包装在一个类中(如std::array<byte, 8>)。

byte xregister[8] = {0x3B};
byte getXaxis(){
    bus.write(adress, xregister, 1);
    bus.read(adress, xregister, 2);
    return xregister[8];
}

您可以返回对数组的引用:

byte xregister[8] = {0x3B};
using byte_array = byte[8]; // typedef to avoid strange syntax in return type
byte_array& getXaxis(){
    bus.write(adress, xregister, 1);
    bus.read(adress, xregister, 2);
    return xregister;
}

并使用它:

auto& xAxis = manager.getXaxis();

如果可以将function数组转换为:

template<int N>
void function(byte (&array)[N]) {
}

或者,如果要将大小限制为(例如,8):

void function(byte (&array)[8]) {
}

无法返回原始数组,因为 C 样式的原始数组不可复制。