【问题标题】:Converting float32 to char[255] using Ansys Scade Suite使用 Ansys Scade Suite 将 float32 转换为 char[255]
【发布时间】:2021-08-03 19:47:07
【问题描述】:

我正在尝试在 Ansys Scade Suite 中将 float32 转换为 char[255]。我在这里使用了一个自定义函数,它接受一个 float32 输入并输出一个 255 的 char 数组。它可以在下面看到。

#include <stdlib.h>
#include "kcg_types.h"

kcg_char OP_StringToFloat(
    /* string/ */  const kcg_float *d
 )
{

kcg_char a[255];
sprintf(a, "%f", d);
return a;
}

kcg_char 是一个字符。

由于某种原因,自定义函数使程序崩溃,留下无法追踪的系统错误 (SYSERR)。任何使用 Scade Suite 的人都可以帮助我吗?这是基于模型的编程顺便说一句。这是连接的外观。 Model

【问题讨论】:

  • 你不能从函数中返回一个本地数组,因为它将不再存在。您必须将缓冲区传递给函数,或者为一个缓冲区分配内存。请参阅Function returning address of local variable error in C
  • 另外,你的函数接收一个指向浮点类型的参数,然后你将指向浮点的指针传递给 sprintf() 但 sprintf() 想要一个浮点,而不是指向-浮动。
  • 编译器不会发出一些警告吗? sprintf 的参数不匹配或本地对象的返回地址?可以提高警告级别吗?
  • @kkrambo 那么将其设为引用会更好,还是有办法将其作为类型指针在 sprintf 中浮动?
  • 取消引用指针是sprintf(..., *d)。但是您的主要问题是返回不再存在的堆栈变量的地址,并且返回类型是单个字符而不是字符串。返回类型应为kcg_char *。如何处理a 不是很清楚。 (参见第一条评论中的链接)如果调用者立即复制结果字符串,您也可以将a 声明为static 作为快速而可怕的修复方法。

标签: c++ c embedded ansys


【解决方案1】:

您的数据类型和指针到处都是 - 您正试图返回对临时本地缓冲区的引用。建议惯用语:

kcg_char* OP_StringToFloat( const kcg_float d, kcg_char* buffer )
{
    srintf(buffer, "%f", d ) ;
    return buffer;
}

调用示例:

kcg_char a[255] ;
kcg_float d = 3.125 ;
OP_StringToFloat( d, a ) ;

您可以使用返回值以便将调用用作参数,例如:

printf( "%s\n", OP_StringToFloat( d, a ) ) ;

请注意,只有当kcg_floatfloatdouble 的别名时,sprintf() 调用才有效。

【讨论】:

  • 刚刚意识到我的意思是将函数 float 命名为字符串。像这样的东西会起作用吗? kcg_char* OP_StringToFloat( const kcg_float32 d ) { kcg_char* a = (char*)malloc(255 * sizeof(char)); snprintf(a, sizeof(a),"%f", d); return a; }
  • @JustinYoung :发布一个新问题;代码在 cmets 中不能很好地工作。虽然它有效,但这是一个非常糟糕的主意。用户必须知道该函数具有隐藏的内存分配,然后负责释放它。例如,如果您稍后将函数更改为使用静态函数,则任何释放它的尝试都会导致未定义的行为。还有sizeof(char) == 1的定义——这是没有意义的,无论如何你最好使用sizeof(*a),因为1)a不是char,2)这样你就可以改变@987654332的类型@ 没有引入错误。
  • @JustinYoung ...但无论如何它都是学术性的,因为你真的不想这样做——这太恶心了。
猜你喜欢
  • 1970-01-01
  • 2023-03-11
  • 2013-12-14
  • 2019-07-09
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
相关资源
最近更新 更多