C++ 没有已知的从 'int*' 到 'uint16_t* {a ka short unsigned int*}' 的转换

用户2634449

我正在尝试在 STM32 上运行专为 Arduino 设计的磁力计代码。为 Arduino 编译时,我没有收到任何错误,并且从传感器读取的值已签名。为 STM 编译时出现错误:“参数 1 没有已知的从 'int*' 到 'uint16_t* {aka short unsigned int*}' 的转换”。

这是完全有道理的,但从哪里开始呢?

目标是获得与常规 Arduino 板相同的结果。

库:https : //github.com/mechasolution/Mecha_QMC5883

0______

这是因为 stm32 上的 int 是 32 位,而 AVR 上的 int 是 16 位长。当您将指向 int 的指针传递给采用指向 uint16_t 的指针的函数时,无法进行转换。为什么?

当您取消引用指针时,对取消引用的任何分配只写入 2 个字节,原始类型为 4 个字节。所以2个字节不受影响。

例子

void foo(uint16_t *ptr) {
    *ptr = 0x1122
}

int val = 0x0feeddcc;

foo((uint16_t *)&val);

结果将是 0x0fee1122 而不是 0x00001122;- 如果你用隐式强制转换来强制它。但它是一个UB

将代码中的 int 更改为 short 以使其大小相同。

另一个解决方案 - 保持 int 和 unsigned 不变,只需重写方法;

#define PACKED __attribute__((__packed__))

void MechaQMC5883::read(int* x,int* y,int* z){
    PACKED union {
        short     xs;
        uint8_t   xu[2];
    }xunion;
  Wire.beginTransmission(address);
  Wire.write(0x00);
  Wire.endTransmission();
  Wire.requestFrom(address, 6);
  xunion.xu[0] = Wire.read(); 
  xunion.xu[1] = Wire.read(); 
  *x = (int)xunion.xs;
  xunion.xu[0] = Wire.read(); 
  xunion.xu[1] = Wire.read(); 
  *y = (int)xunion.xs;
  xunion.xu[0] = Wire.read(); 
  xunion.xu[1] = Wire.read(); 
  *z = (int)xunion.xs;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在64位处理器的情况下,uint16_t和unsigned short int有什么区别?

将int转换为unsigned short Java

如何防止从int到unsigned int的隐式转换?

C ++需要将int类型转换为unsigned int

为什么将unsigned short(乘)无符号short转换为signed int?

C将Short Int转换为Unsigned Short

从'int'类型转换为'short unsigned int'可能会改变其值[-Wconversion]

从std :: size_t *到long unsigned int *的无效转换

将unsigned short *强制转换为unsigned int *

C-“从“ int *”到“ int”的无效转换

如何在C ++中将unsigned int转换为两个unsigned short?

从'std :: __ tuple ... {aka'unsigned int *'}到'uint32_t'{aka'unsigned int'}的C ++转换失去精度

如何在C中将int转换为short int?

int *数组到short *数组的转换

从unsigned_int到size_t的转换有问题

解释类型转换如何在C中从int到short的位级别工作

从int到short可能的有损转换

unsigned short int和unsigned int或unsigned short之间有什么区别?

从int到short的缩小

如何在C中将unsigned char *转换为unsigned int *?

C ++中unsigned int与unsigned short的区别

C ++从int *到int的无效转换

从 int16 到 unsigned int16 的转换可能会溢出

从 unsigned int 到 char 指针的类型转换中的分段错误

C - 从 int* 到 int 的无效转换

缩小从 int 到 unsigned char 的转换

错误 C2397:从“int”到“unsigned int”的转换需要缩小转换

C++:候选函数不可行:第一个参数没有从“Segment [2]”到“int *”的已知转换

将 Java int 转换为 C unsigned int