【问题标题】:Sprintf takes more space than print?Sprintf 比打印占用更多空间?
【发布时间】:2014-05-13 14:36:51
【问题描述】:

我正在做一个 Arduino 草图,并试图获得一些空间。我在一些网站上看到使用sprintf 比使用print 更好。我试过了,但它占用了更多空间。

例如:

  char toWrite[18];
  sprintf(toWrite,"%d/%d/%d %d:%d:%d",RTC.now().day(),RTC.now().month(),RTC.now().year()-2000,RTC.now().hour(),RTC.now().minute(),RTC.now().second());
  tft.println(toWrite);

占用的空间多于:

  tft.print(RTC.now().day(), DEC);
  tft.print('/');
  tft.print(RTC.now().month(), DEC);
  tft.print('/');
  tft.print(RTC.now().year(), DEC);
  tft.print(' ');
  tft.print(RTC.now().hour(), DEC);
  tft.print(':');
  tft.print(RTC.now().minute(), DEC);
  tft.print(':');
  tft.println(RTC.now().second(), DEC);
  tft.println();

有人能解释一下为什么吗?

非常感谢!

PS : 对不起,我的英语不是我的母语 =)

【问题讨论】:

  • 空间是什么意思?屏幕上?记忆? exe大小?
  • 使用 C++ 流,确切地说是std::stringstreamsprintf 容易出现缓冲区溢出,printf 不够灵活。
  • 如果您指的是例行程序的空间,那么与打印相比,它会更大,因为它更复杂,并且会做一些聪明的事情来让您的生活更轻松。
  • @CaptainObvlious 我不相信 C++ STL 默认在 Arduino 上可用,你需要一个 separate library
  • 对不起,我的意思是内存大小

标签: c++ c arduino printf


【解决方案1】:

例程 sprintf 更大,因为它是一个比 print 更复杂(也更灵活)的例程。您可以通过更繁重的打印语句来使您的代码更小。不幸的是,在这种情况下没有免费的午餐。

【讨论】:

    【解决方案2】:

    如果您删除无关的格式,您可以真正减少 printf。
    这是一个替代 fprintf 的示例(printf 只是 fprintf,其中 1 作为第一个 arg)编译到 1/2kb,包括我的转换函数(如果删除更多,它可能会更小)

    void myfprintf_(int fd,int nargs, ...){ 
       va_list ap; va_start(ap, nargs); static char *s; const char *fmt; 
       fmt=va_arg(ap, char *); 
       int i=0,p; 
       char buf[80]; 
    while (fmt[i]){ 
       p=0; 
       while (fmt[i]!='%' && fmt[i]!=0) buf[p++]=fmt[i++]; 
       if (p != 0) write(fd,buf,p); 
       if (nargs-->0){ 
          switch (fmt[++i]) { 
          case 's': s=va_arg(ap, char *); break; 
          case 'd': s=dtos(va_arg(ap, int)); break; 
          case 'x': s=dtox(va_arg(ap, int),'a'); break; 
          case 'X': s=dtox(va_arg(ap, int),'A' ); break; 
          case 'f': s=ftos(va_arg(ap, double)); break; 
          case 'c': buf[0]=(va_arg(ap, int));buf[1]=0;s=buf;break; 
          case '%': s="%"; break; 
          default : s="";break; 
          } write(fd,s,strlen(s)); 
       } 
    i++; 
    } 
    va_end(ap); 
    }
    

    只需注释掉您不需要的格式并为您现有的转换函数进行修改 - 此外,如果您希望它更兼容,请将其设为 int 函数 vs void 并将 write 的返回值求和以作为返回值.. . 虽然 99% 的时间我都不使用 printf 的返回值。

    【讨论】:

      猜你喜欢
      • 2013-05-14
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      相关资源
      最近更新 更多