我在一个名为WiServer.h
Arduino 的文件中有以下功能.
GETrequest(uint8* ipAddr, int port, char* hostName, char* URL);
现在的问题是我需要将一个int值(setting1)连接到char*
URL参数,例如下面的内容.
"twittermood.php?status=sendTweet&setting1="+setting1
我收到一个错误:
从const char*到char*的无效转换
我如何解决它?
您已经获得了不错的通用C++建议,但对于8位AVR微控制器上Arduino的特殊情况,我认为您需要特定于平台的建议:
Arduino运行时提供String对象.这些例子可能涵盖了您的问题.
由于Arduino上的RAM空间非常有限,因此通常使用特殊属性将常量字符串放入闪存(本质上是ROM)中,这需要不同的指令来访问.使用GCC构建的AVR代码通常构建在AVR Libc之上,它支持对常量字符串和RAM字符串的混合操作.您必须明确代码并选择正确的操作.这至少需要基本了解C字符串的工作方式以及指针的工作方式.我不确定Arduino字符串会自动提供多少这种聪明才智,但如果没有这种聪明,所有字符串常量最终都会在启动时复制到RAM中,并且会一直占用这些宝贵的字节.
如果RAM空间成为问题,或者您正在使用广泛的字符串操作的AVR应用程序,您需要学习如何使用PGM Space操作的混合(可以在flash中使用只读字符串的字符串函数)和常规C-样式基于RAM的字符串操作.
使用std::string
,而不是C字符串.使用字符串流,而不是尝试将非字符串值连接到字符串:
std::ostringstream oss; oss << "twittermood.php?status=sendTweet&setting1=" << setting1; use(oss.str()); // or use(oss.str().c_str());
如果该API确实需要非const
字符串(假设它甚至不需要字符串的长度,我认为它只是一个错误的API const
),将字符串复制到缓冲区并传递:
const std::string& str = oss.str(); std::vectorbuffer(str.begin(), str.end()); buffer.push_back('\0'); GETrequest(addr, port, &buffer[0], c);
至于你做什么时真正发生的事情:
"twittermood.php?status=sendTweet&setting1="
是右值的类型的char[43]
,其中隐式地转换为 const char*
,一个指向第一个字符.为此你添加一个整数,通过这个形成一个const char*
指向某个或多或少随机内存位置的类型的新指针.我想你尝试通过这个作为char*
你的API函数,其将const
不得不被丢弃.
但是,C++编译器永远不会隐式丢弃const
- 为了您自己的利益.