C ++没有已知的转换来自' int *' to' uint16_t * {a ka short unsigned int *}'

时间:2017-08-13 15:37:45

标签: c++ arduino stm32

我试图在STM32上运行为Arduino设计的磁力计代码。在编译Arduino时,我没有错误,从传感器读取的值也被签名。在为STM编译时,我得到错误:"没有来自' int *'的参数1的已知转换。 to' uint16_t * {aka short unsigned int *}'"。

这很有道理,但从哪里开始?

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

图书馆:https://github.com/mechasolution/Mecha_QMC5883

3 个答案:

答案 0 :(得分:0)

您可以使用C样式转换强制转换,如果编译器对此进行了呻吟,则转换为void *然后转换为所需的类型,这将关闭它。但这些抱怨很可能是合理的。 int和uint16_t可能没有相同的宽度,所以你期望通过以这种方式弄乱指针来实现什么?

答案 1 :(得分:0)

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

当您指示指针时,任何对dereferanced的指令只会写入2个字节而原始类型为4个字节。所以2个字节不受影响。

示例

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

int val = 0x0feeddcc;

foo((uint16_t *)&val);

结果将是0x0fee1122而不是0x00001122; - 如果你用隐式演员强迫它。但它是一个UB

在代码中将int更改为short以使它们具有相同的大小。

另一个解决方案 - 保留int和unsigned not changed只重写方法;

#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;
}

答案 2 :(得分:0)

问题不在于如何转换,而是为什么。图书馆需要uint16_t*。所以你不应该创建int[N]。而是像库所期望的那样创建一个uint16_t[N]