2016-11-03 81 views
-3

平台:ESP8266和Arduino的功能uint16_t VAR打印到4位将无法正常工作

我在4个字符地方试图输出uint16_t。激光(VL53L0X)正从2至4号的地方读书。(永远不会超过4个地方,MAX 8190出)

Serial.print(mmLaser); 

作品,但不能格式化4个地方。
如果我调用该函数,我得到一个错误

**ERROR:** invalid conversion from 'char' to 'char*' [-fpermissive] 

,如果我没有编译调用该函数:没有错误

我在做什么错?

声明瓦尔

char c_temp; 
uint16_t mmLaser = 0; // hold laser reading 

函数调用

uint16_2_char(mmLaser, c_temp); 
Serial.print(c_temp); 

功能

// Convert uint16_t to char* 
// param 1 n - uint16_t Number 
// param 2 c - char to return char value to 
// 
void uint16_2_char(uint16_t n, char* c){ 
    sprintf(c, "%04d", (int) n); 
} 
+0

什么是你的编译器有说关于传递一个'char'函数期待'char *'? – EOF

+1

'char c_temp;' - >'char c_temp [100];'猜猜我不信任_never_中“永远不会超过4个地方”。更好地将缓冲区大小设置为int所产生的最大值。 – chux

+0

我发现自己很奇怪,我在指出unsigned int *没有小数位*。这并不意味着这是一个奇怪的问题拼图。请阅读[问]。把它放在心上。提供一个[mcve] – Tibrogargan

回答

0

代码需要的字符数组

//  Pointer to a character -----v        
void uint16_2_char(uint16_t n, char* c){ 
    sprintf(c, "%04d", (int) n); 
} 

问题代码

//  This is one character 
char c_temp; 

uint16_t mmLaser = 0; // hold laser reading 

// **ERROR:** invalid conversion from 'char' to 'char*' 
// Does not make sense to pass a character when an address is needed 
// Need to pass the initial _address_ as an array of characters instead. 
//       v 
uint16_2_char(mmLaser, c_temp); 

更好的代码

#define INT_BUF_SIZE 24 
char buffer[INT_BUF_SIZE]; 

// When an array is passed to a function, 
// it is converted to the address of the 1st character of the array. 
// The function receives &buffer[0] 
uint16_2_char(mmLaser, buffer); 

更妙的是,通过一个地址和可用大小

void uint16_2_char(uint16_t n, char* c, size_t sz){ 
    unsigned u = n; 
    // I'd expect using unsigned types. (use `%u`) 
    // snprintf() will not not overfill the buffer 
    snprintf(c, sz, "%04u", u); 
} 

char buffer2[INT_BUF_SIZE]; 
uint16_2_char2(mmLaser, buffer, sizeof buffer);