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.

[参考译文] CCS/TM4C129XNCZAD:参数的 sprintf 问题

Guru**** 2255940 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/663933/ccs-tm4c129xnczad-sprintf-problem-with-parameters

器件型号:TM4C129XNCZAD

工具/软件: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 作为此类操作的"堆"存储器。 我不确定"获取维度"是什么意思、因此无法根据我当前的理解水平对其进行评论。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    printf()系列函数不会按照您希望的方式截断数字。 当格式化(例如,您希望生成的字符串长度为6个字符)与准确度(例如,您尝试打印长度为7个字符的1000000)之间存在冲突时,printf()函数将以格式化和打印整个数字为代价来提高准确度。 这是因为截断该数字不会给出正确的答案。 如果您尝试打印"1000000"、则会被截断为"100000 "、这是不正确的。 (如果有人欠您1、000、000美元、但他们试图只付10、000美元、您将不会高兴。)

    如果您知道您的数字可以有多大的范围、例如、如果您知道数字将始终为0到999之间、则可以尝试"%.2f"。 这将为0到999之间的三位数字留出足够的空间、加上一个小数点和两个小数位、总共包含六个字符(对于后缀的 NUL、需要至少7个字符的缓冲区)。 因此、它将输出"0.00"到"999.99"范围内的任何内容、但请注意、如果为其提供更大的数字(如1000或更大)或负数、结果将占用6个以上的字符、例如"1000.00"是7个字符;"-999.99"也是7个字符; "-1000.00"是8个字符! 当然、在每种情况下、也总是有尾随的 NUL、因此缓冲区必须至少为9个字符。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    实际上、我知道我的值将从-10.00到10.000、因此6个字符+终止\0、所以我将仅截断最后一个十进制数。

    现在我遇到了这个问题"mkhex4bin 故障发生了。  放弃。"

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我添加了这些信息、Windows 7上具有 CCS 6.2.0.00050的相同软件可以正常工作。
    使用 CCS 7.4.0.00015时、Windows 10出现问题。
    两者都使用编译器 TI v5.2.6
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不确定这是否有助于:

    e2e.ti.com/.../1727718



    processors.wiki.ti.com/.../Tiobj2bin_Failed
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如此处所述

    在回答 Warren Woolsey 时:
    
    我最终完全卸载并重新安装了 CCS、这似乎解决了这个问题。
    
    CCS v6.1.1.00022
    
    Hercules TMS570LC43xx 和 MSP430F2619
    
    TV 5.2.6 

    我还进行了重新安装和重新引导。

    对于 sprintf、我已经解决了堆栈大小的问题、另一个使用 snprintf 截断的问题、如所述。

    从这个线程中、我了解到、对于与 Windows 不同的微控制器、我不能为变量使用过大的数组。

    我想现在已经全部完成了、可以关闭线程。

    感谢大家的支持