[英]Sprintf takes more space than print?
我正在做一个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:对不起,我的英语不是我的母语=)
例程sprintf较大,因为它是比print更复杂(和更灵活)的例程。 您可以通过使用更繁琐的打印语句来使代码更小。 不幸的是,在这种情况下没有免费的午餐。
如果删除多余的格式,则可以真正减少printf。
这是一个示例性的fprintf(printf只是fprintf,第一个arg为1),包括我的转换函数,它可以编译为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 vs void并求和返回值的写返回值...尽管99我不使用printf的回报的时间百分比。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.