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.

[参考译文] <stdlib.h> itoa.

Guru**** 2539500 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/841718/stdlib-h-itoa

器件型号:EK-TM4C1294XL

工具/软件:Code Composer Studio

您好!

不确定为什么 C++库 include 在(18.12.2.LTS)中找不到(itoa()) 、但却找到了(atoi()) 、 并且两者都显示在 stdlib.h 文件中。 重建索引不会将其他 链接的项目源路径刷新到   项目树中添加的源文件 mock itoa()。 较旧版本的编译    器不包含(itoa()),因此程序员添加了一个名称(如 iota),但函数似乎无法将整数(0-9)正确转换为 ASCII 字符。 相反 、它是为 mock iota 配置 的、用于查找整数到字符串长度。

标准  库 C++语言调用  与 TI 工具链巧合地工作、这一点似乎很重要。 如何 在没有 mock iota()的情况下通过  #include 使我的项目使用 C++ iota() ?   CCS9.1

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

    C 或 C++标准不要求函数 itoa。  它不随任何 TI 编译器提供。  有一个名为 ltoa (long 到 ASCII)的类似函数。  请注意、ltoa 也不是标准配置。  因此、了解它的唯一方法是搜索 RTS 库源代码。   

    该功能符合标准要求。

    [引用 user="BP101"]这两 个文件都显示在 stdlib.h 文件中

    我只看到了锦鲤

    如果您的程序包含名为 itoa 的函数、则它必须来自标准 RTS 库以外的其他位置。  它的处理方式与任何其他用户定义的函数相同。

    我仍然不理解您的问题。  如何以不同于其他用户定义的函数的方式来处理您的 itoa 实现?

    谢谢、此致、

    乔治

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

    尊敬的 George

    :不随任何 TI 编译器提供

    奇怪的  是、它列在 include{libcxx (stdlib.h)}8.2.5编译器下、在18.12.2.LTS 中似乎甚至不存在。

    我的 C++语言文档中说明 itoa 是 C++语言的一部分、但在 TI 编译器工具链中缺失似乎 是完全错误的!

    似乎 将 CDT 编译 GNU C++预处理器 (iota())移植到 GNU 语言 代码分析中,但 不会! 此外 、继承的库调试、符号等(不明确)也 会在 从 CCS 9.1中的包含路径选项卡中删除它们之后永久返回到项目中。   

    [引用 user="George mock"]有一个名为 ltoa (long 到 ASCII)的类似函数。

    问题 被召回为 (long 到 char)转换语法错误。  我们需要将数组负载(int 到 char)转换为 UART 8位传输。  将 尝试使用 ltoa() ,但 UART 串行输出是8位寄存    器,long to char 似乎会在转换期间导致 array[i](对于循环 i++)定序的编译器积分错误。  

    如何 将  长分配整数中的8位 UART 字符放入其他串行数据流中心的数组[]中,而不使用(itoa())?  

    这种备用 iota_code (TI 提供)字符转换 不会产生正确的整数到 ASCII 字符、 还 会导致 MCU 随机 POR。

    // usprintf()转换会产生错误的十进制值和 MCU 的随机 POR。
    
    usprintf (valout、"%d"、valout);
    
    
    //将 mock iota 重命名为 itod,以便代码分析可以找到 GNU C++ iota()。
    //地球上有什么格式字(base)与 usprintf()或 iota()有任何关系?
    
    // Tiva C 组添加的 ITOA。 我们
    的标准//开发环境中可能没有针对每个工具链的此 C 库函数。
    #define itoad (数字、字符串、base) \
    操作 \
    { \
    usprintf (string、"%d"、number);
    \} \
    while (0)
    

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

    尊敬的乔治:

    再次尝试 ltoa() 并导致兼容性问题,Int32_t MyVariable 进入 long array[20] ,然后 将 ltoa()变为 char。 在 从 Stellaris 应用程序迁移时、Tivaware long 将被重命名为 int32_t 或 uint32_t。 我知道 标识符(短、长、char、int)在 较新的书面应用程序中被弃用、 事后剖析 CCS 编译器 C++ 指令认为 Tivaware 速度不是很快。

    Tivaware 和 CCS 弃用的标识符 并非都位于同一页上。 这些 标识 符都已过时,但 两者都不能同时使用!  大多数情况下、将 uint32_t 转换 为 long 成功 、但转换为 char 似乎 会导致奇怪的问题。 因此 ,一个9位变量不正确地生成 8位整数,但 long to usprintf()转换会使 第9位下降,该怎么办?

    ltoa()不是 TI 硬件可用于将 long 端口转换为8位 UART 串行字符的 ASCII 转换的可用整数!

    串行 UART 数据传输8位1停止、无奇偶校验!

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

    您的帖子缺少我可以处理的特定详细信息。  例如、如果某些编译器 RTS 函数运行不正确、则向我展示足够详细的信息来重现该函数。  我需要了解您对它的称呼、您期望的结果以及您得到的结果。  都有非常具体的细节。

    我不应该建议您使用 ltoa。  由于它不是标准的 RTS 函数、编译器的未来版本可能不会提供它。  此类更改可能会在没有通知的情况下发生。

    考虑使用 sprintf

    考虑编写自己的 itoa 实施方案。  在 ltoa 函数上对其建模。

    谢谢、此致、

    乔治

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

    [引用 user="BP101"]不过,它列在 include {libcxx (stdlib.h)} 8.2.5编译器下

    没有具有该版本号的 TI ARM 编译器。

    [引用 user="BP101" usprintf(valout, "%d", valout);

    函数 usprintf 不随 TI ARM 编译器提供。   

    谢谢、此致、

    乔治

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

    [引用 user="George mock]不过、它列在 include{libcxx (stdlib.h)} 8.2.5编译器下

    没有具有该版本号的 TI ARM 编译器。[/quot]

    WOW 反转的数字 应该已经读出5.2.8并且 printf()正在生成 NULL 输出。   itoa()是非常具体的,并且看起来会将输入字符串中的 uint32_t 高序位移,因此位>7会为 8位 UART 寄存器生成正确的 ASCII 位数。 编译器 必须有一种将整数内联转换为 ASCII 的方法 、8位外设可以与应用程序一起工作!

    为什么 TI 会使编程人员感到如此困难?  将整数转换为8位 ASCII 的方法有很多种、但 C++语言有答案 TI 决定忽略吗?

     

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

    TI ARM 编译器版本5.2.8不提供 itoa 函数。  我不知道 stdlib.h 中的这条行是如何出现的。  因此,我不能解释你对伊托阿的问题

    [引用 user="BP101"] printf ()正在生成 NULL 输出[/引用]

    我不知道您使用 printf。  你是指 sprintf 吗?

    我继续建议您使用 sprintf 或您自己实施 itoa

    谢谢、此致、

    乔治

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

    [引用 user="George mock"]我继续建议您使用 sprintf 或您自己实施 itoa

    TI 需要将 itoa()重新放入  所有编译器版本中 ,否则 TI 串行 UART 外设 不能将变量 Born 整数(十进制数)作为 ASCII 0-9粘贴!   prints()、printf()、sprintf()或任何其他 C++内联函数都无法将整数转换为 ASCII 字符。 每次调用 usprintf()时,至少会生成相同的静态 ASCII 码。

    函数 sprintf 执行与 printf 相同的转换,但
    将输出存储在字符串中:
    
    int sprintf (char *string、char *format、arg i、arg2、...)
    
    sprintf 根据
    之前的格式对 aRGB arg2等中的参数进行格式化、但将结果放在字符串中而不是标准输出上;
    字符串必须足够大、才能接收结果。 

    根据 C++论坛的规定、在转换减去0x30期间、32位整数必须左移进字符数组的低位[]。  所谓的标准 C++(abs、labs、 fabs)似乎都没有正确地将高阶位 15:8移入低位字节7:0。  当 C++处理这种情况时、添加 Thumb 指令以执行整数到 ASCII 转换不应由客户进行编码!

    函数 atoi()是 itoa()的计数 器,编译器中仍然存在-  George 如何解释这一点? 我的想法是 itoa()被心怀不满的 TI 员工意外删除。

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

    3693是 将*char 必须内联转换为 uint32_t 时传递给 ltoa()的所有变量(整数)的结果

    对于 位9:0中变化的值,usprintf()执行与3693相同的转换。

    由于 (const *char) SRAM 填充 存储的字符数组中的索引指针的奇数方法。   

    
    

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

    当*char 转换为 long (uint32_t)时,这是 ltoa()的结果,因为整数值通过许多 while 命令传递到上述函数中。

    在 上面的 for (I)循环中布置数组、并且一些 短的2位变量 正正确转换为 ASCII。 所有 long (uin32_t)变量都无法 生成正确  的3-4位 ASCII 值 、似乎 会在高位向上移动。  

    ltoa ((uint16_t) varin[i]、varout);
    
    //
    HWREG (UART2_base + UART_O_DR)= varout[0];//一
    HWREG (UART2_base + UART_O_DR)= varout[1];// UART2_base
    
    (UART2_DR + UART3_BASE)= varout[UART2_UART2_UARTDR];/UART2_UART2_UART3_FO_DAL[UARTROUT] 

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

    数千个位置不会生成,但 NULL 会取消所有 索引查找。  必须 将两个 uint32_t 变量输出到 文本框中、而不是 将多个浮点小工具输出以生成正确的值。 某些 uint32_t 变量 会在   文本、浮点和数字小工具中生成不正确的值。

    MCU 会在  通过 SysTick 循环时保持随机 BOR、无论内联命令的输入流的速度有多慢    、并且在转换为 ASCII 后某些 uint32_t (long)值不正确。  

    然而,atoi()似乎以反向数组顺序从 UART 串行 RX 数据生成正确的值。 我认为 ltoa()不像  标准 C++库中的那样正常工作。 对 itoa()函数的需求可能有助于使该代码片段在没有随机 BOR 的情况下实际工作。 CCS 调试在 SYSCTRL 复位原因寄存器中不提供 BOR 事件的线索。 如果 ltoa()转换为 REM'd,则随机 BOR 停止。

    static int SpeedValue;
    
    //将 ASCII 数字转换为整数值*/
    SpeedValue = atoi (g_ppcArgv[7]);//一
    SpeedValue = atoi (g_ppcArgv[6]);// tens
    SpeedValue = atoi (g_ppcArgv[5]);// SpeedInts
    
    
    = atoi (g_upth);// SpeedInts&trs = aturets (gts)(g&ts)= atoi (g&ts);// Speedintsg&ts = aturets (g&ts) 

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

    我看不到您在哪里证明编译器提供的 RTS 函数做了任何错误。  如果发生这种情况、请明确说明。  提供有关输入内容、预期结果和结果的精确详细信息。

    谢谢、此致、

    乔治

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

    尊敬的乔治:

    我解决了高速函数循环中的 BOR 问题 ,但 ltoa() 将只通过  两个8位块生成16位输出。 如果我们尝试从 strnlen()指定的第三个数组上下文中再强制8个位,则高位(31:16) 会将其他数组值归零。

    TRIM 变量 (1、2、3)删除  了(0-255)位长测量仪表类型小工具的高位(15:8)。 因此 、在  某些调用中、输入整数长度符合小工具约束条件、将整数转换为8位值 ASCII。  不 能 包含第3个甚至第4个数组、或者即使没有修整长度、也会将进程中的所有数组输出归零。  编译器库中的函数 ltoa()在哪里?   对于  16位整数、ltoa()看起来不错 、但  对于32位长整型值根本不合适、因为在高位(31:16)中始终存在 NULL。 当 TI MCU 从16位寄存器变为32位寄存器时、似乎错过了它!

    静态 uint16_t len;
    /*变量值*/
    静态 char varin[0];// 3 for UART2 array[2]
    * varin = dbyte;
    静态字符 varout[0];// 3对于 UART2数组[2]
    
    ,//循环输入整数输出为字符串*/
    for (i = 0;i <= len - trim;i++)
    {//
    检查可变字符串长度*//len
    = strlen (varin);
    len =(sizeof (varin[0]));
    
    /*将整数转换为字符串*/
    //ltoa ((varin[0]、varout);
    usprintf (varin、"%d"、varout[0]);
    //varout[0]=* varout;
    
    //阻塞检查 FIFO 发送器忙标志*
    / while (HWREG (UART2_base + UART_O_FR)&
    (UART_FR|UART_FR_BUSY)
    {}
    // while (UART2_base + UART0_UART0_UART0_UART0_bits
    )+ UART18_ART0_UART0_UART0=UART0_UART0_DA_FO_BUSY)+ UART18_UART20_UART+UART0_UART0_UART0_UART20_UART0_UART0_UART0_UART+UAR
    
    //NULL 位
    
    ByteCnt = i;
    
    //计数匹配的下一个病例*/
    if (ByteCnt >= len - trim)
    {
    ByteCnt = 0;
    NextCmd=2;
    break;
    }
    

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

    请参阅上面的代码 ltoa()生成 NULL 位(31:14),显然已移入位(15:0)。  因此,如果高序位(31:14) 作为数组从对 ltoa()的调用加载而包含,则它将清空低序位中先前存储的数组数据。 谁 会更明智、除非他们尝试通过一个指针输出高序位(31:14)到 专用 数组中[n]。

    我们 调用函数并将变量传递给 ltoa():

    此 long ltoa()无法生成正确的字符串值整数:
    
    while (!(NexSendCmd ("taco.val="、(uint16_t) g_ulMeasuredSpeed、0、0)); 

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

     对 enerlen()的调用可确保  32位整数的循环传递  长度为(0-255位)。  

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

    ltoa ()高位的问题必须是  两个数组[0] 和数组[1]之间的 C++ Ping Pongs。 奇数部分是  、必须为循环使用2次、才能将两  个8位(uint8_t)字节加载到(uint32_t)变量的16位(uint16_t)转换中。 这是意外的, 与需要4个阵列存储器将 4个小数转换为  移植到 应用程序中的整数值的 itoa()相反。   

    因此、如果没有整数修整、则  会在另一端产生严重影响。