返回一个字节数组或将数组传递给一个函数

时间:2016-06-14 11:38:51

标签: c++ arrays c++11

我想要完成的是在函数中返回一个字节数组,以便我可以这样做:

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

 }

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

2 个答案:

答案 0 :(得分:2)

  

byte array [8] = function();

你不能直接使用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();

答案 1 :(得分:1)

如果您可以将function转换为:

,则可以通过引用传递数组
template<int N>
void function(byte (&array)[N]) {

}

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

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

}

您无法返回原始数组,因为C风格的原始数组不可复制。