This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
大家好、当我将选项传递给 sprintf 时、我遇到了问题。
例如、如果我要打印具有6个字符的浮点值、我将执行该操作
sprintf (mystring、"%06f"、myfloat);
如果我的 myfloat = 0、结果将是 mystring ="0.000000"一个8字符的字符串。
您好 Davide、
包含 sprintf 函数的库并不总是支持使用 sprintf 等函数进行浮点打印。 您首先需要查看您的 sprintf 函数是否甚至支持您尝试执行的操作。
上星期出现了打印浮点值的主题、我在这篇文章中用不同的方法为一位用户介绍了这一主题、您可能会发现它对 您有所帮助:https://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/p/663530/2438264#2438264
另外、在另一篇文章中、用户通过增大堆栈大小来解决了 sprintf (确实支持浮点)问题: https://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/t/199796
除了拉尔夫非常好的建议之外:
1.如果您的编译器工具链中有可用的,请考虑使用 snprintf()而不是 sprintf()。 使用 snprintf()时,必须提供缓冲区的大小。 因为 snprintf()函数“知道”缓冲区的大小,所以它不会溢出缓冲区,因此生成的字符串将始终为空端接。 在最坏的情况下,生成的字符串被截断以适合缓冲区,您可以通过检查 snprintf()的返回值来检测此情况。 对于不"知道"缓冲区大小的较旧 sprintf(),可能会使该缓冲区过度运行并破坏程序正在使用的其他内存。 snprintf()函数可用于最合理的现代编译器。
2.我不确定您需要的输出字符串是什么,但您需要的格式字符串可能是"%0.6f"(请注意小数点)。 这会将结果格式化为6个小数位。
使用 snprintf()的示例:
char mystring[20]; float myfloat = 1.2f; snprintf (mystring、sizeof (mystring)、"%0.6f"、myfloat);
mystring 现在应包含"1.200000"
请注意,如果将字符串缓冲区传递给自己的函数之一,然后将其传递给 snprintf(),则还需要将大小传递给自己的函数:
void myfunction (char * resultString、size_t sizeOfResultString、float floatValue) { snprintf (resultString、sizeOfResultString、"%0.6f"、floatValue); }
请勿犯此错误:
void myfunction (char * resultString、float floatValue) { snprintf (resultString、sizeof (resultString)、"%0.6f"、floatValue);//<--错误! }
(这里的错误是您会将指针的大小传递给 resultString,而不是 resultString 指向的缓冲区的大小。)
感谢您的回复、今天我不是在从事这个项目、但我会尽快通知您。
感谢您的消息、回答您的问题、我已经尝试了 snprintf 函数、但我得到了相同的结果、因此我用它来截断转换
char mystring[6 + 1];//+ 1表示终止 ASCII 空字符 float myfloat = 123.456789; snprintf (mystring、sizeof (mystring)、"%06f"、myfloat);
字符串实际上将以6个字符截断、因此 mystring 将包含"123.45\0"、因为我需要6个字符的长度字符串、而不是6个十进制字符。
我还尝试使用指针字符变量并使用 malloc 获取维度、但我不知道使用微控制器是否可行、我通常会开发 Windows 软件而不是微型软件。
您好 Davide、
[引用 user="Davide Vittorio Gozzini"]我还尝试使用指针字符变量并使用 malloc 获取维度,但我不知道使用微控制器是否可能实现
从光谱的另一端(对 Windows 软件的了解较少)来看、我不确定我是否完全可以掌握您尝试的内容、但总的来说、只要定义了类型(聊天、int、float、uint8_t 等)、带有指针的那一部分就应该可以了、 malloc 可用、前提是 MCU 被编程为保留一些 RAM 作为此类操作的"堆"存储器。 我不确定"获取维度"是什么意思、因此无法根据我当前的理解水平对其进行评论。
实际上、我知道我的值将从-10.00到10.000、因此6个字符+终止\0、所以我将仅截断最后一个十进制数。
现在我遇到了这个问题"mkhex4bin 故障发生了。 放弃。"
如此处所述
在回答 Warren Woolsey 时: 我最终完全卸载并重新安装了 CCS、这似乎解决了这个问题。 CCS v6.1.1.00022 Hercules TMS570LC43xx 和 MSP430F2619 TV 5.2.6
我还进行了重新安装和重新引导。
对于 sprintf、我已经解决了堆栈大小的问题、另一个使用 snprintf 截断的问题、如所述。
从这个线程中、我了解到、对于与 Windows 不同的微控制器、我不能为变量使用过大的数组。
我想现在已经全部完成了、可以关闭线程。
感谢大家的支持