我正在做一个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:对不起我的英语,这不是我的母语=)
答案 0 :(得分:0)
例程sprintf更大,因为它比打印更复杂(也更灵活)的例程。您可以通过更严格的打印语句使代码更小。不幸的是,在这种情况下没有免费的午餐。
答案 1 :(得分:0)
如果删除无关的格式,你可以真正减少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的回报。