C++(Arduino)将指针地址变量传递给函数

ut6juiuv  于 2023-02-14  发布在  其他
关注(0)|答案(2)|浏览(193)

莫因莫因
我想把一个变量指针地址传递给一个函数来获取缓冲区中变量的字节--参见代码片段!这个版本的代码可以工作......但是我想在函数调用之前跳过额外的地址定义。
非常感谢!

float f = 133.2342;
int x = 12345;
byte buffer[8] = {0,0,0,0,0,0,0,0};

void var_to_byte(const int anz, int* var_split, int* buffer)
{
  for (int i=0;i<8;i++) buffer[i]=0;
  for (int i=0;i<anz;i++)
  {
    buffer[i]=var_split[i];
  }
}

void setup() 
{
  Serial.begin(115200);
  
// I like to skip these lines
  int z = &f;
  int y = &buffer;
// call the function with var_to_byte(sizeof(f),&f,&buffer); is not working

  var_to_byte ( sizeof(f),z,y); // this works !!!!
  Serial.print("Buffer: ");
  for (int i=0;i<8;i++)
  {
    if (buffer[i]<0x10)
    {
      Serial.print("0");
    }
    Serial.print(buffer[i],HEX);
  }
  Serial.println();
}

void loop() {
  // put your main code here, to run repeatedly:

}

我不知道如何解决这个问题...是的,我是新的C++和/或Arduino ...

monwx1rj

monwx1rj1#

它无法工作,因为类型根本不匹配。
您可以将一个值序列化到现有的缓冲区中,如下所示:

// if out is too small, this will blow up (undefined behaviour)
inline void serialise(float const f, std::byte* out) {
  auto const* raw = reinterpret_cast<std::byte const*>(&f);
  std::copy(raw, raw+sizeof(float), out);
}

但您也可以避免传入缓冲区:(如果您想避免std::array,请参见下文)

#include <array>
inline auto serialise(float const f) {
  std::array<std::byte, sizeof(f)> out;
  auto const* raw = reinterpret_cast<std::byte const*>(&f);
  std::copy(raw, raw+sizeof(f), out.begin());
  return out; // copy elided by all sensible compilers
}

// usage
int main() {
  float const f = 3.14f;
  auto const ser = serialise(f);
  // do stuff with ser
  for (auto const x: ser) {
    if (x<0x10)
      Serial.print("0");
    Serial.print(x,HEX);
  }
  Serial.println();
}

当然,您可以将serialise泛化为任何类型:

template <typename T>
inline auto serialise(T const& t) {
  // pretty much the same code only with T instead of float
}

编辑:
如果你必须避免使用标准库,你也可以传递一个调整大小的raw-array引用:

auto serialise(float const f, std::byte (&out)[sizeof(float)]) {
  auto const* raw = reinterpret_cast<std::byte const*>(&f);
  std::copy(raw, raw+sizeof(f), out);
  return out; // copy elided by all sensible compilers
}
3pvhb19x

3pvhb19x2#

代码中的类型没有意义。如果你想填充一个字节缓冲区,那么为什么你的函数说int* buffer?那是int的缓冲区,而不是byte
简单的方法是使用标准库函数memcpy来复制字节,不需要使用自己的函数来完成这个标准任务。

memcpy(buffer, &f, sizeof f); // copy the bytes of f to buffer

memcpy在头文件<string.h>中声明

相关问题