我在解决TinyGPS ++中的lat和long Cords到Double或者字符串时遇到问题。我正在使用的代码是:
String latt = ((gps.location.lat(),6));
String lngg = ((gps.location.lng(),6));
Serial.println(latt);
Serial.println(lngg);
我得到的输出是:
0.06
有人知道我做错了什么吗?它与舍入有关吗? Arduino中的(Math.Round)函数。
谢谢!
答案 0 :(得分:1)
有两个问题:
String latt = ((gps.location.lat(),6));
我得到的错误是
Wouter.ino:4: warning: left-hand operand of comma has no effect
Wouter:4: error: invalid conversion from 'int' to 'const char*'
Wouter:4: error: initializing argument 1 of 'String::String(const char*)'
String类的定义中没有任何内容允许此语句。我无法重现0.06
(在您的问题中)或0.006
(在稍后的评论中)的打印值。请编辑您的帖子以获得编译,运行和打印这些值的确切代码。
有两个地方可以使用逗号:将参数与函数调用分开,并分隔多个表达式,这些表达式计算到最后一个表达式。
你不是在这里调用一个函数,所以它是后者使用的。那是什么意思?这是一个例子:
int x = (1+y, 2*y, 3+(int)sin(y), 4);
变量x
将被赋予 last 表达式4
的值。实际上,没有人会以这种方式实际使用逗号运算符。写作更容易理解:
int x;
1+y; // Just a calculation, result never used
2*y; // Just a calculation, result never used
3 + (int) sin(y); // Just a calculation, result never used
x = 4; // A (trivial) calculation, result stored in 'x'
编译器通常会优化前3个语句,并仅生成最后一个 1 的代码。我经常在#define
宏中看到试图避免多个语句的逗号运算符。
对于您的代码,编译器会看到这个
((gps.location.lat(),6))
并将其评估为对gps.location.lat()
的调用,该调用返回double
值。编译器抛弃了这个值,甚至警告你它“没有效果。”
接下来,它会看到6
,这是此表达式的实际值。括号将弹出,将6
值分配给语句的左侧String latt =
。
如果您查看String
的声明,则不会定义如何使用6
之类的int并构建新的String
,或者为其分配6
。编译器看到String
可以<{1}}构建,因此它会告诉您它无法将数字const char *
转换为6
const char *
double latt = gps.location.lat();
double lngg = gps.location.lon();
Serial.println( latt, 6 );
Serial.println( lngg, 6 );
旨在作为6
的参数。这些参数用逗号正确分隔。
作为进一步的奖励,它不使用Serial.println
类,这无疑会引起后来的麻烦。真的,不要使用String
。相反,请保留数字值,例如String
和int
s,并在最后一刻将其转换为文本(例如,使用float
)。
我经常希望编译器可以完成我的意思,而不是我所说的。 :d
<小时/> 1 根据println
的类型,评估表达式y
可能会产生无法优化的副作用。流式算子2*y
是数学运算符(左移)的一个很好的例子,其副作用无法优化。
在您的代码中,调用<<
可能修改了gps.location.lat()
或gps
类内部的内容,因此编译器可能没有优化函数调用。
在所有情况下,都不会分配调用的结果,因为只有最后一个表达式值(6)用于赋值。