【问题标题】:C18 sprintf() gives syntax error [duplicate]C18 sprintf() 给出语法错误 [重复]
【发布时间】:2018-03-05 14:55:56
【问题描述】:

我的行好像有语法错误

FSFILE *file; 

在添加 sprintf() 行之后的以下代码中。代码一直运行,直到我添加了 char 文本、textresult 和 sprintf()。我似乎无法找出它有什么问题。我正在使用 C18 编译器。该代码用于使用 SPI 将数据写入 SD 卡。 char txt[] 是使用温度传感器测量的值,例如:23,5。但我想为此添加更多文本。目标是每 5 分钟在 SD 卡上存储一次测量值,以及时间戳或其他内容。我正在使用 PIC18f27j53。

void writeFile()
{
    unsigned char txt[]={ftc(result,0),ftc(result,1),0x2C,ftc(result,3)};
    unsigned char text[]= "hello";  
    unsigned char textresult[];   
    sprintf(textresult, "%c%c", txt, text); 
    //unsigned char size = sizeof(result)-1;
    FSFILE *file;
    file = FSfopenpgm("DATA.TXT", "w");
    if(file == NULL)while(1);
    if(FSfwrite((void *) txt, 1, 4, file)!=4)while(1);
    if(FSfclose(file)!=0)while(1);
}

【问题讨论】:

  • sprintf() 真的相关吗?不就是说你的编译器不支持在写了一些非声明语句后在函数中间声明变量吗?
  • unsigned char textresult[]; sprintf(textresult, "%c%c", txt, text); 未定义的行为!!!因为textresult 没有分配!!
  • textresult 是一个空数组,你怎么能在一个空数组中写一些东西呢? txt 也是一个指针,%c 需要一个 char
  • PIC18 不是 8 位的吗?为什么在 8 位 MCU 上使用 sprintf?它不是 PC - 你只是炸毁了整个内存映射。如果您需要使用这样一个资源繁重的函数来复制 2 个字符串,而您甚至无法正确完成,那么这个项目就没有希望了。而是将其交给嵌入式系统程序员。

标签: c printf c89 c18


【解决方案1】:

sprintf(...) 移到您声明变量的位置之后。

【讨论】:

    【解决方案2】:

    我不知道ftc 做了什么,但你的txt 可能不是'\0'-终止的,如果 如果你想将它用作字符串,它必须是'\0'-终止的。

    另外你的textresult 是一个空数组,如果你期望会发生什么 尝试在没有可用空间的地方写东西?

    unsigned char textresult[20];
    

    应该是正确的。

    另请注意,printf 中的 %c 需要一个 char 值,您传递的是 指向整个chars 序列的指针,这是未定义的行为。你必须 要么使用%s(为此txt必须是'\0'-终止)或者你通过 txt[0],单char

    sprintf(textresult, "%c%c", txt[0], text); 
    
    // or
    
    unsigned char txt[]={ftc(result,0),ftc(result,1),0x2C,ftc(result,3), 0};
    ...
    sprintf(textresult, "%s%c", txt, text); 
    

    如果您的编译器希望所有变量都在 函数,移动

    FSFILE *file;
    

    sprintf 调用之前。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 2014-02-27
      • 2013-12-23
      • 1970-01-01
      • 2020-07-05
      • 2021-12-11
      • 2021-07-17
      相关资源
      最近更新 更多